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.
20 #define __STDC_LIMIT_MACROS
28 #include <cstdio> /* sprintf(3) ... grrr */
34 #include <glibmm/thread.h>
35 #include <glibmm/miscutils.h>
36 #include <glibmm/fileutils.h>
38 #include <boost/algorithm/string/erase.hpp>
40 #include "pbd/error.h"
41 #include "pbd/boost_debug.h"
42 #include "pbd/pathscanner.h"
43 #include "pbd/stl_delete.h"
44 #include "pbd/basename.h"
45 #include "pbd/stacktrace.h"
46 #include "pbd/file_utils.h"
47 #include "pbd/convert.h"
49 #include "ardour/amp.h"
50 #include "ardour/analyser.h"
51 #include "ardour/audio_buffer.h"
52 #include "ardour/audio_diskstream.h"
53 #include "ardour/audio_port.h"
54 #include "ardour/audio_track.h"
55 #include "ardour/audioengine.h"
56 #include "ardour/audiofilesource.h"
57 #include "ardour/audioplaylist.h"
58 #include "ardour/audioregion.h"
59 #include "ardour/auditioner.h"
60 #include "ardour/buffer_manager.h"
61 #include "ardour/buffer_set.h"
62 #include "ardour/bundle.h"
63 #include "ardour/butler.h"
64 #include "ardour/click.h"
65 #include "ardour/configuration.h"
66 #include "ardour/crossfade.h"
67 #include "ardour/cycle_timer.h"
68 #include "ardour/data_type.h"
69 #include "ardour/debug.h"
70 #include "ardour/filename_extensions.h"
71 #include "ardour/internal_send.h"
72 #include "ardour/io_processor.h"
73 #include "ardour/midi_diskstream.h"
74 #include "ardour/midi_playlist.h"
75 #include "ardour/midi_region.h"
76 #include "ardour/midi_track.h"
77 #include "ardour/midi_ui.h"
78 #include "ardour/named_selection.h"
79 #include "ardour/process_thread.h"
80 #include "ardour/playlist.h"
81 #include "ardour/plugin_insert.h"
82 #include "ardour/port_insert.h"
83 #include "ardour/processor.h"
84 #include "ardour/rc_configuration.h"
85 #include "ardour/recent_sessions.h"
86 #include "ardour/region_factory.h"
87 #include "ardour/return.h"
88 #include "ardour/route_group.h"
89 #include "ardour/send.h"
90 #include "ardour/session.h"
91 #include "ardour/session_directory.h"
92 #include "ardour/session_directory.h"
93 #include "ardour/session_metadata.h"
94 #include "ardour/session_playlists.h"
95 #include "ardour/slave.h"
96 #include "ardour/smf_source.h"
97 #include "ardour/source_factory.h"
98 #include "ardour/tape_file_matcher.h"
99 #include "ardour/tempo.h"
100 #include "ardour/utils.h"
101 #include "ardour/graph.h"
103 #include "midi++/port.h"
104 #include "midi++/mmc.h"
105 #include "midi++/manager.h"
110 using namespace ARDOUR;
112 using boost::shared_ptr;
113 using boost::weak_ptr;
115 bool Session::_disable_all_loaded_plugins = false;
117 PBD::Signal1<void,std::string> Session::Dialog;
118 PBD::Signal0<int> Session::AskAboutPendingState;
119 PBD::Signal2<int,nframes_t,nframes_t> Session::AskAboutSampleRateMismatch;
120 PBD::Signal0<void> Session::SendFeedback;
122 PBD::Signal0<void> Session::TimecodeOffsetChanged;
123 PBD::Signal0<void> Session::StartTimeChanged;
124 PBD::Signal0<void> Session::EndTimeChanged;
125 PBD::Signal0<void> Session::AutoBindingOn;
126 PBD::Signal0<void> Session::AutoBindingOff;
127 PBD::Signal2<void,std::string, std::string> Session::Exported;
128 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
130 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
131 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
133 Session::Session (AudioEngine &eng,
134 const string& fullpath,
135 const string& snapshot_name,
136 BusProfile* bus_profile,
140 _target_transport_speed (0.0),
141 _requested_return_frame (-1),
142 _session_dir (new SessionDirectory(fullpath)),
144 _butler (new Butler (*this)),
145 _post_transport_work (0),
146 _send_timecode_update (false),
147 route_graph (new Graph(*this)),
148 routes (new RouteList),
149 _total_free_4k_blocks (0),
150 _bundles (new BundleList),
151 _bundle_xml_node (0),
154 click_emphasis_data (0),
156 _metadata (new SessionMetadata()),
157 _have_rec_enabled_track (false),
158 _suspend_timecode_transmission (0)
160 playlists.reset (new SessionPlaylists);
162 interpolation.add_channel_to (0, 0);
164 if (!eng.connected()) {
165 throw failed_constructor();
168 n_physical_outputs = _engine.n_physical_outputs ();
169 n_physical_inputs = _engine.n_physical_inputs ();
171 first_stage_init (fullpath, snapshot_name);
173 _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
176 if (create (mix_template, bus_profile)) {
178 throw failed_constructor ();
182 if (second_stage_init ()) {
184 throw failed_constructor ();
187 store_recent_sessions(_name, _path);
189 bool was_dirty = dirty();
191 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
193 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
194 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
197 DirtyChanged (); /* EMIT SIGNAL */
211 vector<void*> debug_pointers;
213 /* if we got to here, leaving pending capture state around
217 remove_pending_capture_state ();
219 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
221 _engine.remove_session ();
223 /* clear history so that no references to objects are held any more */
227 /* clear state tree so that no references to objects are held any more */
231 /* remove all stubfiles that might still be lurking */
233 cleanup_stubfiles ();
235 /* reset dynamic state version back to default */
237 Stateful::loading_state_version = 0;
239 _butler->drop_references ();
241 delete midi_control_ui;
243 if (click_data != default_click) {
244 delete [] click_data;
247 if (click_emphasis_data != default_click_emphasis) {
248 delete [] click_emphasis_data;
253 /* clear out any pending dead wood from RCU managed objects */
258 AudioDiskstream::free_working_buffers();
260 /* tell everyone who is still standing that we're about to die */
263 /* tell everyone to drop references and delete objects as we go */
265 DEBUG_TRACE (DEBUG::Destruction, "delete named selections\n");
266 named_selections.clear ();
268 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
269 RegionFactory::delete_all_regions ();
271 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
273 /* reset these three references to special routes before we do the usual route delete thing */
276 _master_out.reset ();
277 _monitor_out.reset ();
280 RCUWriter<RouteList> writer (routes);
281 boost::shared_ptr<RouteList> r = writer.get_copy ();
283 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
284 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
285 (*i)->drop_references ();
289 /* writer goes out of scope and updates master */
293 boost::shared_ptr<RouteList> r = routes.reader ();
295 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
296 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
297 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->path(), i->second.use_count()));
298 i->second->drop_references ();
303 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
304 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
309 Crossfade::set_buffer_size (0);
311 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
314 boost_debug_list_ptrs ();
316 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
320 Session::set_worst_io_latencies ()
322 _worst_output_latency = 0;
323 _worst_input_latency = 0;
325 if (!_engine.connected()) {
329 boost::shared_ptr<RouteList> r = routes.reader ();
331 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
332 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
333 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
338 Session::when_engine_running ()
340 string first_physical_output;
342 BootMessage (_("Set block size and sample rate"));
344 set_block_size (_engine.frames_per_cycle());
345 set_frame_rate (_engine.frame_rate());
347 BootMessage (_("Using configuration"));
349 boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
350 boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
352 Config->map_parameters (ff);
353 config.map_parameters (ft);
355 /* every time we reconnect, recompute worst case output latencies */
357 _engine.Running.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies, this));
359 if (synced_to_jack()) {
360 _engine.transport_stop ();
363 if (config.get_jack_time_master()) {
364 _engine.transport_locate (_transport_frame);
372 _click_io.reset (new ClickIO (*this, "click"));
374 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
376 /* existing state for Click */
379 if (Stateful::loading_state_version < 3000) {
380 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
382 c = _click_io->set_state (*child->children().front(), Stateful::loading_state_version);
387 _clicking = Config->get_clicking ();
391 error << _("could not setup Click I/O") << endmsg;
398 /* default state for Click: dual-mono to first 2 physical outputs */
401 _engine.get_physical_outputs (DataType::AUDIO, outs);
403 for (uint32_t physport = 0; physport < 2; ++physport) {
404 if (outs.size() > physport) {
405 if (_click_io->add_port (outs[physport], this)) {
406 // relax, even though its an error
411 if (_click_io->n_ports () > ChanCount::ZERO) {
412 _clicking = Config->get_clicking ();
417 catch (failed_constructor& err) {
418 error << _("cannot setup Click I/O") << endmsg;
421 BootMessage (_("Compute I/O Latencies"));
423 set_worst_io_latencies ();
426 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
429 BootMessage (_("Set up standard connections"));
431 vector<string> inputs[DataType::num_types];
432 vector<string> outputs[DataType::num_types];
433 for (uint32_t i = 0; i < DataType::num_types; ++i) {
434 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
435 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
438 /* Create a set of Bundle objects that map
439 to the physical I/O currently available. We create both
440 mono and stereo bundles, so that the common cases of mono
441 and stereo tracks get bundles to put in their mixer strip
442 in / out menus. There may be a nicer way of achieving that;
443 it doesn't really scale that well to higher channel counts
446 /* mono output bundles */
448 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
450 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
452 shared_ptr<Bundle> c (new Bundle (buf, true));
453 c->add_channel (_("mono"), DataType::AUDIO);
454 c->set_port (0, outputs[DataType::AUDIO][np]);
459 /* stereo output bundles */
461 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
462 if (np + 1 < outputs[DataType::AUDIO].size()) {
464 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
465 shared_ptr<Bundle> c (new Bundle (buf, true));
466 c->add_channel (_("L"), DataType::AUDIO);
467 c->set_port (0, outputs[DataType::AUDIO][np]);
468 c->add_channel (_("R"), DataType::AUDIO);
469 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
475 /* mono input bundles */
477 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
479 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
481 shared_ptr<Bundle> c (new Bundle (buf, false));
482 c->add_channel (_("mono"), DataType::AUDIO);
483 c->set_port (0, inputs[DataType::AUDIO][np]);
488 /* stereo input bundles */
490 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
491 if (np + 1 < inputs[DataType::AUDIO].size()) {
493 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
495 shared_ptr<Bundle> c (new Bundle (buf, false));
496 c->add_channel (_("L"), DataType::AUDIO);
497 c->set_port (0, inputs[DataType::AUDIO][np]);
498 c->add_channel (_("R"), DataType::AUDIO);
499 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
505 /* MIDI input bundles */
507 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
508 string n = inputs[DataType::MIDI][np];
509 boost::erase_first (n, X_("alsa_pcm:"));
511 shared_ptr<Bundle> c (new Bundle (n, false));
512 c->add_channel ("", DataType::MIDI);
513 c->set_port (0, inputs[DataType::MIDI][np]);
517 /* MIDI output bundles */
519 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
520 string n = outputs[DataType::MIDI][np];
521 boost::erase_first (n, X_("alsa_pcm:"));
523 shared_ptr<Bundle> c (new Bundle (n, true));
524 c->add_channel ("", DataType::MIDI);
525 c->set_port (0, outputs[DataType::MIDI][np]);
529 BootMessage (_("Setup signal flow and plugins"));
533 if (_is_new && !no_auto_connect()) {
535 /* don't connect the master bus outputs if there is a monitor bus */
537 if (_master_out && Config->get_auto_connect_standard_busses() && !_monitor_out) {
539 /* if requested auto-connect the outputs to the first N physical ports.
542 uint32_t limit = _master_out->n_outputs().n_total();
544 for (uint32_t n = 0; n < limit; ++n) {
545 Port* p = _master_out->output()->nth (n);
547 if (outputs[p->type()].size() > n) {
548 connect_to = outputs[p->type()][n];
551 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
552 if (_master_out->output()->connect (p, connect_to, this)) {
553 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
563 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
564 are undefined, at best.
567 /* control out listens to master bus (but ignores it
568 under some conditions)
571 uint32_t limit = _monitor_out->n_inputs().n_audio();
574 for (uint32_t n = 0; n < limit; ++n) {
575 AudioPort* p = _monitor_out->input()->ports().nth_audio_port (n);
576 AudioPort* o = _master_out->output()->ports().nth_audio_port (n);
579 string connect_to = o->name();
580 if (_monitor_out->input()->connect (p, connect_to, this)) {
581 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
589 /* if control out is not connected, connect control out to physical outs
592 if (!_monitor_out->output()->connected ()) {
594 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
596 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
599 _monitor_out->output()->connect_ports_to_bundle (b, this);
601 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
602 Config->get_monitor_bus_preferred_bundle())
608 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
609 uint32_t mod = n_physical_outputs.get (*t);
610 uint32_t limit = _monitor_out->n_outputs().get(*t);
612 for (uint32_t n = 0; n < limit; ++n) {
614 Port* p = _monitor_out->output()->ports().port(*t, n);
616 if (outputs[*t].size() > (n % mod)) {
617 connect_to = outputs[*t][n % mod];
620 if (!connect_to.empty()) {
621 if (_monitor_out->output()->connect (p, connect_to, this)) {
622 error << string_compose (
623 _("cannot connect control output %1 to %2"),
636 /* catch up on send+insert cnts */
638 _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
640 /* hook us up to the engine */
642 BootMessage (_("Connect to engine"));
644 _engine.set_session (this);
648 Session::hookup_io ()
650 /* stop graph reordering notifications from
651 causing resorts, etc.
654 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
659 /* we delay creating the auditioner till now because
660 it makes its own connections to ports.
664 Auditioner* a = new Auditioner (*this);
667 throw failed_constructor();
669 a->use_new_diskstream ();
670 auditioner.reset (a);
673 catch (failed_constructor& err) {
674 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
678 /* load bundles, which we may have postponed earlier on */
679 if (_bundle_xml_node) {
680 load_bundles (*_bundle_xml_node);
681 delete _bundle_xml_node;
684 /* Tell all IO objects to connect themselves together */
686 IO::enable_connecting ();
687 MIDI::Port::MakeConnections ();
689 /* Now reset all panners */
691 Delivery::reset_panners ();
693 /* Connect tracks to monitor/listen bus if there is one.
694 Note that in an existing session, the internal sends will
695 already exist, but we want the routes to notice that
696 they connect to the control out specifically.
700 boost::shared_ptr<RouteList> r = routes.reader ();
701 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
703 if ((*x)->is_monitor()) {
707 } else if ((*x)->is_master()) {
713 (*x)->listen_via (_monitor_out,
714 (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader),
720 /* Anyone who cares about input state, wake up and do something */
722 IOConnectionsComplete (); /* EMIT SIGNAL */
724 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
726 /* now handle the whole enchilada as if it was one
732 /* update the full solo state, which can't be
733 correctly determined on a per-route basis, but
734 needs the global overview that only the session
738 update_route_solo_state ();
742 Session::playlist_length_changed ()
744 update_session_range_location_marker ();
748 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
750 boost::shared_ptr<Track> track = wp.lock ();
755 boost::shared_ptr<Playlist> playlist;
757 if ((playlist = track->playlist()) != 0) {
758 playlist->LengthChanged.connect_same_thread (*this, boost::bind (&Session::playlist_length_changed, this));
761 update_session_range_location_marker ();
765 Session::record_enabling_legal () const
767 /* this used to be in here, but survey says.... we don't need to restrict it */
768 // if (record_status() == Recording) {
772 if (Config->get_all_safe()) {
779 Session::reset_input_monitor_state ()
781 if (transport_rolling()) {
783 boost::shared_ptr<RouteList> rl = routes.reader ();
784 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
785 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
786 if (tr && tr->record_enabled ()) {
787 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
788 tr->monitor_input (Config->get_monitoring_model() == HardwareMonitoring && !config.get_auto_input());
794 boost::shared_ptr<RouteList> rl = routes.reader ();
795 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
796 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
797 if (tr && tr->record_enabled ()) {
798 //cerr << "switching to input = " << !Config->get_auto_input() << __FILE__ << __LINE__ << endl << endl;
799 tr->monitor_input (Config->get_monitoring_model() == HardwareMonitoring);
806 Session::auto_punch_start_changed (Location* location)
808 replace_event (SessionEvent::PunchIn, location->start());
810 if (get_record_enabled() && config.get_punch_in()) {
811 /* capture start has been changed, so save new pending state */
812 save_state ("", true);
817 Session::auto_punch_end_changed (Location* location)
819 nframes_t when_to_stop = location->end();
820 // when_to_stop += _worst_output_latency + _worst_input_latency;
821 replace_event (SessionEvent::PunchOut, when_to_stop);
825 Session::auto_punch_changed (Location* location)
827 nframes_t when_to_stop = location->end();
829 replace_event (SessionEvent::PunchIn, location->start());
830 //when_to_stop += _worst_output_latency + _worst_input_latency;
831 replace_event (SessionEvent::PunchOut, when_to_stop);
835 Session::auto_loop_changed (Location* location)
837 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
839 if (transport_rolling() && play_loop) {
842 // if (_transport_frame > location->end()) {
844 if (_transport_frame < location->start() || _transport_frame > location->end()) {
845 // relocate to beginning of loop
846 clear_events (SessionEvent::LocateRoll);
848 request_locate (location->start(), true);
851 else if (Config->get_seamless_loop() && !loop_changing) {
853 // schedule a locate-roll to refill the diskstreams at the
855 loop_changing = true;
857 if (location->end() > last_loopend) {
858 clear_events (SessionEvent::LocateRoll);
859 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
866 last_loopend = location->end();
870 Session::set_auto_punch_location (Location* location)
874 if ((existing = _locations.auto_punch_location()) != 0 && existing != location) {
875 punch_connections.drop_connections();
876 existing->set_auto_punch (false, this);
877 remove_event (existing->start(), SessionEvent::PunchIn);
878 clear_events (SessionEvent::PunchOut);
879 auto_punch_location_changed (0);
888 if (location->end() <= location->start()) {
889 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
893 punch_connections.drop_connections ();
895 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
896 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
897 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
899 location->set_auto_punch (true, this);
901 auto_punch_changed (location);
903 auto_punch_location_changed (location);
907 Session::set_auto_loop_location (Location* location)
911 if ((existing = _locations.auto_loop_location()) != 0 && existing != location) {
912 loop_connections.drop_connections ();
913 existing->set_auto_loop (false, this);
914 remove_event (existing->end(), SessionEvent::AutoLoop);
915 auto_loop_location_changed (0);
924 if (location->end() <= location->start()) {
925 error << _("Session: you can't use a mark for auto loop") << endmsg;
929 last_loopend = location->end();
931 loop_connections.drop_connections ();
933 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
934 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
935 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
937 location->set_auto_loop (true, this);
939 /* take care of our stuff first */
941 auto_loop_changed (location);
943 /* now tell everyone else */
945 auto_loop_location_changed (location);
949 Session::locations_added (Location *)
955 Session::locations_changed ()
957 _locations.apply (*this, &Session::handle_locations_changed);
961 Session::handle_locations_changed (Locations::LocationList& locations)
963 Locations::LocationList::iterator i;
965 bool set_loop = false;
966 bool set_punch = false;
968 for (i = locations.begin(); i != locations.end(); ++i) {
972 if (location->is_auto_punch()) {
973 set_auto_punch_location (location);
976 if (location->is_auto_loop()) {
977 set_auto_loop_location (location);
981 if (location->is_session_range()) {
982 _session_range_location = location;
987 set_auto_loop_location (0);
990 set_auto_punch_location (0);
997 Session::enable_record ()
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()) {
1013 boost::shared_ptr<RouteList> rl = routes.reader ();
1014 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1015 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1016 if (tr && tr->record_enabled ()) {
1017 tr->monitor_input (true);
1022 RecordStateChanged ();
1029 Session::disable_record (bool rt_context, bool force)
1033 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1035 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1036 g_atomic_int_set (&_record_status, Disabled);
1037 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1039 if (rs == Recording) {
1040 g_atomic_int_set (&_record_status, Enabled);
1044 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1046 boost::shared_ptr<RouteList> rl = routes.reader ();
1047 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1048 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1049 if (tr && tr->record_enabled ()) {
1050 tr->monitor_input (false);
1055 RecordStateChanged (); /* emit signal */
1058 remove_pending_capture_state ();
1064 Session::step_back_from_record ()
1066 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1068 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1069 boost::shared_ptr<RouteList> rl = routes.reader ();
1070 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1071 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1072 if (tr && tr->record_enabled ()) {
1073 //cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl;
1074 tr->monitor_input (false);
1082 Session::maybe_enable_record ()
1084 if (_step_editors > 0) {
1088 g_atomic_int_set (&_record_status, Enabled);
1090 /* this function is currently called from somewhere other than an RT thread.
1091 this save_state() call therefore doesn't impact anything.
1094 save_state ("", true);
1096 if (_transport_speed) {
1097 if (!config.get_punch_in()) {
1101 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1102 RecordStateChanged (); /* EMIT SIGNAL */
1109 Session::audible_frame () const
1115 /* the first of these two possible settings for "offset"
1116 mean that the audible frame is stationary until
1117 audio emerges from the latency compensation
1120 the second means that the audible frame is stationary
1121 until audio would emerge from a physical port
1122 in the absence of any plugin latency compensation
1125 offset = _worst_output_latency;
1127 if (offset > current_block_size) {
1128 offset -= current_block_size;
1130 /* XXX is this correct? if we have no external
1131 physical connections and everything is internal
1132 then surely this is zero? still, how
1133 likely is that anyway?
1135 offset = current_block_size;
1138 if (synced_to_jack()) {
1139 tf = _engine.transport_frame();
1141 tf = _transport_frame;
1146 if (!non_realtime_work_pending()) {
1150 /* Check to see if we have passed the first guaranteed
1151 audible frame past our last start position. if not,
1152 return that last start point because in terms
1153 of audible frames, we have not moved yet.
1155 `Start position' in this context means the time we last
1156 either started or changed transport direction.
1159 if (_transport_speed > 0.0f) {
1161 if (!play_loop || !have_looped) {
1162 if (tf < _last_roll_or_reversal_location + offset) {
1163 return _last_roll_or_reversal_location;
1171 } else if (_transport_speed < 0.0f) {
1173 /* XXX wot? no backward looping? */
1175 if (tf > _last_roll_or_reversal_location - offset) {
1176 return _last_roll_or_reversal_location;
1188 Session::set_frame_rate (nframes_t frames_per_second)
1190 /** \fn void Session::set_frame_size(nframes_t)
1191 the AudioEngine object that calls this guarantees
1192 that it will not be called while we are also in
1193 ::process(). Its fine to do things that block
1197 _base_frame_rate = frames_per_second;
1201 Automatable::set_automation_interval ((jack_nframes_t) ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1205 // XXX we need some equivalent to this, somehow
1206 // SndFileSource::setup_standard_crossfades (frames_per_second);
1210 /* XXX need to reset/reinstantiate all LADSPA plugins */
1214 Session::set_block_size (nframes_t nframes)
1216 /* the AudioEngine guarantees
1217 that it will not be called while we are also in
1218 ::process(). It is therefore fine to do things that block
1223 current_block_size = nframes;
1227 boost::shared_ptr<RouteList> r = routes.reader ();
1229 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1230 (*i)->set_block_size (nframes);
1233 boost::shared_ptr<RouteList> rl = routes.reader ();
1234 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1235 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1237 tr->set_block_size (nframes);
1241 set_worst_io_latencies ();
1246 Session::set_default_fade (float /*steepness*/, float /*fade_msecs*/)
1249 nframes_t fade_frames;
1251 /* Don't allow fade of less 1 frame */
1253 if (fade_msecs < (1000.0 * (1.0/_current_frame_rate))) {
1260 fade_frames = (nframes_t) floor (fade_msecs * _current_frame_rate * 0.001);
1264 default_fade_msecs = fade_msecs;
1265 default_fade_steepness = steepness;
1268 // jlc, WTF is this!
1269 Glib::RWLock::ReaderLock lm (route_lock);
1270 AudioRegion::set_default_fade (steepness, fade_frames);
1275 /* XXX have to do this at some point */
1276 /* foreach region using default fade, reset, then
1277 refill_all_diskstream_buffers ();
1282 struct RouteSorter {
1283 bool operator() (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> r2) {
1284 if (r2->feeds (r1)) {
1286 } else if (r1->feeds (r2)) {
1289 if (r1->not_fed ()) {
1290 if (r2->not_fed ()) {
1291 /* no ardour-based connections inbound to either route. just use signal order */
1292 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1294 /* r2 has connections, r1 does not; run r1 early */
1298 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1305 trace_terminal (shared_ptr<Route> r1, shared_ptr<Route> rbase)
1307 shared_ptr<Route> r2;
1309 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1310 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1314 /* make a copy of the existing list of routes that feed r1 */
1316 Route::FedBy existing (r1->fed_by());
1318 /* for each route that feeds r1, recurse, marking it as feeding
1322 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1323 if (!(r2 = i->r.lock ())) {
1324 /* (*i) went away, ignore it */
1328 /* r2 is a route that feeds r1 which somehow feeds base. mark
1329 base as being fed by r2
1332 rbase->add_fed_by (r2, i->sends_only);
1336 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1340 if (r1->feeds (r2) && r2->feeds (r1)) {
1344 /* now recurse, so that we can mark base as being fed by
1345 all routes that feed r2
1348 trace_terminal (r2, rbase);
1355 Session::resort_routes ()
1357 /* don't do anything here with signals emitted
1358 by Routes while we are being destroyed.
1361 if (_state_of_the_state & Deletion) {
1366 RCUWriter<RouteList> writer (routes);
1367 shared_ptr<RouteList> r = writer.get_copy ();
1368 resort_routes_using (r);
1369 /* writer goes out of scope and forces update */
1372 //route_graph->dump(1);
1375 boost::shared_ptr<RouteList> rl = routes.reader ();
1376 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1377 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1379 const Route::FedBy& fb ((*i)->fed_by());
1381 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1382 boost::shared_ptr<Route> sf = f->r.lock();
1384 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1392 Session::resort_routes_using (shared_ptr<RouteList> r)
1394 RouteList::iterator i, j;
1396 for (i = r->begin(); i != r->end(); ++i) {
1398 (*i)->clear_fed_by ();
1400 for (j = r->begin(); j != r->end(); ++j) {
1402 /* although routes can feed themselves, it will
1403 cause an endless recursive descent if we
1404 detect it. so don't bother checking for
1412 bool via_sends_only;
1414 if ((*j)->direct_feeds (*i, &via_sends_only)) {
1415 (*i)->add_fed_by (*j, via_sends_only);
1420 for (i = r->begin(); i != r->end(); ++i) {
1421 trace_terminal (*i, *i);
1427 route_graph->rechain (r);
1430 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1431 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1432 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1433 (*i)->name(), (*i)->order_key ("signal")));
1439 /** Find the route name starting with \a base with the lowest \a id.
1441 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1442 * The available route name with the lowest ID will be used, and \a id
1443 * will be set to the ID.
1445 * \return false if a route name could not be found, and \a track_name
1446 * and \a id do not reflect a free route name.
1449 Session::find_route_name (const char* base, uint32_t& id, char* name, size_t name_len)
1452 snprintf (name, name_len, "%s %" PRIu32, base, id);
1454 if (route_by_name (name) == 0) {
1460 } while (id < (UINT_MAX-1));
1466 Session::count_existing_route_channels (ChanCount& in, ChanCount& out)
1468 in = ChanCount::ZERO;
1469 out = ChanCount::ZERO;
1470 shared_ptr<RouteList> r = routes.reader ();
1471 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1472 if (!(*i)->is_hidden()) {
1473 in += (*i)->n_inputs();
1474 out += (*i)->n_outputs();
1479 list<boost::shared_ptr<MidiTrack> >
1480 Session::new_midi_track (TrackMode mode, RouteGroup* route_group, uint32_t how_many)
1482 char track_name[32];
1483 uint32_t track_id = 0;
1484 ChanCount existing_inputs;
1485 ChanCount existing_outputs;
1487 RouteList new_routes;
1488 list<boost::shared_ptr<MidiTrack> > ret;
1489 uint32_t control_id;
1491 count_existing_route_channels (existing_inputs, existing_outputs);
1493 control_id = ntracks() + nbusses();
1496 if (!find_route_name ("Midi", ++track_id, track_name, sizeof(track_name))) {
1497 error << "cannot find name for new midi track" << endmsg;
1501 shared_ptr<MidiTrack> track;
1504 MidiTrack* mt = new MidiTrack (*this, track_name, Route::Flag (0), mode);
1511 mt->use_new_diskstream();
1513 boost_debug_shared_ptr_mark_interesting (mt, "Track");
1514 track = boost::shared_ptr<MidiTrack>(mt);
1516 if (track->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1517 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1522 if (track->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1523 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1527 auto_connect_route (track, existing_inputs, existing_outputs);
1529 track->non_realtime_input_change();
1532 route_group->add (track);
1535 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1536 track->set_remote_control_id (control_id);
1538 new_routes.push_back (track);
1539 ret.push_back (track);
1542 catch (failed_constructor &err) {
1543 error << _("Session: could not create new midi track.") << endmsg;
1547 catch (AudioEngine::PortRegistrationFailure& pfe) {
1549 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;
1557 if (!new_routes.empty()) {
1558 add_routes (new_routes, false);
1559 save_state (_current_snapshot_name);
1565 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs */
1567 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs, bool connect_inputs)
1569 /* If both inputs and outputs are auto-connected to physical ports,
1570 use the max of input and output offsets to ensure auto-connected
1571 port numbers always match up (e.g. the first audio input and the
1572 first audio output of the route will have the same physical
1573 port number). Otherwise just use the lowest input or output
1577 const bool in_out_physical =
1578 (Config->get_input_auto_connect() & AutoConnectPhysical)
1579 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1582 const ChanCount in_offset = in_out_physical
1583 ? ChanCount::max(existing_inputs, existing_outputs)
1586 const ChanCount out_offset = in_out_physical
1587 ? ChanCount::max(existing_inputs, existing_outputs)
1590 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1591 vector<string> physinputs;
1592 vector<string> physoutputs;
1594 _engine.get_physical_outputs (*t, physoutputs);
1595 _engine.get_physical_inputs (*t, physinputs);
1597 if (!physinputs.empty() && connect_inputs) {
1598 uint32_t nphysical_in = physinputs.size();
1599 for (uint32_t i = 0; i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1602 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1603 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1606 if (!port.empty() && route->input()->connect (
1607 route->input()->ports().port(*t, i), port, this)) {
1613 if (!physoutputs.empty()) {
1614 uint32_t nphysical_out = physoutputs.size();
1615 for (uint32_t i = 0; i < route->n_outputs().get(*t); ++i) {
1618 if (Config->get_output_auto_connect() & AutoConnectPhysical) {
1619 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1620 } else if (Config->get_output_auto_connect() & AutoConnectMaster) {
1621 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1622 port = _master_out->input()->ports().port(*t,
1623 i % _master_out->input()->n_ports().get(*t))->name();
1627 if (!port.empty() && route->output()->connect (
1628 route->output()->ports().port(*t, i), port, this)) {
1635 existing_inputs += route->n_inputs();
1636 existing_outputs += route->n_outputs();
1639 list< boost::shared_ptr<AudioTrack> >
1640 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group, uint32_t how_many)
1642 char track_name[32];
1643 uint32_t track_id = 0;
1644 ChanCount existing_inputs;
1645 ChanCount existing_outputs;
1647 RouteList new_routes;
1648 list<boost::shared_ptr<AudioTrack> > ret;
1649 uint32_t control_id;
1651 count_existing_route_channels (existing_inputs, existing_outputs);
1653 control_id = ntracks() + nbusses() + 1;
1656 if (!find_route_name ("Audio", ++track_id, track_name, sizeof(track_name))) {
1657 error << "cannot find name for new audio track" << endmsg;
1661 shared_ptr<AudioTrack> track;
1664 AudioTrack* at = new AudioTrack (*this, track_name, Route::Flag (0), mode);
1671 at->use_new_diskstream();
1673 boost_debug_shared_ptr_mark_interesting (at, "Track");
1674 track = boost::shared_ptr<AudioTrack>(at);
1676 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1677 error << string_compose (
1678 _("cannot configure %1 in/%2 out configuration for new audio track"),
1679 input_channels, output_channels)
1684 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1685 error << string_compose (
1686 _("cannot configure %1 in/%2 out configuration for new audio track"),
1687 input_channels, output_channels)
1692 auto_connect_route (track, existing_inputs, existing_outputs);
1695 route_group->add (track);
1698 track->non_realtime_input_change();
1700 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1701 track->set_remote_control_id (control_id);
1704 new_routes.push_back (track);
1705 ret.push_back (track);
1708 catch (failed_constructor &err) {
1709 error << _("Session: could not create new audio track.") << endmsg;
1713 catch (AudioEngine::PortRegistrationFailure& pfe) {
1715 error << pfe.what() << endmsg;
1723 if (!new_routes.empty()) {
1724 add_routes (new_routes, true);
1731 Session::set_remote_control_ids ()
1733 RemoteModel m = Config->get_remote_model();
1734 bool emit_signal = false;
1736 shared_ptr<RouteList> r = routes.reader ();
1738 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1739 if (MixerOrdered == m) {
1740 int32_t order = (*i)->order_key(N_("signal"));
1741 (*i)->set_remote_control_id (order+1, false);
1743 } else if (EditorOrdered == m) {
1744 int32_t order = (*i)->order_key(N_("editor"));
1745 (*i)->set_remote_control_id (order+1, false);
1747 } else if (UserOrdered == m) {
1748 //do nothing ... only changes to remote id's are initiated by user
1753 Route::RemoteControlIDChange();
1759 Session::new_audio_route (bool aux, int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many)
1762 uint32_t bus_id = 0;
1763 ChanCount existing_inputs;
1764 ChanCount existing_outputs;
1767 uint32_t control_id;
1769 count_existing_route_channels (existing_inputs, existing_outputs);
1771 control_id = ntracks() + nbusses() + 1;
1774 if (!find_route_name ("Bus", ++bus_id, bus_name, sizeof(bus_name))) {
1775 error << "cannot find name for new audio bus" << endmsg;
1780 Route* rt = new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO);
1787 boost_debug_shared_ptr_mark_interesting (rt, "Route");
1788 shared_ptr<Route> bus (rt);
1790 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1791 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1792 input_channels, output_channels)
1798 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1799 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1800 input_channels, output_channels)
1805 auto_connect_route (bus, existing_inputs, existing_outputs, false);
1808 route_group->add (bus);
1810 bus->set_remote_control_id (control_id);
1814 bus->add_internal_return ();
1817 ret.push_back (bus);
1821 catch (failed_constructor &err) {
1822 error << _("Session: could not create new audio route.") << endmsg;
1826 catch (AudioEngine::PortRegistrationFailure& pfe) {
1827 error << pfe.what() << endmsg;
1837 add_routes (ret, true);
1845 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
1849 uint32_t control_id;
1851 uint32_t number = 0;
1853 if (!tree.read (template_path.c_str())) {
1857 XMLNode* node = tree.root();
1859 control_id = ntracks() + nbusses() + 1;
1863 XMLNode node_copy (*node); // make a copy so we can change the name if we need to
1865 std::string node_name = IO::name_from_state (*node_copy.children().front());
1867 /* generate a new name by adding a number to the end of the template name */
1868 if (!find_route_name (node_name.c_str(), ++number, name, sizeof(name))) {
1869 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
1873 /* set IO children to use the new name */
1874 XMLNodeList const & children = node_copy.children ();
1875 for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
1876 if ((*i)->name() == IO::state_node_name) {
1877 IO::set_name_in_state (**i, name);
1881 Track::zero_diskstream_id_in_xml (node_copy);
1884 shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
1887 error << _("Session: cannot create track/bus from template description") << endmsg;
1891 if (boost::dynamic_pointer_cast<Track>(route)) {
1892 /* force input/output change signals so that the new diskstream
1893 picks up the configuration of the route. During session
1894 loading this normally happens in a different way.
1896 route->input()->changed (IOChange (ConfigurationChanged|ConnectionsChanged), this);
1897 route->output()->changed (IOChange (ConfigurationChanged|ConnectionsChanged), this);
1900 route->set_remote_control_id (control_id);
1903 ret.push_back (route);
1906 catch (failed_constructor &err) {
1907 error << _("Session: could not create new route from template") << endmsg;
1911 catch (AudioEngine::PortRegistrationFailure& pfe) {
1912 error << pfe.what() << endmsg;
1921 add_routes (ret, true);
1928 Session::add_routes (RouteList& new_routes, bool save)
1931 RCUWriter<RouteList> writer (routes);
1932 shared_ptr<RouteList> r = writer.get_copy ();
1933 r->insert (r->end(), new_routes.begin(), new_routes.end());
1936 /* if there is no control out and we're not in the middle of loading,
1937 resort the graph here. if there is a control out, we will resort
1938 toward the end of this method. if we are in the middle of loading,
1939 we will resort when done.
1942 if (!_monitor_out && IO::connecting_legal) {
1943 resort_routes_using (r);
1947 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
1949 boost::weak_ptr<Route> wpr (*x);
1950 boost::shared_ptr<Route> r (*x);
1952 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
1953 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
1954 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
1955 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
1956 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
1957 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
1958 r->order_key_changed.connect_same_thread (*this, boost::bind (&Session::route_order_key_changed, this));
1960 if (r->is_master()) {
1964 if (r->is_monitor()) {
1968 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
1970 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
1971 track_playlist_changed (boost::weak_ptr<Track> (tr));
1972 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
1974 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
1976 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
1981 if (_monitor_out && IO::connecting_legal) {
1983 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
1984 if ((*x)->is_monitor()) {
1986 } else if ((*x)->is_master()) {
1989 (*x)->listen_via (_monitor_out,
1990 (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader),
2001 save_state (_current_snapshot_name);
2004 RouteAdded (new_routes); /* EMIT SIGNAL */
2005 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
2009 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2011 boost::shared_ptr<RouteList> r = routes.reader ();
2012 boost::shared_ptr<Send> s;
2016 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2017 if (boost::dynamic_pointer_cast<Track>(*i)) {
2018 if ((s = (*i)->internal_send_for (dest)) != 0) {
2019 s->amp()->gain_control()->set_value (0.0);
2026 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2028 boost::shared_ptr<RouteList> r = routes.reader ();
2029 boost::shared_ptr<Send> s;
2033 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2034 if (boost::dynamic_pointer_cast<Track>(*i)) {
2035 if ((s = (*i)->internal_send_for (dest)) != 0) {
2036 s->amp()->gain_control()->set_value (1.0);
2043 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2045 boost::shared_ptr<RouteList> r = routes.reader ();
2046 boost::shared_ptr<Send> s;
2050 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2051 if (boost::dynamic_pointer_cast<Track>(*i)) {
2052 if ((s = (*i)->internal_send_for (dest)) != 0) {
2053 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2060 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p)
2062 boost::shared_ptr<RouteList> r = routes.reader ();
2063 boost::shared_ptr<RouteList> t (new RouteList);
2065 /* only send tracks */
2067 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2068 if (boost::dynamic_pointer_cast<Track>(*i)) {
2073 add_internal_sends (dest, p, t);
2077 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2079 if (dest->is_monitor() || dest->is_master()) {
2083 if (!dest->internal_return()) {
2084 dest->add_internal_return();
2087 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2089 if ((*i)->is_monitor() || (*i)->is_master() || (*i) == dest) {
2093 (*i)->listen_via (dest, p, true, true);
2100 Session::remove_route (shared_ptr<Route> route)
2102 if (((route == _master_out) || (route == _monitor_out)) && !Config->get_allow_special_bus_removal()) {
2107 RCUWriter<RouteList> writer (routes);
2108 shared_ptr<RouteList> rs = writer.get_copy ();
2112 /* deleting the master out seems like a dumb
2113 idea, but its more of a UI policy issue
2117 if (route == _master_out) {
2118 _master_out = shared_ptr<Route> ();
2121 if (route == _monitor_out) {
2123 /* cancel control outs for all routes */
2125 for (RouteList::iterator r = rs->begin(); r != rs->end(); ++r) {
2126 (*r)->drop_listen (_monitor_out);
2129 _monitor_out.reset ();
2132 /* writer goes out of scope, forces route list update */
2135 update_route_solo_state ();
2136 update_session_range_location_marker ();
2138 // We need to disconnect the route's inputs and outputs
2140 route->input()->disconnect (0);
2141 route->output()->disconnect (0);
2143 /* if the route had internal sends sending to it, remove them */
2144 if (route->internal_return()) {
2146 boost::shared_ptr<RouteList> r = routes.reader ();
2147 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2148 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2150 (*i)->remove_processor (s);
2155 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2156 if (mt && mt->step_editing()) {
2157 if (_step_editors > 0) {
2162 update_latency_compensation (false, false);
2165 /* Re-sort routes to remove the graph's current references to the one that is
2166 * going away, then flush old references out of the graph.
2170 route_graph->clear_other_chain ();
2172 /* get rid of it from the dead wood collection in the route list manager */
2174 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2178 /* try to cause everyone to drop their references */
2180 route->drop_references ();
2182 sync_order_keys (N_("session"));
2184 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2186 /* save the new state of the world */
2188 if (save_state (_current_snapshot_name)) {
2189 save_history (_current_snapshot_name);
2194 Session::route_mute_changed (void* /*src*/)
2200 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2202 boost::shared_ptr<Route> route = wpr.lock();
2204 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2208 if (route->listening()) {
2210 if (Config->get_exclusive_solo()) {
2211 /* new listen: disable all other listen */
2212 shared_ptr<RouteList> r = routes.reader ();
2213 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2214 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2217 (*i)->set_listen (false, this);
2223 } else if (_listen_cnt > 0) {
2229 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2231 boost::shared_ptr<Route> route = wpr.lock ();
2234 /* should not happen */
2235 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2239 bool send_changed = false;
2241 if (route->solo_isolated()) {
2242 if (_solo_isolated_cnt == 0) {
2243 send_changed = true;
2245 _solo_isolated_cnt++;
2246 } else if (_solo_isolated_cnt > 0) {
2247 _solo_isolated_cnt--;
2248 if (_solo_isolated_cnt == 0) {
2249 send_changed = true;
2254 IsolatedChanged (); /* EMIT SIGNAL */
2259 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2261 if (!self_solo_change) {
2262 // session doesn't care about changes to soloed-by-others
2266 if (solo_update_disabled) {
2271 boost::shared_ptr<Route> route = wpr.lock ();
2274 /* should not happen */
2275 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2279 shared_ptr<RouteList> r = routes.reader ();
2282 if (route->self_soloed()) {
2288 if (delta == 1 && Config->get_exclusive_solo()) {
2289 /* new solo: disable all other solos */
2290 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2291 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2294 (*i)->set_solo (false, this);
2298 solo_update_disabled = true;
2300 RouteList uninvolved;
2302 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2303 bool via_sends_only;
2304 bool in_signal_flow;
2306 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2310 in_signal_flow = false;
2312 if ((*i)->feeds (route, &via_sends_only)) {
2313 if (!via_sends_only) {
2314 if (!route->soloed_by_others_upstream()) {
2315 (*i)->mod_solo_by_others_downstream (delta);
2317 in_signal_flow = true;
2321 if (route->feeds (*i, &via_sends_only)) {
2322 (*i)->mod_solo_by_others_upstream (delta);
2323 in_signal_flow = true;
2326 if (!in_signal_flow) {
2327 uninvolved.push_back (*i);
2331 solo_update_disabled = false;
2332 update_route_solo_state (r);
2334 /* now notify that the mute state of the routes not involved in the signal
2335 pathway of the just-solo-changed route may have altered.
2338 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2339 (*i)->mute_changed (this);
2342 SoloChanged (); /* EMIT SIGNAL */
2347 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2349 /* now figure out if anything that matters is soloed (or is "listening")*/
2351 bool something_soloed = false;
2352 uint32_t listeners = 0;
2353 uint32_t isolated = 0;
2356 r = routes.reader();
2359 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2360 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2361 something_soloed = true;
2364 if (!(*i)->is_hidden() && (*i)->listening()) {
2365 if (Config->get_solo_control_is_listen_control()) {
2368 (*i)->set_listen (false, this);
2372 if ((*i)->solo_isolated()) {
2377 if (something_soloed != _non_soloed_outs_muted) {
2378 _non_soloed_outs_muted = something_soloed;
2379 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2382 _listen_cnt = listeners;
2384 if (isolated != _solo_isolated_cnt) {
2385 _solo_isolated_cnt = isolated;
2386 IsolatedChanged (); /* EMIT SIGNAL */
2390 boost::shared_ptr<RouteList>
2391 Session::get_routes_with_internal_returns() const
2393 shared_ptr<RouteList> r = routes.reader ();
2394 boost::shared_ptr<RouteList> rl (new RouteList);
2396 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2397 if ((*i)->internal_return ()) {
2405 Session::io_name_is_legal (const std::string& name)
2407 shared_ptr<RouteList> r = routes.reader ();
2409 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2410 if ((*i)->name() == name) {
2414 if ((*i)->has_io_processor_named (name)) {
2423 Session::route_by_name (string name)
2425 shared_ptr<RouteList> r = routes.reader ();
2427 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2428 if ((*i)->name() == name) {
2433 return shared_ptr<Route> ((Route*) 0);
2437 Session::route_by_id (PBD::ID id)
2439 shared_ptr<RouteList> r = routes.reader ();
2441 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2442 if ((*i)->id() == id) {
2447 return shared_ptr<Route> ((Route*) 0);
2451 Session::route_by_remote_id (uint32_t id)
2453 shared_ptr<RouteList> r = routes.reader ();
2455 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2456 if ((*i)->remote_control_id() == id) {
2461 return shared_ptr<Route> ((Route*) 0);
2464 /** If either end of the session range location marker lies inside the current
2465 * session extent, move it to the corresponding session extent.
2468 Session::update_session_range_location_marker ()
2470 if (_state_of_the_state & Loading) {
2474 pair<nframes_t, nframes_t> const ext = get_extent ();
2476 if (_session_range_location == 0) {
2477 /* we don't have a session range yet; use this one (provided it is valid) */
2478 if (ext.first != max_frames) {
2479 add_session_range_location (ext.first, ext.second);
2482 /* update the existing session range */
2483 if (ext.first < _session_range_location->start()) {
2484 _session_range_location->set_start (ext.first);
2488 if (ext.second > _session_range_location->end()) {
2489 _session_range_location->set_end (ext.second);
2496 /** @return Extent of the session's contents; if the session is empty, the first value of
2497 * the pair will equal max_frames.
2499 pair<nframes_t, nframes_t>
2500 Session::get_extent () const
2502 pair<nframes_t, nframes_t> ext (max_frames, 0);
2504 boost::shared_ptr<RouteList> rl = routes.reader ();
2505 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2506 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2507 if (!tr || tr->destructive()) {
2508 // ignore tape tracks when getting extents
2512 pair<nframes_t, nframes_t> e = tr->playlist()->get_extent ();
2513 if (e.first < ext.first) {
2514 ext.first = e.first;
2516 if (e.second > ext.second) {
2517 ext.second = e.second;
2524 /* Region management */
2526 boost::shared_ptr<Region>
2527 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2529 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2530 RegionFactory::RegionMap::const_iterator i;
2531 boost::shared_ptr<Region> region;
2533 Glib::Mutex::Lock lm (region_lock);
2535 for (i = regions.begin(); i != regions.end(); ++i) {
2539 if (region->whole_file()) {
2541 if (child->source_equivalent (region)) {
2547 return boost::shared_ptr<Region> ();
2551 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2553 set<boost::shared_ptr<Region> > relevant_regions;
2555 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2556 RegionFactory::get_regions_using_source (*s, relevant_regions);
2559 cerr << "There are " << relevant_regions.size() << " using " << srcs.size() << " sources" << endl;
2561 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2562 set<boost::shared_ptr<Region> >::iterator tmp;
2567 cerr << "Cleanup " << (*r)->name() << " UC = " << (*r).use_count() << endl;
2569 playlists->destroy_region (*r);
2570 RegionFactory::map_remove (*r);
2572 (*r)->drop_sources ();
2573 (*r)->drop_references ();
2575 cerr << "\tdone UC = " << (*r).use_count() << endl;
2577 relevant_regions.erase (r);
2582 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2585 Glib::Mutex::Lock ls (source_lock);
2586 /* remove from the main source list */
2587 sources.erase ((*s)->id());
2590 (*s)->mark_for_remove ();
2591 (*s)->drop_references ();
2600 Session::remove_last_capture ()
2602 list<boost::shared_ptr<Source> > srcs;
2604 boost::shared_ptr<RouteList> rl = routes.reader ();
2605 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2606 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2611 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2614 srcs.insert (srcs.end(), l.begin(), l.end());
2619 destroy_sources (srcs);
2621 save_state (_current_snapshot_name);
2626 /* Source Management */
2629 Session::add_source (boost::shared_ptr<Source> source)
2631 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2632 pair<SourceMap::iterator,bool> result;
2634 entry.first = source->id();
2635 entry.second = source;
2638 Glib::Mutex::Lock lm (source_lock);
2639 result = sources.insert (entry);
2642 if (result.second) {
2644 /* yay, new source */
2648 boost::shared_ptr<AudioFileSource> afs;
2650 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2651 if (Config->get_auto_analyse_audio()) {
2652 Analyser::queue_source_for_analysis (source, false);
2659 Session::remove_source (boost::weak_ptr<Source> src)
2661 SourceMap::iterator i;
2662 boost::shared_ptr<Source> source = src.lock();
2669 Glib::Mutex::Lock lm (source_lock);
2671 if ((i = sources.find (source->id())) != sources.end()) {
2672 cerr << "Removing source " << source->name() << endl;
2677 if (!_state_of_the_state & InCleanup) {
2679 /* save state so we don't end up with a session file
2680 referring to non-existent sources.
2683 save_state (_current_snapshot_name);
2687 boost::shared_ptr<Source>
2688 Session::source_by_id (const PBD::ID& id)
2690 Glib::Mutex::Lock lm (source_lock);
2691 SourceMap::iterator i;
2692 boost::shared_ptr<Source> source;
2694 if ((i = sources.find (id)) != sources.end()) {
2701 boost::shared_ptr<Source>
2702 Session::source_by_path_and_channel (const Glib::ustring& path, uint16_t chn)
2704 Glib::Mutex::Lock lm (source_lock);
2706 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2707 boost::shared_ptr<AudioFileSource> afs
2708 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
2710 if (afs && afs->path() == path && chn == afs->channel()) {
2714 return boost::shared_ptr<Source>();
2719 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
2722 string old_basename = PBD::basename_nosuffix (oldname);
2723 string new_legalized = legalize_for_path (newname);
2725 /* note: we know (or assume) the old path is already valid */
2729 /* destructive file sources have a name of the form:
2731 /path/to/Tnnnn-NAME(%[LR])?.wav
2733 the task here is to replace NAME with the new name.
2738 string::size_type dash;
2740 dir = Glib::path_get_dirname (path);
2741 path = Glib::path_get_basename (path);
2743 /* '-' is not a legal character for the NAME part of the path */
2745 if ((dash = path.find_last_of ('-')) == string::npos) {
2749 prefix = path.substr (0, dash);
2753 path += new_legalized;
2754 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
2756 path = Glib::build_filename (dir, path);
2760 /* non-destructive file sources have a name of the form:
2762 /path/to/NAME-nnnnn(%[LR])?.ext
2764 the task here is to replace NAME with the new name.
2769 string::size_type dash;
2770 string::size_type postfix;
2772 dir = Glib::path_get_dirname (path);
2773 path = Glib::path_get_basename (path);
2775 /* '-' is not a legal character for the NAME part of the path */
2777 if ((dash = path.find_last_of ('-')) == string::npos) {
2781 suffix = path.substr (dash+1);
2783 // Suffix is now everything after the dash. Now we need to eliminate
2784 // the nnnnn part, which is done by either finding a '%' or a '.'
2786 postfix = suffix.find_last_of ("%");
2787 if (postfix == string::npos) {
2788 postfix = suffix.find_last_of ('.');
2791 if (postfix != string::npos) {
2792 suffix = suffix.substr (postfix);
2794 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
2798 const uint32_t limit = 10000;
2799 char buf[PATH_MAX+1];
2801 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
2803 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
2805 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
2806 path = Glib::build_filename (dir, buf);
2814 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
2823 /** Return the full path (in some session directory) for a new within-session source.
2824 * \a name must be a session-unique name that does not contain slashes
2825 * (e.g. as returned by new_*_source_name)
2828 Session::new_source_path_from_name (DataType type, const string& name, bool as_stub)
2830 assert(name.find("/") == string::npos);
2832 SessionDirectory sdir(get_best_session_directory_for_new_source());
2835 if (type == DataType::AUDIO) {
2836 p = (as_stub ? sdir.sound_stub_path() : sdir.sound_path());
2837 } else if (type == DataType::MIDI) {
2838 p = (as_stub ? sdir.midi_stub_path() : sdir.midi_path());
2840 error << "Unknown source type, unable to create file path" << endmsg;
2845 return p.to_string();
2849 Session::peak_path (Glib::ustring base) const
2851 sys::path peakfile_path(_session_dir->peak_path());
2852 peakfile_path /= basename_nosuffix (base) + peakfile_suffix;
2853 return peakfile_path.to_string();
2856 /** Return a unique name based on \a base for a new internal audio source */
2858 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
2861 char buf[PATH_MAX+1];
2862 const uint32_t limit = 10000;
2864 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
2867 legalized = legalize_for_path (base);
2869 // Find a "version" of the base name that doesn't exist in any of the possible directories.
2870 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
2872 vector<space_and_path>::iterator i;
2873 uint32_t existing = 0;
2875 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2880 snprintf (buf, sizeof(buf), "T%04d-%s%s",
2881 cnt, legalized.c_str(), ext.c_str());
2882 } else if (nchan == 2) {
2884 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
2885 cnt, legalized.c_str(), ext.c_str());
2887 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
2888 cnt, legalized.c_str(), ext.c_str());
2890 } else if (nchan < 26) {
2891 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
2892 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
2894 snprintf (buf, sizeof(buf), "T%04d-%s%s",
2895 cnt, legalized.c_str(), ext.c_str());
2901 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
2902 } else if (nchan == 2) {
2904 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
2906 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
2908 } else if (nchan < 26) {
2909 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
2911 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
2915 SessionDirectory sdir((*i).path);
2917 string spath = sdir.sound_path().to_string();
2918 string spath_stubs = sdir.sound_stub_path().to_string();
2920 /* note that we search *without* the extension so that
2921 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
2922 in the event that this new name is required for
2923 a file format change.
2926 if (matching_unsuffixed_filename_exists_in (spath, buf) ||
2927 matching_unsuffixed_filename_exists_in (spath_stubs, buf)) {
2933 if (existing == 0) {
2938 error << string_compose(
2939 _("There are already %1 recordings for %2, which I consider too many."),
2940 limit, base) << endmsg;
2942 throw failed_constructor();
2946 return Glib::path_get_basename (buf);
2949 /** Create a new within-session audio source */
2950 boost::shared_ptr<AudioFileSource>
2951 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive, bool as_stub)
2953 const string name = new_audio_source_name (n, n_chans, chan, destructive);
2954 const string path = new_source_path_from_name(DataType::AUDIO, name, as_stub);
2956 return boost::dynamic_pointer_cast<AudioFileSource> (
2957 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
2960 /** Return a unique name based on \a base for a new internal MIDI source */
2962 Session::new_midi_source_name (const string& base)
2965 char buf[PATH_MAX+1];
2966 const uint32_t limit = 10000;
2970 legalized = legalize_for_path (base);
2972 // Find a "version" of the file name that doesn't exist in any of the possible directories.
2973 for (cnt = 1; cnt <= limit; ++cnt) {
2975 vector<space_and_path>::iterator i;
2976 uint32_t existing = 0;
2978 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2980 SessionDirectory sdir((*i).path);
2982 sys::path p = sdir.midi_path();
2985 snprintf (buf, sizeof(buf), "%s-%u.mid", p.to_string().c_str(), cnt);
2987 if (sys::exists (buf)) {
2992 if (existing == 0) {
2997 error << string_compose(
2998 _("There are already %1 recordings for %2, which I consider too many."),
2999 limit, base) << endmsg;
3001 throw failed_constructor();
3005 return Glib::path_get_basename(buf);
3009 /** Create a new within-session MIDI source */
3010 boost::shared_ptr<MidiSource>
3011 Session::create_midi_source_for_session (Track* track, string const & n, bool as_stub)
3013 /* try to use the existing write source for the track, to keep numbering sane
3017 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3021 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3024 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3025 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3029 const string name = new_midi_source_name (n);
3030 const string path = new_source_path_from_name (DataType::MIDI, name, as_stub);
3032 return boost::dynamic_pointer_cast<SMFSource> (
3033 SourceFactory::createWritable (
3034 DataType::MIDI, *this, path, false, frame_rate()));
3039 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3041 if (playlist->hidden()) {
3045 playlists->add (playlist);
3048 playlist->release();
3055 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3057 if (_state_of_the_state & Deletion) {
3061 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3067 playlists->remove (playlist);
3073 Session::set_audition (boost::shared_ptr<Region> r)
3075 pending_audition_region = r;
3076 add_post_transport_work (PostTransportAudition);
3077 _butler->schedule_transport_work ();
3081 Session::audition_playlist ()
3083 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3084 ev->region.reset ();
3089 Session::non_realtime_set_audition ()
3091 if (!pending_audition_region) {
3092 auditioner->audition_current_playlist ();
3094 auditioner->audition_region (pending_audition_region);
3095 pending_audition_region.reset ();
3097 AuditionActive (true); /* EMIT SIGNAL */
3101 Session::audition_region (boost::shared_ptr<Region> r)
3103 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3109 Session::cancel_audition ()
3111 if (auditioner->auditioning()) {
3112 auditioner->cancel_audition ();
3113 AuditionActive (false); /* EMIT SIGNAL */
3118 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3120 if (a->is_monitor()) {
3123 if (b->is_monitor()) {
3126 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3130 Session::is_auditioning () const
3132 /* can be called before we have an auditioner object */
3134 return auditioner->auditioning();
3141 Session::graph_reordered ()
3143 /* don't do this stuff if we are setting up connections
3144 from a set_state() call or creating new tracks. Ditto for deletion.
3147 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3151 /* every track/bus asked for this to be handled but it was deferred because
3152 we were connecting. do it now.
3155 request_input_change_handling ();
3159 /* force all diskstreams to update their capture offset values to
3160 reflect any changes in latencies within the graph.
3163 boost::shared_ptr<RouteList> rl = routes.reader ();
3164 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3165 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3167 tr->set_capture_offset ();
3173 Session::available_capture_duration ()
3175 float sample_bytes_on_disk = 4.0; // keep gcc happy
3177 switch (config.get_native_file_data_format()) {
3179 sample_bytes_on_disk = 4.0;
3183 sample_bytes_on_disk = 3.0;
3187 sample_bytes_on_disk = 2.0;
3191 /* impossible, but keep some gcc versions happy */
3192 fatal << string_compose (_("programming error: %1"),
3193 X_("illegal native file data format"))
3198 double scale = 4096.0 / sample_bytes_on_disk;
3200 if (_total_free_4k_blocks * scale > (double) max_frames) {
3204 return (nframes_t) floor (_total_free_4k_blocks * scale);
3208 Session::add_bundle (shared_ptr<Bundle> bundle)
3211 RCUWriter<BundleList> writer (_bundles);
3212 boost::shared_ptr<BundleList> b = writer.get_copy ();
3213 b->push_back (bundle);
3216 BundleAdded (bundle); /* EMIT SIGNAL */
3222 Session::remove_bundle (shared_ptr<Bundle> bundle)
3224 bool removed = false;
3227 RCUWriter<BundleList> writer (_bundles);
3228 boost::shared_ptr<BundleList> b = writer.get_copy ();
3229 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3231 if (i != b->end()) {
3238 BundleRemoved (bundle); /* EMIT SIGNAL */
3245 Session::bundle_by_name (string name) const
3247 boost::shared_ptr<BundleList> b = _bundles.reader ();
3249 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3250 if ((*i)->name() == name) {
3255 return boost::shared_ptr<Bundle> ();
3259 Session::tempo_map_changed (const PropertyChange&)
3263 playlists->update_after_tempo_map_change ();
3268 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3269 * the given count with the current block size.
3272 Session::ensure_buffers (ChanCount howmany)
3274 BufferManager::ensure_buffers (howmany);
3278 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3280 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3281 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3286 Session::next_insert_id ()
3288 /* this doesn't really loop forever. just think about it */
3291 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3292 if (!insert_bitset[n]) {
3293 insert_bitset[n] = true;
3299 /* none available, so resize and try again */
3301 insert_bitset.resize (insert_bitset.size() + 16, false);
3306 Session::next_send_id ()
3308 /* this doesn't really loop forever. just think about it */
3311 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3312 if (!send_bitset[n]) {
3313 send_bitset[n] = true;
3319 /* none available, so resize and try again */
3321 send_bitset.resize (send_bitset.size() + 16, false);
3326 Session::next_return_id ()
3328 /* this doesn't really loop forever. just think about it */
3331 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3332 if (!return_bitset[n]) {
3333 return_bitset[n] = true;
3339 /* none available, so resize and try again */
3341 return_bitset.resize (return_bitset.size() + 16, false);
3346 Session::mark_send_id (uint32_t id)
3348 if (id >= send_bitset.size()) {
3349 send_bitset.resize (id+16, false);
3351 if (send_bitset[id]) {
3352 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3354 send_bitset[id] = true;
3358 Session::mark_return_id (uint32_t id)
3360 if (id >= return_bitset.size()) {
3361 return_bitset.resize (id+16, false);
3363 if (return_bitset[id]) {
3364 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3366 return_bitset[id] = true;
3370 Session::mark_insert_id (uint32_t id)
3372 if (id >= insert_bitset.size()) {
3373 insert_bitset.resize (id+16, false);
3375 if (insert_bitset[id]) {
3376 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3378 insert_bitset[id] = true;
3382 Session::unmark_send_id (uint32_t id)
3384 if (id < send_bitset.size()) {
3385 send_bitset[id] = false;
3390 Session::unmark_return_id (uint32_t id)
3392 if (id < return_bitset.size()) {
3393 return_bitset[id] = false;
3398 Session::unmark_insert_id (uint32_t id)
3400 if (id < insert_bitset.size()) {
3401 insert_bitset[id] = false;
3406 /* Named Selection management */
3408 boost::shared_ptr<NamedSelection>
3409 Session::named_selection_by_name (string name)
3411 Glib::Mutex::Lock lm (named_selection_lock);
3412 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3413 if ((*i)->name == name) {
3417 return boost::shared_ptr<NamedSelection>();
3421 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3424 Glib::Mutex::Lock lm (named_selection_lock);
3425 named_selections.insert (named_selections.begin(), named_selection);
3430 NamedSelectionAdded (); /* EMIT SIGNAL */
3434 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3436 bool removed = false;
3439 Glib::Mutex::Lock lm (named_selection_lock);
3441 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3443 if (i != named_selections.end()) {
3444 named_selections.erase (i);
3451 NamedSelectionRemoved (); /* EMIT SIGNAL */
3456 Session::reset_native_file_format ()
3458 boost::shared_ptr<RouteList> rl = routes.reader ();
3459 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3460 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3462 /* don't save state as we do this, there's no point
3465 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3466 tr->reset_write_sources (false);
3467 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3473 Session::route_name_unique (string n) const
3475 shared_ptr<RouteList> r = routes.reader ();
3477 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3478 if ((*i)->name() == n) {
3487 Session::route_name_internal (string n) const
3489 if (auditioner && auditioner->name() == n) {
3493 if (_click_io && _click_io->name() == n) {
3501 Session::freeze_all (InterThreadInfo& itt)
3503 shared_ptr<RouteList> r = routes.reader ();
3505 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3507 boost::shared_ptr<Track> t;
3509 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3510 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3520 boost::shared_ptr<Region>
3521 Session::write_one_track (AudioTrack& track, nframes_t start, nframes_t end,
3522 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3523 InterThreadInfo& itt, bool enable_processing)
3525 boost::shared_ptr<Region> result;
3526 boost::shared_ptr<Playlist> playlist;
3527 boost::shared_ptr<AudioFileSource> fsource;
3529 char buf[PATH_MAX+1];
3530 ChanCount nchans(track.n_channels());
3532 nframes_t this_chunk;
3535 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3536 const string sound_dir = sdir.sound_path().to_string();
3537 nframes_t len = end - start;
3541 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3542 end, start) << endmsg;
3546 const nframes_t chunk_size = (256 * 1024)/4;
3548 // block all process callback handling
3550 block_processing ();
3552 /* call tree *MUST* hold route_lock */
3554 if ((playlist = track.playlist()) == 0) {
3558 /* external redirects will be a problem */
3560 if (track.has_external_redirects()) {
3564 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3566 for (uint32_t chan_n=0; chan_n < nchans.n_audio(); ++chan_n) {
3568 for (x = 0; x < 99999; ++x) {
3569 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());
3570 if (access (buf, F_OK) != 0) {
3576 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3581 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3582 SourceFactory::createWritable (DataType::AUDIO, *this, buf, false, frame_rate()));
3585 catch (failed_constructor& err) {
3586 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3590 srcs.push_back (fsource);
3593 /* XXX need to flush all redirects */
3598 /* create a set of reasonably-sized buffers */
3599 buffers.ensure_buffers(DataType::AUDIO, nchans.n_audio(), chunk_size);
3600 buffers.set_count(nchans);
3602 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3603 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3605 afs->prepare_for_peakfile_writes ();
3608 while (to_do && !itt.cancel) {
3610 this_chunk = min (to_do, chunk_size);
3612 if (track.export_stuff (buffers, start, this_chunk, enable_processing)) {
3617 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
3618 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3621 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
3627 start += this_chunk;
3628 to_do -= this_chunk;
3630 itt.progress = (float) (1.0 - ((double) to_do / len));
3639 xnow = localtime (&now);
3641 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3642 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3645 afs->update_header (position, *xnow, now);
3646 afs->flush_header ();
3650 /* construct a region to represent the bounced material */
3654 plist.add (Properties::start, 0);
3655 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
3656 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
3658 result = RegionFactory::create (srcs, plist);
3664 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3665 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3668 afs->mark_for_remove ();
3671 (*src)->drop_references ();
3675 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3676 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3679 afs->done_with_peakfile_writes ();
3683 unblock_processing ();
3689 Session::gain_automation_buffer() const
3691 return ProcessThread::gain_automation_buffer ();
3695 Session::pan_automation_buffer() const
3697 return ProcessThread::pan_automation_buffer ();
3701 Session::get_silent_buffers (ChanCount count)
3703 return ProcessThread::get_silent_buffers (count);
3705 assert(_silent_buffers->available() >= count);
3706 _silent_buffers->set_count(count);
3708 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3709 for (size_t i= 0; i < count.get(*t); ++i) {
3710 _silent_buffers->get(*t, i).clear();
3714 return *_silent_buffers;
3719 Session::get_scratch_buffers (ChanCount count)
3721 return ProcessThread::get_scratch_buffers (count);
3723 if (count != ChanCount::ZERO) {
3724 assert(_scratch_buffers->available() >= count);
3725 _scratch_buffers->set_count(count);
3727 _scratch_buffers->set_count (_scratch_buffers->available());
3730 return *_scratch_buffers;
3735 Session::get_mix_buffers (ChanCount count)
3737 return ProcessThread::get_mix_buffers (count);
3739 assert(_mix_buffers->available() >= count);
3740 _mix_buffers->set_count(count);
3741 return *_mix_buffers;
3746 Session::ntracks () const
3749 shared_ptr<RouteList> r = routes.reader ();
3751 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3752 if (boost::dynamic_pointer_cast<Track> (*i)) {
3761 Session::nbusses () const
3764 shared_ptr<RouteList> r = routes.reader ();
3766 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3767 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
3776 Session::add_automation_list(AutomationList *al)
3778 automation_lists[al->id()] = al;
3782 Session::sync_order_keys (std::string const & base)
3784 if (deletion_in_progress()) {
3788 if (!Config->get_sync_all_route_ordering()) {
3789 /* leave order keys as they are */
3793 boost::shared_ptr<RouteList> r = routes.reader ();
3795 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3796 (*i)->sync_order_keys (base);
3799 Route::SyncOrderKeys (base); // EMIT SIGNAL
3801 /* this might not do anything */
3803 set_remote_control_ids ();
3806 /** @return true if there is at least one record-enabled track, otherwise false */
3808 Session::have_rec_enabled_track () const
3810 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
3813 /** Update the state of our rec-enabled tracks flag */
3815 Session::update_have_rec_enabled_track ()
3817 boost::shared_ptr<RouteList> rl = routes.reader ();
3818 RouteList::iterator i = rl->begin();
3819 while (i != rl->end ()) {
3821 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3822 if (tr && tr->record_enabled ()) {
3829 int const old = g_atomic_int_get (&_have_rec_enabled_track);
3831 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
3833 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
3834 RecordStateChanged (); /* EMIT SIGNAL */
3839 Session::listen_position_changed ()
3843 switch (Config->get_listen_position()) {
3844 case AfterFaderListen:
3848 case PreFaderListen:
3853 boost::shared_ptr<RouteList> r = routes.reader ();
3855 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3856 (*i)->put_monitor_send_at (p);
3861 Session::solo_control_mode_changed ()
3863 /* cancel all solo or all listen when solo control mode changes */
3866 set_solo (get_routes(), false);
3867 } else if (listening()) {
3868 set_listen (get_routes(), false);
3872 /** Called when anything about any of our route groups changes (membership, state etc.) */
3874 Session::route_group_changed ()
3876 RouteGroupChanged (); /* EMIT SIGNAL */
3880 Session::get_available_sync_options () const
3882 vector<SyncSource> ret;
3884 ret.push_back (JACK);
3885 ret.push_back (MTC);
3886 ret.push_back (MIDIClock);
3891 boost::shared_ptr<RouteList>
3892 Session::get_routes_with_regions_at (nframes64_t const p) const
3894 shared_ptr<RouteList> r = routes.reader ();
3895 shared_ptr<RouteList> rl (new RouteList);
3897 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3898 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3903 boost::shared_ptr<Playlist> pl = tr->playlist ();
3908 if (pl->has_region_at (p)) {
3917 Session::goto_end ()
3919 if (_session_range_location) {
3920 request_locate (_session_range_location->end(), false);
3922 request_locate (0, false);
3927 Session::goto_start ()
3929 if (_session_range_location) {
3930 request_locate (_session_range_location->start(), false);
3932 request_locate (0, false);
3937 Session::set_session_start (nframes_t start)
3939 if (_session_range_location) {
3940 _session_range_location->set_start (start);
3942 add_session_range_location (start, start);
3947 Session::set_session_end (nframes_t end)
3949 if (_session_range_location) {
3950 _session_range_location->set_end (end);
3952 add_session_range_location (end, end);
3957 Session::current_start_frame () const
3959 return _session_range_location ? _session_range_location->start() : 0;
3963 Session::current_end_frame () const
3965 return _session_range_location ? _session_range_location->end() : 0;
3969 Session::add_session_range_location (nframes_t start, nframes_t end)
3971 _session_range_location = new Location (start, end, _("session"), Location::IsSessionRange);
3972 _locations.add (_session_range_location);
3975 /** Called when one of our routes' order keys has changed */
3977 Session::route_order_key_changed ()
3979 RouteOrderKeyChanged (); /* EMIT SIGNAL */
3983 Session::step_edit_status_change (bool yn)
3989 send = (_step_editors == 0);
3994 send = (_step_editors == 1);
3997 if (_step_editors > 0) {
4003 StepEditStatusChange (val);