2 Copyright (C) 1999-2010 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include <cstdio> /* sprintf(3) ... grrr */
33 #include <glibmm/thread.h>
34 #include <glibmm/miscutils.h>
35 #include <glibmm/fileutils.h>
37 #include <boost/algorithm/string/erase.hpp>
39 #include "pbd/error.h"
40 #include "pbd/boost_debug.h"
41 #include "pbd/pathscanner.h"
42 #include "pbd/stl_delete.h"
43 #include "pbd/basename.h"
44 #include "pbd/stacktrace.h"
45 #include "pbd/file_utils.h"
46 #include "pbd/convert.h"
47 #include "pbd/strsplit.h"
49 #include "ardour/amp.h"
50 #include "ardour/analyser.h"
51 #include "ardour/audio_buffer.h"
52 #include "ardour/audio_diskstream.h"
53 #include "ardour/audio_port.h"
54 #include "ardour/audio_track.h"
55 #include "ardour/audioengine.h"
56 #include "ardour/audiofilesource.h"
57 #include "ardour/audioplaylist.h"
58 #include "ardour/audioregion.h"
59 #include "ardour/auditioner.h"
60 #include "ardour/buffer_manager.h"
61 #include "ardour/buffer_set.h"
62 #include "ardour/bundle.h"
63 #include "ardour/butler.h"
64 #include "ardour/click.h"
65 #include "ardour/configuration.h"
66 #include "ardour/crossfade.h"
67 #include "ardour/cycle_timer.h"
68 #include "ardour/data_type.h"
69 #include "ardour/debug.h"
70 #include "ardour/filename_extensions.h"
71 #include "ardour/internal_send.h"
72 #include "ardour/io_processor.h"
73 #include "ardour/midi_diskstream.h"
74 #include "ardour/midi_playlist.h"
75 #include "ardour/midi_region.h"
76 #include "ardour/midi_track.h"
77 #include "ardour/midi_ui.h"
78 #include "ardour/named_selection.h"
79 #include "ardour/process_thread.h"
80 #include "ardour/playlist.h"
81 #include "ardour/plugin_insert.h"
82 #include "ardour/port_insert.h"
83 #include "ardour/processor.h"
84 #include "ardour/rc_configuration.h"
85 #include "ardour/recent_sessions.h"
86 #include "ardour/region_factory.h"
87 #include "ardour/return.h"
88 #include "ardour/route_group.h"
89 #include "ardour/send.h"
90 #include "ardour/session.h"
91 #include "ardour/session_directory.h"
92 #include "ardour/session_directory.h"
93 #include "ardour/session_metadata.h"
94 #include "ardour/session_playlists.h"
95 #include "ardour/slave.h"
96 #include "ardour/smf_source.h"
97 #include "ardour/source_factory.h"
98 #include "ardour/tape_file_matcher.h"
99 #include "ardour/tempo.h"
100 #include "ardour/utils.h"
101 #include "ardour/graph.h"
102 #include "ardour/speakers.h"
103 #include "ardour/operations.h"
105 #include "midi++/port.h"
106 #include "midi++/mmc.h"
107 #include "midi++/manager.h"
112 using namespace ARDOUR;
115 bool Session::_disable_all_loaded_plugins = false;
117 PBD::Signal1<void,std::string> Session::Dialog;
118 PBD::Signal0<int> Session::AskAboutPendingState;
119 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
120 PBD::Signal0<void> Session::SendFeedback;
121 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
123 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
124 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
125 PBD::Signal0<void> Session::AutoBindingOn;
126 PBD::Signal0<void> Session::AutoBindingOff;
127 PBD::Signal2<void,std::string, std::string> Session::Exported;
128 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
129 PBD::Signal0<void> Session::Quit;
131 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
132 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
134 Session::Session (AudioEngine &eng,
135 const string& fullpath,
136 const string& snapshot_name,
137 BusProfile* bus_profile,
140 , _target_transport_speed (0.0)
141 , _requested_return_frame (-1)
142 , _session_dir (new SessionDirectory(fullpath))
144 , _state_of_the_state (Clean)
145 , _butler (new Butler (*this))
146 , _post_transport_work (0)
147 , _send_timecode_update (false)
148 , _all_route_group (new RouteGroup (*this, "all"))
149 , route_graph (new Graph(*this))
150 , routes (new RouteList)
151 , _total_free_4k_blocks (0)
152 , _bundles (new BundleList)
153 , _bundle_xml_node (0)
155 , _click_io ((IO*) 0)
157 , click_emphasis_data (0)
159 , _metadata (new SessionMetadata())
160 , _have_rec_enabled_track (false)
161 , _suspend_timecode_transmission (0)
163 _locations = new Locations (*this);
165 playlists.reset (new SessionPlaylists);
167 _all_route_group->set_active (true, this);
169 interpolation.add_channel_to (0, 0);
171 if (!eng.connected()) {
172 throw failed_constructor();
175 n_physical_outputs = _engine.n_physical_outputs ();
176 n_physical_inputs = _engine.n_physical_inputs ();
178 first_stage_init (fullpath, snapshot_name);
180 _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
183 if (create (mix_template, bus_profile)) {
185 throw failed_constructor ();
189 if (second_stage_init ()) {
191 throw failed_constructor ();
194 store_recent_sessions(_name, _path);
196 bool was_dirty = dirty();
198 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
200 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
201 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
204 DirtyChanged (); /* EMIT SIGNAL */
207 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
208 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
221 vector<void*> debug_pointers;
223 /* if we got to here, leaving pending capture state around
227 remove_pending_capture_state ();
229 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
231 _engine.remove_session ();
233 /* clear history so that no references to objects are held any more */
237 /* clear state tree so that no references to objects are held any more */
241 /* remove all stubfiles that might still be lurking */
243 cleanup_stubfiles ();
245 /* reset dynamic state version back to default */
247 Stateful::loading_state_version = 0;
249 _butler->drop_references ();
251 delete midi_control_ui;
252 delete _all_route_group;
254 if (click_data != default_click) {
255 delete [] click_data;
258 if (click_emphasis_data != default_click_emphasis) {
259 delete [] click_emphasis_data;
264 /* clear out any pending dead wood from RCU managed objects */
269 AudioDiskstream::free_working_buffers();
271 /* tell everyone who is still standing that we're about to die */
274 /* tell everyone to drop references and delete objects as we go */
276 DEBUG_TRACE (DEBUG::Destruction, "delete named selections\n");
277 named_selections.clear ();
279 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
280 RegionFactory::delete_all_regions ();
282 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
284 /* reset these three references to special routes before we do the usual route delete thing */
287 _master_out.reset ();
288 _monitor_out.reset ();
291 RCUWriter<RouteList> writer (routes);
292 boost::shared_ptr<RouteList> r = writer.get_copy ();
294 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
295 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
296 (*i)->drop_references ();
300 /* writer goes out of scope and updates master */
304 boost::shared_ptr<RouteList> r = routes.reader ();
306 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
307 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
308 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->path(), i->second.use_count()));
309 i->second->drop_references ();
314 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
315 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
320 Crossfade::set_buffer_size (0);
322 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
327 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
329 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
330 boost_debug_list_ptrs ();
335 Session::set_worst_io_latencies ()
337 _worst_output_latency = 0;
338 _worst_input_latency = 0;
340 if (!_engine.connected()) {
344 boost::shared_ptr<RouteList> r = routes.reader ();
346 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
347 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
348 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
353 Session::when_engine_running ()
355 string first_physical_output;
357 BootMessage (_("Set block size and sample rate"));
359 set_block_size (_engine.frames_per_cycle());
360 set_frame_rate (_engine.frame_rate());
362 BootMessage (_("Using configuration"));
364 boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
365 boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
367 Config->map_parameters (ff);
368 config.map_parameters (ft);
370 /* every time we reconnect, recompute worst case output latencies */
372 _engine.Running.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies, this));
374 if (synced_to_jack()) {
375 _engine.transport_stop ();
378 if (config.get_jack_time_master()) {
379 _engine.transport_locate (_transport_frame);
387 _click_io.reset (new ClickIO (*this, "click"));
389 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
391 /* existing state for Click */
394 if (Stateful::loading_state_version < 3000) {
395 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
397 c = _click_io->set_state (*child->children().front(), Stateful::loading_state_version);
402 _clicking = Config->get_clicking ();
406 error << _("could not setup Click I/O") << endmsg;
413 /* default state for Click: dual-mono to first 2 physical outputs */
416 _engine.get_physical_outputs (DataType::AUDIO, outs);
418 for (uint32_t physport = 0; physport < 2; ++physport) {
419 if (outs.size() > physport) {
420 if (_click_io->add_port (outs[physport], this)) {
421 // relax, even though its an error
426 if (_click_io->n_ports () > ChanCount::ZERO) {
427 _clicking = Config->get_clicking ();
432 catch (failed_constructor& err) {
433 error << _("cannot setup Click I/O") << endmsg;
436 BootMessage (_("Compute I/O Latencies"));
438 set_worst_io_latencies ();
441 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
444 BootMessage (_("Set up standard connections"));
446 vector<string> inputs[DataType::num_types];
447 vector<string> outputs[DataType::num_types];
448 for (uint32_t i = 0; i < DataType::num_types; ++i) {
449 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
450 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
453 /* Create a set of Bundle objects that map
454 to the physical I/O currently available. We create both
455 mono and stereo bundles, so that the common cases of mono
456 and stereo tracks get bundles to put in their mixer strip
457 in / out menus. There may be a nicer way of achieving that;
458 it doesn't really scale that well to higher channel counts
461 /* mono output bundles */
463 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
465 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
467 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
468 c->add_channel (_("mono"), DataType::AUDIO);
469 c->set_port (0, outputs[DataType::AUDIO][np]);
474 /* stereo output bundles */
476 for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
477 if (np + 1 < outputs[DataType::AUDIO].size()) {
479 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
480 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
481 c->add_channel (_("L"), DataType::AUDIO);
482 c->set_port (0, outputs[DataType::AUDIO][np]);
483 c->add_channel (_("R"), DataType::AUDIO);
484 c->set_port (1, outputs[DataType::AUDIO][np + 1]);
490 /* mono input bundles */
492 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
494 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
496 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
497 c->add_channel (_("mono"), DataType::AUDIO);
498 c->set_port (0, inputs[DataType::AUDIO][np]);
503 /* stereo input bundles */
505 for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
506 if (np + 1 < inputs[DataType::AUDIO].size()) {
508 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
510 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
511 c->add_channel (_("L"), DataType::AUDIO);
512 c->set_port (0, inputs[DataType::AUDIO][np]);
513 c->add_channel (_("R"), DataType::AUDIO);
514 c->set_port (1, inputs[DataType::AUDIO][np + 1]);
520 /* MIDI input bundles */
522 for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
523 string n = inputs[DataType::MIDI][np];
524 boost::erase_first (n, X_("alsa_pcm:"));
526 boost::shared_ptr<Bundle> c (new Bundle (n, false));
527 c->add_channel ("", DataType::MIDI);
528 c->set_port (0, inputs[DataType::MIDI][np]);
532 /* MIDI output bundles */
534 for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
535 string n = outputs[DataType::MIDI][np];
536 boost::erase_first (n, X_("alsa_pcm:"));
538 boost::shared_ptr<Bundle> c (new Bundle (n, true));
539 c->add_channel ("", DataType::MIDI);
540 c->set_port (0, outputs[DataType::MIDI][np]);
544 BootMessage (_("Setup signal flow and plugins"));
548 if (_is_new && !no_auto_connect()) {
550 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock());
552 /* don't connect the master bus outputs if there is a monitor bus */
554 if (_master_out && Config->get_auto_connect_standard_busses() && !_monitor_out) {
556 /* if requested auto-connect the outputs to the first N physical ports.
559 uint32_t limit = _master_out->n_outputs().n_total();
561 for (uint32_t n = 0; n < limit; ++n) {
562 Port* p = _master_out->output()->nth (n);
564 if (outputs[p->type()].size() > n) {
565 connect_to = outputs[p->type()][n];
568 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
569 if (_master_out->output()->connect (p, connect_to, this)) {
570 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
580 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
581 are undefined, at best.
584 /* control out listens to master bus (but ignores it
585 under some conditions)
588 uint32_t limit = _monitor_out->n_inputs().n_audio();
591 for (uint32_t n = 0; n < limit; ++n) {
592 AudioPort* p = _monitor_out->input()->ports().nth_audio_port (n);
593 AudioPort* o = _master_out->output()->ports().nth_audio_port (n);
596 string connect_to = o->name();
597 if (_monitor_out->input()->connect (p, connect_to, this)) {
598 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
606 /* if control out is not connected, connect control out to physical outs
609 if (!_monitor_out->output()->connected ()) {
611 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
613 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
616 _monitor_out->output()->connect_ports_to_bundle (b, this);
618 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
619 Config->get_monitor_bus_preferred_bundle())
625 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
626 uint32_t mod = n_physical_outputs.get (*t);
627 uint32_t limit = _monitor_out->n_outputs().get(*t);
629 for (uint32_t n = 0; n < limit; ++n) {
631 Port* p = _monitor_out->output()->ports().port(*t, n);
633 if (outputs[*t].size() > (n % mod)) {
634 connect_to = outputs[*t][n % mod];
637 if (!connect_to.empty()) {
638 if (_monitor_out->output()->connect (p, connect_to, this)) {
639 error << string_compose (
640 _("cannot connect control output %1 to %2"),
653 /* catch up on send+insert cnts */
655 _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
657 /* hook us up to the engine */
659 BootMessage (_("Connect to engine"));
661 _engine.set_session (this);
662 _engine.update_total_latencies ();
666 Session::hookup_io ()
668 /* stop graph reordering notifications from
669 causing resorts, etc.
672 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
676 /* we delay creating the auditioner till now because
677 it makes its own connections to ports.
681 boost::shared_ptr<Auditioner> a (new Auditioner (*this));
683 throw failed_constructor ();
685 a->use_new_diskstream ();
689 catch (failed_constructor& err) {
690 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
694 /* load bundles, which we may have postponed earlier on */
695 if (_bundle_xml_node) {
696 load_bundles (*_bundle_xml_node);
697 delete _bundle_xml_node;
700 /* Tell all IO objects to connect themselves together */
702 IO::enable_connecting ();
703 MIDI::Port::MakeConnections ();
705 /* Now reset all panners */
707 Delivery::reset_panners ();
709 /* Connect tracks to monitor/listen bus if there is one.
710 Note that in an existing session, the internal sends will
711 already exist, but we want the routes to notice that
712 they connect to the control out specifically.
716 boost::shared_ptr<RouteList> r = routes.reader ();
717 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
719 if ((*x)->is_monitor()) {
723 } else if ((*x)->is_master()) {
729 (*x)->listen_via_monitor ();
734 /* Anyone who cares about input state, wake up and do something */
736 IOConnectionsComplete (); /* EMIT SIGNAL */
738 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
740 /* now handle the whole enchilada as if it was one
746 /* update the full solo state, which can't be
747 correctly determined on a per-route basis, but
748 needs the global overview that only the session
752 update_route_solo_state ();
756 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
758 boost::shared_ptr<Track> track = wp.lock ();
763 boost::shared_ptr<Playlist> playlist;
765 if ((playlist = track->playlist()) != 0) {
766 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
767 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
772 Session::record_enabling_legal () const
774 /* this used to be in here, but survey says.... we don't need to restrict it */
775 // if (record_status() == Recording) {
779 if (Config->get_all_safe()) {
786 Session::reset_input_monitor_state ()
788 if (transport_rolling()) {
790 boost::shared_ptr<RouteList> rl = routes.reader ();
791 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
792 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
793 if (tr && tr->record_enabled ()) {
794 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
795 tr->monitor_input (Config->get_monitoring_model() == HardwareMonitoring && !config.get_auto_input());
801 boost::shared_ptr<RouteList> rl = routes.reader ();
802 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
803 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
804 if (tr && tr->record_enabled ()) {
805 //cerr << "switching to input = " << !Config->get_auto_input() << __FILE__ << __LINE__ << endl << endl;
806 tr->monitor_input (Config->get_monitoring_model() == HardwareMonitoring);
813 Session::auto_punch_start_changed (Location* location)
815 replace_event (SessionEvent::PunchIn, location->start());
817 if (get_record_enabled() && config.get_punch_in()) {
818 /* capture start has been changed, so save new pending state */
819 save_state ("", true);
824 Session::auto_punch_end_changed (Location* location)
826 framepos_t when_to_stop = location->end();
827 // when_to_stop += _worst_output_latency + _worst_input_latency;
828 replace_event (SessionEvent::PunchOut, when_to_stop);
832 Session::auto_punch_changed (Location* location)
834 framepos_t when_to_stop = location->end();
836 replace_event (SessionEvent::PunchIn, location->start());
837 //when_to_stop += _worst_output_latency + _worst_input_latency;
838 replace_event (SessionEvent::PunchOut, when_to_stop);
842 Session::auto_loop_changed (Location* location)
844 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
846 if (transport_rolling() && play_loop) {
849 // if (_transport_frame > location->end()) {
851 if (_transport_frame < location->start() || _transport_frame > location->end()) {
852 // relocate to beginning of loop
853 clear_events (SessionEvent::LocateRoll);
855 request_locate (location->start(), true);
858 else if (Config->get_seamless_loop() && !loop_changing) {
860 // schedule a locate-roll to refill the diskstreams at the
862 loop_changing = true;
864 if (location->end() > last_loopend) {
865 clear_events (SessionEvent::LocateRoll);
866 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
873 last_loopend = location->end();
877 Session::set_auto_punch_location (Location* location)
881 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
882 punch_connections.drop_connections();
883 existing->set_auto_punch (false, this);
884 remove_event (existing->start(), SessionEvent::PunchIn);
885 clear_events (SessionEvent::PunchOut);
886 auto_punch_location_changed (0);
895 if (location->end() <= location->start()) {
896 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
900 punch_connections.drop_connections ();
902 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
903 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
904 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
906 location->set_auto_punch (true, this);
908 auto_punch_changed (location);
910 auto_punch_location_changed (location);
914 Session::set_auto_loop_location (Location* location)
918 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
919 loop_connections.drop_connections ();
920 existing->set_auto_loop (false, this);
921 remove_event (existing->end(), SessionEvent::AutoLoop);
922 auto_loop_location_changed (0);
931 if (location->end() <= location->start()) {
932 error << _("Session: you can't use a mark for auto loop") << endmsg;
936 last_loopend = location->end();
938 loop_connections.drop_connections ();
940 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
941 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
942 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
944 location->set_auto_loop (true, this);
946 /* take care of our stuff first */
948 auto_loop_changed (location);
950 /* now tell everyone else */
952 auto_loop_location_changed (location);
956 Session::locations_added (Location *)
962 Session::locations_changed ()
964 _locations->apply (*this, &Session::handle_locations_changed);
968 Session::handle_locations_changed (Locations::LocationList& locations)
970 Locations::LocationList::iterator i;
972 bool set_loop = false;
973 bool set_punch = false;
975 for (i = locations.begin(); i != locations.end(); ++i) {
979 if (location->is_auto_punch()) {
980 set_auto_punch_location (location);
983 if (location->is_auto_loop()) {
984 set_auto_loop_location (location);
988 if (location->is_session_range()) {
989 _session_range_location = location;
994 set_auto_loop_location (0);
997 set_auto_punch_location (0);
1004 Session::enable_record ()
1007 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1009 if (rs == Recording) {
1013 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1015 _last_record_location = _transport_frame;
1016 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1018 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1020 boost::shared_ptr<RouteList> rl = routes.reader ();
1021 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1022 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1023 if (tr && tr->record_enabled ()) {
1024 tr->monitor_input (true);
1029 RecordStateChanged ();
1036 Session::disable_record (bool rt_context, bool force)
1040 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1042 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1043 g_atomic_int_set (&_record_status, Disabled);
1044 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1046 if (rs == Recording) {
1047 g_atomic_int_set (&_record_status, Enabled);
1051 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1053 boost::shared_ptr<RouteList> rl = routes.reader ();
1054 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1055 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1056 if (tr && tr->record_enabled ()) {
1057 tr->monitor_input (false);
1062 RecordStateChanged (); /* emit signal */
1065 remove_pending_capture_state ();
1071 Session::step_back_from_record ()
1073 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1075 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1076 boost::shared_ptr<RouteList> rl = routes.reader ();
1077 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1078 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1079 if (tr && tr->record_enabled ()) {
1080 //cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl;
1081 tr->monitor_input (false);
1089 Session::maybe_enable_record ()
1091 if (_step_editors > 0) {
1095 g_atomic_int_set (&_record_status, Enabled);
1097 /* This function is currently called from somewhere other than an RT thread.
1098 This save_state() call therefore doesn't impact anything. Doing it here
1099 means that we save pending state of which sources the next record will use,
1100 which gives us some chance of recovering from a crash during the record.
1103 save_state ("", true);
1105 if (_transport_speed) {
1106 if (!config.get_punch_in()) {
1110 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1111 RecordStateChanged (); /* EMIT SIGNAL */
1118 Session::audible_frame () const
1124 /* the first of these two possible settings for "offset"
1125 mean that the audible frame is stationary until
1126 audio emerges from the latency compensation
1129 the second means that the audible frame is stationary
1130 until audio would emerge from a physical port
1131 in the absence of any plugin latency compensation
1134 offset = _worst_output_latency;
1136 if (offset > current_block_size) {
1137 offset -= current_block_size;
1139 /* XXX is this correct? if we have no external
1140 physical connections and everything is internal
1141 then surely this is zero? still, how
1142 likely is that anyway?
1144 offset = current_block_size;
1147 if (synced_to_jack()) {
1148 tf = _engine.transport_frame();
1150 tf = _transport_frame;
1155 if (!non_realtime_work_pending()) {
1159 /* Check to see if we have passed the first guaranteed
1160 audible frame past our last start position. if not,
1161 return that last start point because in terms
1162 of audible frames, we have not moved yet.
1164 `Start position' in this context means the time we last
1165 either started or changed transport direction.
1168 if (_transport_speed > 0.0f) {
1170 if (!play_loop || !have_looped) {
1171 if (tf < _last_roll_or_reversal_location + offset) {
1172 return _last_roll_or_reversal_location;
1180 } else if (_transport_speed < 0.0f) {
1182 /* XXX wot? no backward looping? */
1184 if (tf > _last_roll_or_reversal_location - offset) {
1185 return _last_roll_or_reversal_location;
1197 Session::set_frame_rate (framecnt_t frames_per_second)
1199 /** \fn void Session::set_frame_size(framecnt_t)
1200 the AudioEngine object that calls this guarantees
1201 that it will not be called while we are also in
1202 ::process(). Its fine to do things that block
1206 _base_frame_rate = frames_per_second;
1210 Automatable::set_automation_interval (ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1214 // XXX we need some equivalent to this, somehow
1215 // SndFileSource::setup_standard_crossfades (frames_per_second);
1219 /* XXX need to reset/reinstantiate all LADSPA plugins */
1223 Session::set_block_size (pframes_t nframes)
1225 /* the AudioEngine guarantees
1226 that it will not be called while we are also in
1227 ::process(). It is therefore fine to do things that block
1232 current_block_size = nframes;
1236 boost::shared_ptr<RouteList> r = routes.reader ();
1238 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1239 (*i)->set_block_size (nframes);
1242 boost::shared_ptr<RouteList> rl = routes.reader ();
1243 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1244 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1246 tr->set_block_size (nframes);
1250 set_worst_io_latencies ();
1254 struct RouteSorter {
1255 /** @return true to run r1 before r2, otherwise false */
1256 bool operator() (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> r2) {
1257 if (r2->feeds (r1)) {
1258 /* r1 fed by r2; run r2 early */
1260 } else if (r1->feeds (r2)) {
1261 /* r2 fed by r1; run r1 early */
1264 if (r1->not_fed ()) {
1265 if (r2->not_fed ()) {
1266 /* no ardour-based connections inbound to either route. just use signal order */
1267 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1269 /* r2 has connections, r1 does not; run r1 early */
1273 if (r2->not_fed()) {
1274 /* r1 has connections, r2 does not; run r2 early */
1277 /* both r1 and r2 have connections, but not to each other. just use signal order */
1278 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1286 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1288 boost::shared_ptr<Route> r2;
1290 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1291 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1295 /* make a copy of the existing list of routes that feed r1 */
1297 Route::FedBy existing (r1->fed_by());
1299 /* for each route that feeds r1, recurse, marking it as feeding
1303 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1304 if (!(r2 = i->r.lock ())) {
1305 /* (*i) went away, ignore it */
1309 /* r2 is a route that feeds r1 which somehow feeds base. mark
1310 base as being fed by r2
1313 rbase->add_fed_by (r2, i->sends_only);
1317 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1321 if (r1->feeds (r2) && r2->feeds (r1)) {
1325 /* now recurse, so that we can mark base as being fed by
1326 all routes that feed r2
1329 trace_terminal (r2, rbase);
1336 Session::resort_routes ()
1338 /* don't do anything here with signals emitted
1339 by Routes while we are being destroyed.
1342 if (_state_of_the_state & Deletion) {
1347 RCUWriter<RouteList> writer (routes);
1348 boost::shared_ptr<RouteList> r = writer.get_copy ();
1349 resort_routes_using (r);
1350 /* writer goes out of scope and forces update */
1353 //route_graph->dump(1);
1356 boost::shared_ptr<RouteList> rl = routes.reader ();
1357 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1358 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1360 const Route::FedBy& fb ((*i)->fed_by());
1362 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1363 boost::shared_ptr<Route> sf = f->r.lock();
1365 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1373 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1375 RouteList::iterator i, j;
1377 for (i = r->begin(); i != r->end(); ++i) {
1379 (*i)->clear_fed_by ();
1381 for (j = r->begin(); j != r->end(); ++j) {
1383 /* although routes can feed themselves, it will
1384 cause an endless recursive descent if we
1385 detect it. so don't bother checking for
1393 bool via_sends_only;
1395 if ((*j)->direct_feeds (*i, &via_sends_only)) {
1396 (*i)->add_fed_by (*j, via_sends_only);
1401 for (i = r->begin(); i != r->end(); ++i) {
1402 trace_terminal (*i, *i);
1408 route_graph->rechain (r);
1411 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1412 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1413 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1414 (*i)->name(), (*i)->order_key ("signal")));
1420 /** Find a route name starting with \a base, maybe followed by the
1421 * lowest \a id. \a id will always be added if \a definitely_add_number
1422 * is true on entry; otherwise it will only be added if required
1423 * to make the name unique.
1425 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1426 * The available route name with the lowest ID will be used, and \a id
1427 * will be set to the ID.
1429 * \return false if a route name could not be found, and \a track_name
1430 * and \a id do not reflect a free route name.
1433 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1435 if (!definitely_add_number && route_by_name (base) == 0) {
1436 /* juse use the base */
1437 snprintf (name, name_len, "%s", base.c_str());
1442 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1444 if (route_by_name (name) == 0) {
1450 } while (id < (UINT_MAX-1));
1455 /** Count the total ins and outs of all non-hidden routes in the session and return them in in and out */
1457 Session::count_existing_route_channels (ChanCount& in, ChanCount& out)
1459 in = ChanCount::ZERO;
1460 out = ChanCount::ZERO;
1461 boost::shared_ptr<RouteList> r = routes.reader ();
1462 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1463 if (!(*i)->is_hidden()) {
1464 in += (*i)->n_inputs();
1465 out += (*i)->n_outputs();
1470 /** Caller must not hold process lock
1471 * @param name_template string to use for the start of the name, or "" to use "Midi".
1473 list<boost::shared_ptr<MidiTrack> >
1474 Session::new_midi_track (TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1476 char track_name[32];
1477 uint32_t track_id = 0;
1478 ChanCount existing_inputs;
1479 ChanCount existing_outputs;
1481 RouteList new_routes;
1482 list<boost::shared_ptr<MidiTrack> > ret;
1483 uint32_t control_id;
1485 count_existing_route_channels (existing_inputs, existing_outputs);
1487 control_id = ntracks() + nbusses();
1490 if (!find_route_name (name_template.empty() ? _("Midi") : name_template, ++track_id, track_name, sizeof(track_name), false)) {
1491 error << "cannot find name for new midi track" << endmsg;
1495 boost::shared_ptr<MidiTrack> track;
1498 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1500 if (track->init ()) {
1504 track->use_new_diskstream();
1506 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1507 boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1510 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1511 if (track->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1512 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1516 if (track->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1517 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1522 auto_connect_route (track.get(), existing_inputs, existing_outputs);
1524 track->non_realtime_input_change();
1527 route_group->add (track);
1530 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1531 track->set_remote_control_id (control_id);
1533 new_routes.push_back (track);
1534 ret.push_back (track);
1537 catch (failed_constructor &err) {
1538 error << _("Session: could not create new midi track.") << endmsg;
1542 catch (AudioEngine::PortRegistrationFailure& pfe) {
1544 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;
1552 if (!new_routes.empty()) {
1553 add_routes (new_routes, false);
1554 save_state (_current_snapshot_name);
1560 /** Caller must hold process lock.
1561 * @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1562 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1563 * @param output_start As \a input_start, but for outputs.
1566 Session::auto_connect_route (
1567 Route* route, ChanCount& existing_inputs, ChanCount& existing_outputs, bool connect_inputs, ChanCount input_start, ChanCount output_start
1570 /* If both inputs and outputs are auto-connected to physical ports,
1571 use the max of input and output offsets to ensure auto-connected
1572 port numbers always match up (e.g. the first audio input and the
1573 first audio output of the route will have the same physical
1574 port number). Otherwise just use the lowest input or output
1578 const bool in_out_physical =
1579 (Config->get_input_auto_connect() & AutoConnectPhysical)
1580 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1583 const ChanCount in_offset = in_out_physical
1584 ? ChanCount::max(existing_inputs, existing_outputs)
1587 const ChanCount out_offset = in_out_physical
1588 ? ChanCount::max(existing_inputs, existing_outputs)
1591 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1592 vector<string> physinputs;
1593 vector<string> physoutputs;
1595 _engine.get_physical_outputs (*t, physoutputs);
1596 _engine.get_physical_inputs (*t, physinputs);
1598 if (!physinputs.empty() && connect_inputs) {
1599 uint32_t nphysical_in = physinputs.size();
1600 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1603 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1604 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1607 if (!port.empty() && route->input()->connect (
1608 route->input()->ports().port(*t, i), port, this)) {
1614 if (!physoutputs.empty()) {
1615 uint32_t nphysical_out = physoutputs.size();
1616 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1619 if (Config->get_output_auto_connect() & AutoConnectPhysical) {
1620 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1621 } else if (Config->get_output_auto_connect() & AutoConnectMaster) {
1622 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1623 port = _master_out->input()->ports().port(*t,
1624 i % _master_out->input()->n_ports().get(*t))->name();
1628 if (!port.empty() && route->output()->connect (
1629 route->output()->ports().port(*t, i), port, this)) {
1636 existing_inputs += route->n_inputs();
1637 existing_outputs += route->n_outputs();
1640 /** Caller must not hold process lock
1641 * @param name_template string to use for the start of the name, or "" to use "Audio".
1643 list< boost::shared_ptr<AudioTrack> >
1644 Session::new_audio_track (
1645 int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template
1648 char track_name[32];
1649 uint32_t track_id = 0;
1650 ChanCount existing_inputs;
1651 ChanCount existing_outputs;
1653 RouteList new_routes;
1654 list<boost::shared_ptr<AudioTrack> > ret;
1655 uint32_t control_id;
1657 count_existing_route_channels (existing_inputs, existing_outputs);
1659 control_id = ntracks() + nbusses() + 1;
1662 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), false)) {
1663 error << "cannot find name for new audio track" << endmsg;
1667 boost::shared_ptr<AudioTrack> track;
1670 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
1672 if (track->init ()) {
1676 track->use_new_diskstream();
1678 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1679 boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1682 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1684 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_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 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1693 error << string_compose (
1694 _("cannot configure %1 in/%2 out configuration for new audio track"),
1695 input_channels, output_channels)
1700 auto_connect_route (track.get(), existing_inputs, existing_outputs);
1704 route_group->add (track);
1707 track->non_realtime_input_change();
1709 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1710 track->set_remote_control_id (control_id);
1713 new_routes.push_back (track);
1714 ret.push_back (track);
1717 catch (failed_constructor &err) {
1718 error << _("Session: could not create new audio track.") << endmsg;
1722 catch (AudioEngine::PortRegistrationFailure& pfe) {
1724 error << pfe.what() << endmsg;
1732 if (!new_routes.empty()) {
1733 add_routes (new_routes, true);
1740 Session::set_remote_control_ids ()
1742 RemoteModel m = Config->get_remote_model();
1743 bool emit_signal = false;
1745 boost::shared_ptr<RouteList> r = routes.reader ();
1747 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1748 if (MixerOrdered == m) {
1749 int32_t order = (*i)->order_key(N_("signal"));
1750 (*i)->set_remote_control_id (order+1, false);
1752 } else if (EditorOrdered == m) {
1753 int32_t order = (*i)->order_key(N_("editor"));
1754 (*i)->set_remote_control_id (order+1, false);
1756 } else if (UserOrdered == m) {
1757 //do nothing ... only changes to remote id's are initiated by user
1762 Route::RemoteControlIDChange();
1766 /** Caller must not hold process lock.
1767 * @param name_template string to use for the start of the name, or "" to use "Bus".
1770 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
1773 uint32_t bus_id = 0;
1774 ChanCount existing_inputs;
1775 ChanCount existing_outputs;
1778 uint32_t control_id;
1780 count_existing_route_channels (existing_inputs, existing_outputs);
1782 control_id = ntracks() + nbusses() + 1;
1785 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), false)) {
1786 error << "cannot find name for new audio bus" << endmsg;
1791 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
1797 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1798 boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
1801 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1803 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1804 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1805 input_channels, output_channels)
1811 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1812 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1813 input_channels, output_channels)
1818 auto_connect_route (bus.get(), existing_inputs, existing_outputs, false);
1822 route_group->add (bus);
1824 bus->set_remote_control_id (control_id);
1827 bus->add_internal_return ();
1829 ret.push_back (bus);
1833 catch (failed_constructor &err) {
1834 error << _("Session: could not create new audio route.") << endmsg;
1838 catch (AudioEngine::PortRegistrationFailure& pfe) {
1839 error << pfe.what() << endmsg;
1849 add_routes (ret, true);
1857 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
1861 uint32_t control_id;
1863 uint32_t number = 0;
1865 if (!tree.read (template_path.c_str())) {
1869 XMLNode* node = tree.root();
1871 control_id = ntracks() + nbusses() + 1;
1875 XMLNode node_copy (*node); // make a copy so we can change the name if we need to
1877 std::string node_name = IO::name_from_state (*node_copy.children().front());
1879 /* generate a new name by adding a number to the end of the template name */
1880 if (!find_route_name (node_name.c_str(), ++number, name, sizeof(name), true)) {
1881 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
1885 /* set IO children to use the new name */
1886 XMLNodeList const & children = node_copy.children ();
1887 for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
1888 if ((*i)->name() == IO::state_node_name) {
1889 IO::set_name_in_state (**i, name);
1893 Track::zero_diskstream_id_in_xml (node_copy);
1896 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
1899 error << _("Session: cannot create track/bus from template description") << endmsg;
1903 if (boost::dynamic_pointer_cast<Track>(route)) {
1904 /* force input/output change signals so that the new diskstream
1905 picks up the configuration of the route. During session
1906 loading this normally happens in a different way.
1909 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1911 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
1912 change.after = route->input()->n_ports();
1913 route->input()->changed (change, this);
1914 change.after = route->output()->n_ports();
1915 route->output()->changed (change, this);
1918 route->set_remote_control_id (control_id);
1921 ret.push_back (route);
1924 catch (failed_constructor &err) {
1925 error << _("Session: could not create new route from template") << endmsg;
1929 catch (AudioEngine::PortRegistrationFailure& pfe) {
1930 error << pfe.what() << endmsg;
1939 add_routes (ret, true);
1946 Session::add_routes (RouteList& new_routes, bool save)
1949 RCUWriter<RouteList> writer (routes);
1950 boost::shared_ptr<RouteList> r = writer.get_copy ();
1951 r->insert (r->end(), new_routes.begin(), new_routes.end());
1954 /* if there is no control out and we're not in the middle of loading,
1955 resort the graph here. if there is a control out, we will resort
1956 toward the end of this method. if we are in the middle of loading,
1957 we will resort when done.
1960 if (!_monitor_out && IO::connecting_legal) {
1961 resort_routes_using (r);
1965 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
1967 boost::weak_ptr<Route> wpr (*x);
1968 boost::shared_ptr<Route> r (*x);
1970 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
1971 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
1972 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
1973 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
1974 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
1975 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
1976 r->order_key_changed.connect_same_thread (*this, boost::bind (&Session::route_order_key_changed, this));
1978 if (r->is_master()) {
1982 if (r->is_monitor()) {
1986 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
1988 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
1989 track_playlist_changed (boost::weak_ptr<Track> (tr));
1990 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
1992 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
1994 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
1999 if (_monitor_out && IO::connecting_legal) {
2001 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2002 if ((*x)->is_monitor()) {
2004 } else if ((*x)->is_master()) {
2007 (*x)->listen_via_monitor ();
2017 save_state (_current_snapshot_name);
2020 RouteAdded (new_routes); /* EMIT SIGNAL */
2021 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
2025 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2027 boost::shared_ptr<RouteList> r = routes.reader ();
2028 boost::shared_ptr<Send> s;
2030 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2031 if ((s = (*i)->internal_send_for (dest)) != 0) {
2032 s->amp()->gain_control()->set_value (0.0);
2038 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2040 boost::shared_ptr<RouteList> r = routes.reader ();
2041 boost::shared_ptr<Send> s;
2043 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2044 if ((s = (*i)->internal_send_for (dest)) != 0) {
2045 s->amp()->gain_control()->set_value (1.0);
2051 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2053 boost::shared_ptr<RouteList> r = routes.reader ();
2054 boost::shared_ptr<Send> s;
2056 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2057 if ((s = (*i)->internal_send_for (dest)) != 0) {
2058 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2063 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2065 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2067 boost::shared_ptr<RouteList> r = routes.reader ();
2068 boost::shared_ptr<RouteList> t (new RouteList);
2070 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2071 if (include_buses || boost::dynamic_pointer_cast<Track>(*i)) {
2076 add_internal_sends (dest, p, t);
2080 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2082 if (dest->is_monitor() || dest->is_master()) {
2086 if (!dest->internal_return()) {
2087 dest->add_internal_return();
2090 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2092 if ((*i)->is_monitor() || (*i)->is_master() || (*i) == dest) {
2096 (*i)->listen_via (dest, p);
2103 Session::remove_route (boost::shared_ptr<Route> route)
2105 if (((route == _master_out) || (route == _monitor_out)) && !Config->get_allow_special_bus_removal()) {
2109 route->set_solo (false, this);
2112 RCUWriter<RouteList> writer (routes);
2113 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2117 /* deleting the master out seems like a dumb
2118 idea, but its more of a UI policy issue
2122 if (route == _master_out) {
2123 _master_out = boost::shared_ptr<Route> ();
2126 if (route == _monitor_out) {
2128 /* cancel control outs for all routes */
2130 for (RouteList::iterator r = rs->begin(); r != rs->end(); ++r) {
2131 (*r)->drop_listen (_monitor_out);
2134 _monitor_out.reset ();
2137 /* writer goes out of scope, forces route list update */
2140 update_route_solo_state ();
2142 // We need to disconnect the route's inputs and outputs
2144 route->input()->disconnect (0);
2145 route->output()->disconnect (0);
2147 /* if the route had internal sends sending to it, remove them */
2148 if (route->internal_return()) {
2150 boost::shared_ptr<RouteList> r = routes.reader ();
2151 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2152 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2154 (*i)->remove_processor (s);
2159 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2160 if (mt && mt->step_editing()) {
2161 if (_step_editors > 0) {
2166 update_latency_compensation (false, false);
2169 /* Re-sort routes to remove the graph's current references to the one that is
2170 * going away, then flush old references out of the graph.
2174 route_graph->clear_other_chain ();
2176 /* get rid of it from the dead wood collection in the route list manager */
2178 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2182 /* try to cause everyone to drop their references */
2184 route->drop_references ();
2186 sync_order_keys (N_("session"));
2188 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2190 /* save the new state of the world */
2192 if (save_state (_current_snapshot_name)) {
2193 save_history (_current_snapshot_name);
2198 Session::route_mute_changed (void* /*src*/)
2204 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2206 boost::shared_ptr<Route> route = wpr.lock();
2208 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2212 if (route->listening_via_monitor ()) {
2214 if (Config->get_exclusive_solo()) {
2215 /* new listen: disable all other listen */
2216 boost::shared_ptr<RouteList> r = routes.reader ();
2217 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2218 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2221 (*i)->set_listen (false, this);
2227 } else if (_listen_cnt > 0) {
2232 update_route_solo_state ();
2235 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2237 boost::shared_ptr<Route> route = wpr.lock ();
2240 /* should not happen */
2241 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2245 bool send_changed = false;
2247 if (route->solo_isolated()) {
2248 if (_solo_isolated_cnt == 0) {
2249 send_changed = true;
2251 _solo_isolated_cnt++;
2252 } else if (_solo_isolated_cnt > 0) {
2253 _solo_isolated_cnt--;
2254 if (_solo_isolated_cnt == 0) {
2255 send_changed = true;
2260 IsolatedChanged (); /* EMIT SIGNAL */
2265 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2267 if (!self_solo_change) {
2268 // session doesn't care about changes to soloed-by-others
2272 if (solo_update_disabled) {
2277 boost::shared_ptr<Route> route = wpr.lock ();
2280 /* should not happen */
2281 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2285 boost::shared_ptr<RouteList> r = routes.reader ();
2288 if (route->self_soloed()) {
2294 if (delta == 1 && Config->get_exclusive_solo()) {
2295 /* new solo: disable all other solos */
2296 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2297 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2300 (*i)->set_solo (false, this);
2304 solo_update_disabled = true;
2306 RouteList uninvolved;
2308 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2309 bool via_sends_only;
2310 bool in_signal_flow;
2312 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2316 in_signal_flow = false;
2318 if ((*i)->feeds (route, &via_sends_only)) {
2319 if (!via_sends_only) {
2320 if (!route->soloed_by_others_upstream()) {
2321 (*i)->mod_solo_by_others_downstream (delta);
2323 in_signal_flow = true;
2327 if (route->feeds (*i, &via_sends_only)) {
2328 (*i)->mod_solo_by_others_upstream (delta);
2329 in_signal_flow = true;
2332 if (!in_signal_flow) {
2333 uninvolved.push_back (*i);
2337 solo_update_disabled = false;
2338 update_route_solo_state (r);
2340 /* now notify that the mute state of the routes not involved in the signal
2341 pathway of the just-solo-changed route may have altered.
2344 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2345 (*i)->mute_changed (this);
2348 SoloChanged (); /* EMIT SIGNAL */
2353 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2355 /* now figure out if anything that matters is soloed (or is "listening")*/
2357 bool something_soloed = false;
2358 uint32_t listeners = 0;
2359 uint32_t isolated = 0;
2362 r = routes.reader();
2365 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2366 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2367 something_soloed = true;
2370 if (!(*i)->is_hidden() && (*i)->listening_via_monitor()) {
2371 if (Config->get_solo_control_is_listen_control()) {
2374 (*i)->set_listen (false, this);
2378 if ((*i)->solo_isolated()) {
2383 if (something_soloed != _non_soloed_outs_muted) {
2384 _non_soloed_outs_muted = something_soloed;
2385 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2388 _listen_cnt = listeners;
2390 if (isolated != _solo_isolated_cnt) {
2391 _solo_isolated_cnt = isolated;
2392 IsolatedChanged (); /* EMIT SIGNAL */
2396 boost::shared_ptr<RouteList>
2397 Session::get_routes_with_internal_returns() const
2399 boost::shared_ptr<RouteList> r = routes.reader ();
2400 boost::shared_ptr<RouteList> rl (new RouteList);
2402 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2403 if ((*i)->internal_return ()) {
2411 Session::io_name_is_legal (const std::string& name)
2413 boost::shared_ptr<RouteList> r = routes.reader ();
2415 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2416 if ((*i)->name() == name) {
2420 if ((*i)->has_io_processor_named (name)) {
2428 boost::shared_ptr<Route>
2429 Session::route_by_name (string name)
2431 boost::shared_ptr<RouteList> r = routes.reader ();
2433 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2434 if ((*i)->name() == name) {
2439 return boost::shared_ptr<Route> ((Route*) 0);
2442 boost::shared_ptr<Route>
2443 Session::route_by_id (PBD::ID id)
2445 boost::shared_ptr<RouteList> r = routes.reader ();
2447 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2448 if ((*i)->id() == id) {
2453 return boost::shared_ptr<Route> ((Route*) 0);
2456 boost::shared_ptr<Route>
2457 Session::route_by_remote_id (uint32_t id)
2459 boost::shared_ptr<RouteList> r = routes.reader ();
2461 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2462 if ((*i)->remote_control_id() == id) {
2467 return boost::shared_ptr<Route> ((Route*) 0);
2471 Session::playlist_region_added (boost::weak_ptr<Region> w)
2473 boost::shared_ptr<Region> r = w.lock ();
2478 /* These are the operations that are currently in progress... */
2479 list<GQuark> curr = _current_trans_quarks;
2482 /* ...and these are the operations during which we want to update
2483 the session range location markers.
2486 ops.push_back (Operations::capture);
2487 ops.push_back (Operations::paste);
2488 ops.push_back (Operations::duplicate_region);
2489 ops.push_back (Operations::insert_file);
2490 ops.push_back (Operations::insert_region);
2491 ops.push_back (Operations::drag_region_brush);
2492 ops.push_back (Operations::region_drag);
2493 ops.push_back (Operations::selection_grab);
2494 ops.push_back (Operations::region_fill);
2495 ops.push_back (Operations::fill_selection);
2496 ops.push_back (Operations::create_region);
2499 /* See if any of the current operations match the ones that we want */
2501 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2503 /* If so, update the session range markers */
2505 maybe_update_session_range (r->position (), r->last_frame ());
2509 /** Update the session range markers if a is before the current start or
2510 * b is after the current end.
2513 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2515 if (_state_of_the_state & Loading) {
2519 if (_session_range_location == 0) {
2521 add_session_range_location (a, b);
2525 if (a < _session_range_location->start()) {
2526 _session_range_location->set_start (a);
2529 if (b > _session_range_location->end()) {
2530 _session_range_location->set_end (b);
2536 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2538 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2539 maybe_update_session_range (i->to, i->to + i->length);
2543 /* Region management */
2545 boost::shared_ptr<Region>
2546 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2548 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2549 RegionFactory::RegionMap::const_iterator i;
2550 boost::shared_ptr<Region> region;
2552 Glib::Mutex::Lock lm (region_lock);
2554 for (i = regions.begin(); i != regions.end(); ++i) {
2558 if (region->whole_file()) {
2560 if (child->source_equivalent (region)) {
2566 return boost::shared_ptr<Region> ();
2570 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2572 set<boost::shared_ptr<Region> > relevant_regions;
2574 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2575 RegionFactory::get_regions_using_source (*s, relevant_regions);
2578 cerr << "There are " << relevant_regions.size() << " using " << srcs.size() << " sources" << endl;
2580 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2581 set<boost::shared_ptr<Region> >::iterator tmp;
2586 cerr << "Cleanup " << (*r)->name() << " UC = " << (*r).use_count() << endl;
2588 playlists->destroy_region (*r);
2589 RegionFactory::map_remove (*r);
2591 (*r)->drop_sources ();
2592 (*r)->drop_references ();
2594 cerr << "\tdone UC = " << (*r).use_count() << endl;
2596 relevant_regions.erase (r);
2601 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2604 Glib::Mutex::Lock ls (source_lock);
2605 /* remove from the main source list */
2606 sources.erase ((*s)->id());
2609 (*s)->mark_for_remove ();
2610 (*s)->drop_references ();
2619 Session::remove_last_capture ()
2621 list<boost::shared_ptr<Source> > srcs;
2623 boost::shared_ptr<RouteList> rl = routes.reader ();
2624 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2625 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2630 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2633 srcs.insert (srcs.end(), l.begin(), l.end());
2638 destroy_sources (srcs);
2640 save_state (_current_snapshot_name);
2645 /* Source Management */
2648 Session::add_source (boost::shared_ptr<Source> source)
2650 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2651 pair<SourceMap::iterator,bool> result;
2653 entry.first = source->id();
2654 entry.second = source;
2657 Glib::Mutex::Lock lm (source_lock);
2658 result = sources.insert (entry);
2661 if (result.second) {
2663 /* yay, new source */
2667 boost::shared_ptr<AudioFileSource> afs;
2669 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2670 if (Config->get_auto_analyse_audio()) {
2671 Analyser::queue_source_for_analysis (source, false);
2678 Session::remove_source (boost::weak_ptr<Source> src)
2680 SourceMap::iterator i;
2681 boost::shared_ptr<Source> source = src.lock();
2688 Glib::Mutex::Lock lm (source_lock);
2690 if ((i = sources.find (source->id())) != sources.end()) {
2691 cerr << "Removing source " << source->name() << endl;
2696 if (!_state_of_the_state & InCleanup) {
2698 /* save state so we don't end up with a session file
2699 referring to non-existent sources.
2702 save_state (_current_snapshot_name);
2706 boost::shared_ptr<Source>
2707 Session::source_by_id (const PBD::ID& id)
2709 Glib::Mutex::Lock lm (source_lock);
2710 SourceMap::iterator i;
2711 boost::shared_ptr<Source> source;
2713 if ((i = sources.find (id)) != sources.end()) {
2720 boost::shared_ptr<Source>
2721 Session::source_by_path_and_channel (const string& path, uint16_t chn)
2723 Glib::Mutex::Lock lm (source_lock);
2725 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2726 boost::shared_ptr<AudioFileSource> afs
2727 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
2729 if (afs && afs->path() == path && chn == afs->channel()) {
2733 return boost::shared_ptr<Source>();
2737 Session::count_sources_by_origin (const string& path)
2740 Glib::Mutex::Lock lm (source_lock);
2742 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2743 boost::shared_ptr<FileSource> fs
2744 = boost::dynamic_pointer_cast<FileSource>(i->second);
2746 if (fs && fs->origin() == path) {
2756 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
2759 string old_basename = PBD::basename_nosuffix (oldname);
2760 string new_legalized = legalize_for_path (newname);
2762 /* note: we know (or assume) the old path is already valid */
2766 /* destructive file sources have a name of the form:
2768 /path/to/Tnnnn-NAME(%[LR])?.wav
2770 the task here is to replace NAME with the new name.
2775 string::size_type dash;
2777 dir = Glib::path_get_dirname (path);
2778 path = Glib::path_get_basename (path);
2780 /* '-' is not a legal character for the NAME part of the path */
2782 if ((dash = path.find_last_of ('-')) == string::npos) {
2786 prefix = path.substr (0, dash);
2790 path += new_legalized;
2791 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
2792 path = Glib::build_filename (dir, path);
2796 /* non-destructive file sources have a name of the form:
2798 /path/to/NAME-nnnnn(%[LR])?.ext
2800 the task here is to replace NAME with the new name.
2805 string::size_type dash;
2806 string::size_type postfix;
2808 dir = Glib::path_get_dirname (path);
2809 path = Glib::path_get_basename (path);
2811 /* '-' is not a legal character for the NAME part of the path */
2813 if ((dash = path.find_last_of ('-')) == string::npos) {
2817 suffix = path.substr (dash+1);
2819 // Suffix is now everything after the dash. Now we need to eliminate
2820 // the nnnnn part, which is done by either finding a '%' or a '.'
2822 postfix = suffix.find_last_of ("%");
2823 if (postfix == string::npos) {
2824 postfix = suffix.find_last_of ('.');
2827 if (postfix != string::npos) {
2828 suffix = suffix.substr (postfix);
2830 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
2834 const uint32_t limit = 10000;
2835 char buf[PATH_MAX+1];
2837 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
2839 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
2841 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
2842 path = Glib::build_filename (dir, buf);
2850 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
2859 /** Return the full path (in some session directory) for a new within-session source.
2860 * \a name must be a session-unique name that does not contain slashes
2861 * (e.g. as returned by new_*_source_name)
2864 Session::new_source_path_from_name (DataType type, const string& name, bool as_stub)
2866 assert(name.find("/") == string::npos);
2868 SessionDirectory sdir(get_best_session_directory_for_new_source());
2871 if (type == DataType::AUDIO) {
2872 p = (as_stub ? sdir.sound_stub_path() : sdir.sound_path());
2873 } else if (type == DataType::MIDI) {
2874 p = (as_stub ? sdir.midi_stub_path() : sdir.midi_path());
2876 error << "Unknown source type, unable to create file path" << endmsg;
2881 return p.to_string();
2885 Session::peak_path (string base) const
2887 sys::path peakfile_path(_session_dir->peak_path());
2888 peakfile_path /= base + peakfile_suffix;
2889 return peakfile_path.to_string();
2892 /** Return a unique name based on \a base for a new internal audio source */
2894 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
2897 char buf[PATH_MAX+1];
2898 const uint32_t limit = 10000;
2900 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
2903 legalized = legalize_for_path (base);
2905 // Find a "version" of the base name that doesn't exist in any of the possible directories.
2906 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
2908 vector<space_and_path>::iterator i;
2909 uint32_t existing = 0;
2911 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2916 snprintf (buf, sizeof(buf), "T%04d-%s%s",
2917 cnt, legalized.c_str(), ext.c_str());
2918 } else if (nchan == 2) {
2920 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
2921 cnt, legalized.c_str(), ext.c_str());
2923 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
2924 cnt, legalized.c_str(), ext.c_str());
2926 } else if (nchan < 26) {
2927 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
2928 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
2930 snprintf (buf, sizeof(buf), "T%04d-%s%s",
2931 cnt, legalized.c_str(), ext.c_str());
2937 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
2938 } else if (nchan == 2) {
2940 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
2942 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
2944 } else if (nchan < 26) {
2945 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
2947 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
2951 SessionDirectory sdir((*i).path);
2953 string spath = sdir.sound_path().to_string();
2954 string spath_stubs = sdir.sound_stub_path().to_string();
2956 /* note that we search *without* the extension so that
2957 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
2958 in the event that this new name is required for
2959 a file format change.
2962 if (matching_unsuffixed_filename_exists_in (spath, buf) ||
2963 matching_unsuffixed_filename_exists_in (spath_stubs, buf)) {
2969 if (existing == 0) {
2974 error << string_compose(
2975 _("There are already %1 recordings for %2, which I consider too many."),
2976 limit, base) << endmsg;
2978 throw failed_constructor();
2982 return Glib::path_get_basename (buf);
2985 /** Create a new within-session audio source */
2986 boost::shared_ptr<AudioFileSource>
2987 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive, bool as_stub)
2989 const string name = new_audio_source_name (n, n_chans, chan, destructive);
2990 const string path = new_source_path_from_name(DataType::AUDIO, name, as_stub);
2992 return boost::dynamic_pointer_cast<AudioFileSource> (
2993 SourceFactory::createWritable (DataType::AUDIO, *this, path, string(), destructive, frame_rate()));
2996 /** Return a unique name based on \a base for a new internal MIDI source */
2998 Session::new_midi_source_name (const string& base)
3001 char buf[PATH_MAX+1];
3002 const uint32_t limit = 10000;
3006 legalized = legalize_for_path (base);
3008 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3009 for (cnt = 1; cnt <= limit; ++cnt) {
3011 vector<space_and_path>::iterator i;
3012 uint32_t existing = 0;
3014 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3016 SessionDirectory sdir((*i).path);
3018 sys::path p = sdir.midi_path();
3021 snprintf (buf, sizeof(buf), "%s-%u.mid", p.to_string().c_str(), cnt);
3023 if (sys::exists (buf)) {
3028 if (existing == 0) {
3033 error << string_compose(
3034 _("There are already %1 recordings for %2, which I consider too many."),
3035 limit, base) << endmsg;
3037 throw failed_constructor();
3041 return Glib::path_get_basename(buf);
3045 /** Create a new within-session MIDI source */
3046 boost::shared_ptr<MidiSource>
3047 Session::create_midi_source_for_session (Track* track, string const & n, bool as_stub)
3049 /* try to use the existing write source for the track, to keep numbering sane
3053 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3057 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3060 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3061 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3065 const string name = new_midi_source_name (n);
3066 const string path = new_source_path_from_name (DataType::MIDI, name, as_stub);
3068 return boost::dynamic_pointer_cast<SMFSource> (
3069 SourceFactory::createWritable (
3070 DataType::MIDI, *this, path, string(), false, frame_rate()));
3075 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3077 if (playlist->hidden()) {
3081 playlists->add (playlist);
3084 playlist->release();
3091 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3093 if (_state_of_the_state & Deletion) {
3097 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3103 playlists->remove (playlist);
3109 Session::set_audition (boost::shared_ptr<Region> r)
3111 pending_audition_region = r;
3112 add_post_transport_work (PostTransportAudition);
3113 _butler->schedule_transport_work ();
3117 Session::audition_playlist ()
3119 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3120 ev->region.reset ();
3125 Session::non_realtime_set_audition ()
3127 if (!pending_audition_region) {
3128 auditioner->audition_current_playlist ();
3130 auditioner->audition_region (pending_audition_region);
3131 pending_audition_region.reset ();
3133 AuditionActive (true); /* EMIT SIGNAL */
3137 Session::audition_region (boost::shared_ptr<Region> r)
3139 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3145 Session::cancel_audition ()
3147 if (auditioner->auditioning()) {
3148 auditioner->cancel_audition ();
3149 AuditionActive (false); /* EMIT SIGNAL */
3154 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3156 if (a->is_monitor()) {
3159 if (b->is_monitor()) {
3162 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3166 Session::is_auditioning () const
3168 /* can be called before we have an auditioner object */
3170 return auditioner->auditioning();
3177 Session::graph_reordered ()
3179 /* don't do this stuff if we are setting up connections
3180 from a set_state() call or creating new tracks. Ditto for deletion.
3183 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3187 /* every track/bus asked for this to be handled but it was deferred because
3188 we were connecting. do it now.
3191 request_input_change_handling ();
3195 /* force all diskstreams to update their capture offset values to
3196 reflect any changes in latencies within the graph.
3199 boost::shared_ptr<RouteList> rl = routes.reader ();
3200 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3201 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3203 tr->set_capture_offset ();
3209 Session::available_capture_duration ()
3211 float sample_bytes_on_disk = 4.0; // keep gcc happy
3213 switch (config.get_native_file_data_format()) {
3215 sample_bytes_on_disk = 4.0;
3219 sample_bytes_on_disk = 3.0;
3223 sample_bytes_on_disk = 2.0;
3227 /* impossible, but keep some gcc versions happy */
3228 fatal << string_compose (_("programming error: %1"),
3229 X_("illegal native file data format"))
3234 double scale = 4096.0 / sample_bytes_on_disk;
3236 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3237 return max_framecnt;
3240 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3244 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3247 RCUWriter<BundleList> writer (_bundles);
3248 boost::shared_ptr<BundleList> b = writer.get_copy ();
3249 b->push_back (bundle);
3252 BundleAdded (bundle); /* EMIT SIGNAL */
3258 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3260 bool removed = false;
3263 RCUWriter<BundleList> writer (_bundles);
3264 boost::shared_ptr<BundleList> b = writer.get_copy ();
3265 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3267 if (i != b->end()) {
3274 BundleRemoved (bundle); /* EMIT SIGNAL */
3280 boost::shared_ptr<Bundle>
3281 Session::bundle_by_name (string name) const
3283 boost::shared_ptr<BundleList> b = _bundles.reader ();
3285 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3286 if ((*i)->name() == name) {
3291 return boost::shared_ptr<Bundle> ();
3295 Session::tempo_map_changed (const PropertyChange&)
3299 playlists->update_after_tempo_map_change ();
3301 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3307 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3309 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3310 (*i)->recompute_frames_from_bbt ();
3314 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3315 * the given count with the current block size.
3318 Session::ensure_buffers (ChanCount howmany)
3320 BufferManager::ensure_buffers (howmany);
3324 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3326 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3327 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3332 Session::next_insert_id ()
3334 /* this doesn't really loop forever. just think about it */
3337 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3338 if (!insert_bitset[n]) {
3339 insert_bitset[n] = true;
3345 /* none available, so resize and try again */
3347 insert_bitset.resize (insert_bitset.size() + 16, false);
3352 Session::next_send_id ()
3354 /* this doesn't really loop forever. just think about it */
3357 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3358 if (!send_bitset[n]) {
3359 send_bitset[n] = true;
3365 /* none available, so resize and try again */
3367 send_bitset.resize (send_bitset.size() + 16, false);
3372 Session::next_return_id ()
3374 /* this doesn't really loop forever. just think about it */
3377 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3378 if (!return_bitset[n]) {
3379 return_bitset[n] = true;
3385 /* none available, so resize and try again */
3387 return_bitset.resize (return_bitset.size() + 16, false);
3392 Session::mark_send_id (uint32_t id)
3394 if (id >= send_bitset.size()) {
3395 send_bitset.resize (id+16, false);
3397 if (send_bitset[id]) {
3398 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3400 send_bitset[id] = true;
3404 Session::mark_return_id (uint32_t id)
3406 if (id >= return_bitset.size()) {
3407 return_bitset.resize (id+16, false);
3409 if (return_bitset[id]) {
3410 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3412 return_bitset[id] = true;
3416 Session::mark_insert_id (uint32_t id)
3418 if (id >= insert_bitset.size()) {
3419 insert_bitset.resize (id+16, false);
3421 if (insert_bitset[id]) {
3422 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3424 insert_bitset[id] = true;
3428 Session::unmark_send_id (uint32_t id)
3430 if (id < send_bitset.size()) {
3431 send_bitset[id] = false;
3436 Session::unmark_return_id (uint32_t id)
3438 if (id < return_bitset.size()) {
3439 return_bitset[id] = false;
3444 Session::unmark_insert_id (uint32_t id)
3446 if (id < insert_bitset.size()) {
3447 insert_bitset[id] = false;
3452 /* Named Selection management */
3454 boost::shared_ptr<NamedSelection>
3455 Session::named_selection_by_name (string name)
3457 Glib::Mutex::Lock lm (named_selection_lock);
3458 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3459 if ((*i)->name == name) {
3463 return boost::shared_ptr<NamedSelection>();
3467 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3470 Glib::Mutex::Lock lm (named_selection_lock);
3471 named_selections.insert (named_selections.begin(), named_selection);
3476 NamedSelectionAdded (); /* EMIT SIGNAL */
3480 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3482 bool removed = false;
3485 Glib::Mutex::Lock lm (named_selection_lock);
3487 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3489 if (i != named_selections.end()) {
3490 named_selections.erase (i);
3497 NamedSelectionRemoved (); /* EMIT SIGNAL */
3502 Session::reset_native_file_format ()
3504 boost::shared_ptr<RouteList> rl = routes.reader ();
3505 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3506 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3508 /* don't save state as we do this, there's no point
3511 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3512 tr->reset_write_sources (false);
3513 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3519 Session::route_name_unique (string n) const
3521 boost::shared_ptr<RouteList> r = routes.reader ();
3523 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3524 if ((*i)->name() == n) {
3533 Session::route_name_internal (string n) const
3535 if (auditioner && auditioner->name() == n) {
3539 if (_click_io && _click_io->name() == n) {
3547 Session::freeze_all (InterThreadInfo& itt)
3549 boost::shared_ptr<RouteList> r = routes.reader ();
3551 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3553 boost::shared_ptr<Track> t;
3555 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3556 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3566 boost::shared_ptr<Region>
3567 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3568 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3569 InterThreadInfo& itt, bool enable_processing)
3571 boost::shared_ptr<Region> result;
3572 boost::shared_ptr<Playlist> playlist;
3573 boost::shared_ptr<AudioFileSource> fsource;
3575 char buf[PATH_MAX+1];
3576 ChanCount diskstream_channels (track.n_channels());
3577 framepos_t position;
3578 framecnt_t this_chunk;
3581 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3582 const string sound_dir = sdir.sound_path().to_string();
3583 framepos_t len = end - start;
3584 bool need_block_size_reset = false;
3586 ChanCount const max_proc = track.max_processor_streams ();
3589 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3590 end, start) << endmsg;
3594 const framecnt_t chunk_size = (256 * 1024)/4;
3596 // block all process callback handling
3598 block_processing ();
3600 /* call tree *MUST* hold route_lock */
3602 if ((playlist = track.playlist()) == 0) {
3606 /* external redirects will be a problem */
3608 if (track.has_external_redirects()) {
3612 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3614 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
3616 for (x = 0; x < 99999; ++x) {
3617 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());
3618 if (access (buf, F_OK) != 0) {
3624 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3629 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3630 SourceFactory::createWritable (DataType::AUDIO, *this, buf, string(), false, frame_rate()));
3633 catch (failed_constructor& err) {
3634 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3638 srcs.push_back (fsource);
3641 /* tell redirects that care that we are about to use a much larger blocksize */
3643 need_block_size_reset = true;
3644 track.set_block_size (chunk_size);
3646 /* XXX need to flush all redirects */
3651 /* create a set of reasonably-sized buffers */
3652 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
3653 buffers.set_count (max_proc);
3655 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3656 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3658 afs->prepare_for_peakfile_writes ();
3661 while (to_do && !itt.cancel) {
3663 this_chunk = min (to_do, chunk_size);
3665 if (track.export_stuff (buffers, start, this_chunk, enable_processing)) {
3670 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
3671 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3674 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
3680 start += this_chunk;
3681 to_do -= this_chunk;
3683 itt.progress = (float) (1.0 - ((double) to_do / len));
3692 xnow = localtime (&now);
3694 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3695 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3698 afs->update_header (position, *xnow, now);
3699 afs->flush_header ();
3703 /* construct a region to represent the bounced material */
3707 plist.add (Properties::start, 0);
3708 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
3709 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
3711 result = RegionFactory::create (srcs, plist);
3717 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3718 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3721 afs->mark_for_remove ();
3724 (*src)->drop_references ();
3728 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3729 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3732 afs->done_with_peakfile_writes ();
3737 if (need_block_size_reset) {
3738 track.set_block_size (get_block_size());
3741 unblock_processing ();
3747 Session::gain_automation_buffer() const
3749 return ProcessThread::gain_automation_buffer ();
3753 Session::pan_automation_buffer() const
3755 return ProcessThread::pan_automation_buffer ();
3759 Session::get_silent_buffers (ChanCount count)
3761 return ProcessThread::get_silent_buffers (count);
3763 assert(_silent_buffers->available() >= count);
3764 _silent_buffers->set_count(count);
3766 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3767 for (size_t i= 0; i < count.get(*t); ++i) {
3768 _silent_buffers->get(*t, i).clear();
3772 return *_silent_buffers;
3777 Session::get_scratch_buffers (ChanCount count)
3779 return ProcessThread::get_scratch_buffers (count);
3781 if (count != ChanCount::ZERO) {
3782 assert(_scratch_buffers->available() >= count);
3783 _scratch_buffers->set_count(count);
3785 _scratch_buffers->set_count (_scratch_buffers->available());
3788 return *_scratch_buffers;
3793 Session::get_mix_buffers (ChanCount count)
3795 return ProcessThread::get_mix_buffers (count);
3797 assert(_mix_buffers->available() >= count);
3798 _mix_buffers->set_count(count);
3799 return *_mix_buffers;
3804 Session::ntracks () const
3807 boost::shared_ptr<RouteList> r = routes.reader ();
3809 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3810 if (boost::dynamic_pointer_cast<Track> (*i)) {
3819 Session::nbusses () const
3822 boost::shared_ptr<RouteList> r = routes.reader ();
3824 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3825 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
3834 Session::add_automation_list(AutomationList *al)
3836 automation_lists[al->id()] = al;
3840 Session::sync_order_keys (std::string const & base)
3842 if (deletion_in_progress()) {
3846 if (!Config->get_sync_all_route_ordering()) {
3847 /* leave order keys as they are */
3851 boost::shared_ptr<RouteList> r = routes.reader ();
3853 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3854 (*i)->sync_order_keys (base);
3857 Route::SyncOrderKeys (base); // EMIT SIGNAL
3859 /* this might not do anything */
3861 set_remote_control_ids ();
3864 /** @return true if there is at least one record-enabled track, otherwise false */
3866 Session::have_rec_enabled_track () const
3868 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
3871 /** Update the state of our rec-enabled tracks flag */
3873 Session::update_have_rec_enabled_track ()
3875 boost::shared_ptr<RouteList> rl = routes.reader ();
3876 RouteList::iterator i = rl->begin();
3877 while (i != rl->end ()) {
3879 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3880 if (tr && tr->record_enabled ()) {
3887 int const old = g_atomic_int_get (&_have_rec_enabled_track);
3889 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
3891 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
3892 RecordStateChanged (); /* EMIT SIGNAL */
3897 Session::listen_position_changed ()
3899 boost::shared_ptr<RouteList> r = routes.reader ();
3901 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3902 (*i)->listen_position_changed ();
3907 Session::solo_control_mode_changed ()
3909 /* cancel all solo or all listen when solo control mode changes */
3912 set_solo (get_routes(), false);
3913 } else if (listening()) {
3914 set_listen (get_routes(), false);
3918 /** Called when anything about any of our route groups changes (membership, state etc.) */
3920 Session::route_group_changed ()
3922 RouteGroupChanged (); /* EMIT SIGNAL */
3926 Session::get_available_sync_options () const
3928 vector<SyncSource> ret;
3930 ret.push_back (JACK);
3931 ret.push_back (MTC);
3932 ret.push_back (MIDIClock);
3937 boost::shared_ptr<RouteList>
3938 Session::get_routes_with_regions_at (framepos_t const p) const
3940 boost::shared_ptr<RouteList> r = routes.reader ();
3941 boost::shared_ptr<RouteList> rl (new RouteList);
3943 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3944 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3949 boost::shared_ptr<Playlist> pl = tr->playlist ();
3954 if (pl->has_region_at (p)) {
3963 Session::goto_end ()
3965 if (_session_range_location) {
3966 request_locate (_session_range_location->end(), false);
3968 request_locate (0, false);
3973 Session::goto_start ()
3975 if (_session_range_location) {
3976 request_locate (_session_range_location->start(), false);
3978 request_locate (0, false);
3983 Session::current_start_frame () const
3985 return _session_range_location ? _session_range_location->start() : 0;
3989 Session::current_end_frame () const
3991 return _session_range_location ? _session_range_location->end() : 0;
3995 Session::add_session_range_location (framepos_t start, framepos_t end)
3997 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
3998 _locations->add (_session_range_location);
4001 /** Called when one of our routes' order keys has changed */
4003 Session::route_order_key_changed ()
4005 RouteOrderKeyChanged (); /* EMIT SIGNAL */
4009 Session::step_edit_status_change (bool yn)
4015 send = (_step_editors == 0);
4020 send = (_step_editors == 1);
4023 if (_step_editors > 0) {
4029 StepEditStatusChange (val);
4035 Session::start_time_changed (framepos_t old)
4037 /* Update the auto loop range to match the session range
4038 (unless the auto loop range has been changed by the user)
4041 Location* s = _locations->session_range_location ();
4046 Location* l = _locations->auto_loop_location ();
4048 if (l->start() == old) {
4049 l->set_start (s->start(), true);
4054 Session::end_time_changed (framepos_t old)
4056 /* Update the auto loop range to match the session range
4057 (unless the auto loop range has been changed by the user)
4060 Location* s = _locations->session_range_location ();
4065 Location* l = _locations->auto_loop_location ();
4067 if (l->end() == old) {
4068 l->set_end (s->end(), true);
4073 Session::source_search_path (DataType type) const
4077 if (session_dirs.size() == 1) {
4079 case DataType::AUDIO:
4080 search_path = _session_dir->sound_path().to_string();
4082 case DataType::MIDI:
4083 search_path = _session_dir->midi_path().to_string();
4087 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4088 SessionDirectory sdir (i->path);
4089 if (!search_path.empty()) {
4093 case DataType::AUDIO:
4094 search_path += sdir.sound_path().to_string();
4096 case DataType::MIDI:
4097 search_path += sdir.midi_path().to_string();
4103 /* now add user-specified locations
4106 vector<string> dirs;
4109 case DataType::AUDIO:
4110 split (config.get_audio_search_path (), dirs, ':');
4112 case DataType::MIDI:
4113 split (config.get_midi_search_path (), dirs, ':');
4117 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4127 Session::ensure_search_path_includes (const string& path, DataType type)
4130 vector<string> dirs;
4137 case DataType::AUDIO:
4138 search_path = config.get_audio_search_path ();
4140 case DataType::MIDI:
4141 search_path = config.get_midi_search_path ();
4145 split (search_path, dirs, ':');
4147 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4153 if (!search_path.empty()) {
4157 search_path += path;
4160 case DataType::AUDIO:
4161 config.set_audio_search_path (search_path);
4163 case DataType::MIDI:
4164 config.set_midi_search_path (search_path);
4169 boost::shared_ptr<Speakers>
4170 Session::get_speakers()
4176 Session::unknown_processors () const
4180 boost::shared_ptr<RouteList> r = routes.reader ();
4181 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4182 list<string> t = (*i)->unknown_processors ();
4183 copy (t.begin(), t.end(), back_inserter (p));
4192 #ifdef HAVE_JACK_NEW_LATENCY
4194 Session::update_latency (bool playback)
4196 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback\n");
4198 boost::shared_ptr<RouteList> r = routes.reader ();
4201 /* reverse the list so that we work backwards from the last route to run to the first */
4202 reverse (r->begin(), r->end());
4205 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4206 DEBUG_TRACE (DEBUG::Latency, string_compose ("------------- Working on latency for %1\n", (*i)->name()));
4207 (*i)->set_latency_ranges (playback);
4208 DEBUG_TRACE (DEBUG::Latency, string_compose ("------------- Done working on latency for %1\n\n", (*i)->name()));