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));
768 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
773 Session::record_enabling_legal () const
775 /* this used to be in here, but survey says.... we don't need to restrict it */
776 // if (record_status() == Recording) {
780 if (Config->get_all_safe()) {
787 Session::reset_input_monitor_state ()
789 if (transport_rolling()) {
791 boost::shared_ptr<RouteList> rl = routes.reader ();
792 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
793 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
794 if (tr && tr->record_enabled ()) {
795 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
796 tr->monitor_input (Config->get_monitoring_model() == HardwareMonitoring && !config.get_auto_input());
802 boost::shared_ptr<RouteList> rl = routes.reader ();
803 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
804 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
805 if (tr && tr->record_enabled ()) {
806 //cerr << "switching to input = " << !Config->get_auto_input() << __FILE__ << __LINE__ << endl << endl;
807 tr->monitor_input (Config->get_monitoring_model() == HardwareMonitoring);
814 Session::auto_punch_start_changed (Location* location)
816 replace_event (SessionEvent::PunchIn, location->start());
818 if (get_record_enabled() && config.get_punch_in()) {
819 /* capture start has been changed, so save new pending state */
820 save_state ("", true);
825 Session::auto_punch_end_changed (Location* location)
827 framepos_t when_to_stop = location->end();
828 // when_to_stop += _worst_output_latency + _worst_input_latency;
829 replace_event (SessionEvent::PunchOut, when_to_stop);
833 Session::auto_punch_changed (Location* location)
835 framepos_t when_to_stop = location->end();
837 replace_event (SessionEvent::PunchIn, location->start());
838 //when_to_stop += _worst_output_latency + _worst_input_latency;
839 replace_event (SessionEvent::PunchOut, when_to_stop);
843 Session::auto_loop_changed (Location* location)
845 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
847 if (transport_rolling() && play_loop) {
850 // if (_transport_frame > location->end()) {
852 if (_transport_frame < location->start() || _transport_frame > location->end()) {
853 // relocate to beginning of loop
854 clear_events (SessionEvent::LocateRoll);
856 request_locate (location->start(), true);
859 else if (Config->get_seamless_loop() && !loop_changing) {
861 // schedule a locate-roll to refill the diskstreams at the
863 loop_changing = true;
865 if (location->end() > last_loopend) {
866 clear_events (SessionEvent::LocateRoll);
867 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
874 last_loopend = location->end();
878 Session::set_auto_punch_location (Location* location)
882 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
883 punch_connections.drop_connections();
884 existing->set_auto_punch (false, this);
885 remove_event (existing->start(), SessionEvent::PunchIn);
886 clear_events (SessionEvent::PunchOut);
887 auto_punch_location_changed (0);
896 if (location->end() <= location->start()) {
897 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
901 punch_connections.drop_connections ();
903 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
904 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
905 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
907 location->set_auto_punch (true, this);
909 auto_punch_changed (location);
911 auto_punch_location_changed (location);
915 Session::set_auto_loop_location (Location* location)
919 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
920 loop_connections.drop_connections ();
921 existing->set_auto_loop (false, this);
922 remove_event (existing->end(), SessionEvent::AutoLoop);
923 auto_loop_location_changed (0);
932 if (location->end() <= location->start()) {
933 error << _("Session: you can't use a mark for auto loop") << endmsg;
937 last_loopend = location->end();
939 loop_connections.drop_connections ();
941 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
942 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
943 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
945 location->set_auto_loop (true, this);
947 /* take care of our stuff first */
949 auto_loop_changed (location);
951 /* now tell everyone else */
953 auto_loop_location_changed (location);
957 Session::locations_added (Location *)
963 Session::locations_changed ()
965 _locations->apply (*this, &Session::handle_locations_changed);
969 Session::handle_locations_changed (Locations::LocationList& locations)
971 Locations::LocationList::iterator i;
973 bool set_loop = false;
974 bool set_punch = false;
976 for (i = locations.begin(); i != locations.end(); ++i) {
980 if (location->is_auto_punch()) {
981 set_auto_punch_location (location);
984 if (location->is_auto_loop()) {
985 set_auto_loop_location (location);
989 if (location->is_session_range()) {
990 _session_range_location = location;
995 set_auto_loop_location (0);
998 set_auto_punch_location (0);
1005 Session::enable_record ()
1008 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1010 if (rs == Recording) {
1014 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1016 _last_record_location = _transport_frame;
1017 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1019 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1021 boost::shared_ptr<RouteList> rl = routes.reader ();
1022 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1023 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1024 if (tr && tr->record_enabled ()) {
1025 tr->monitor_input (true);
1030 RecordStateChanged ();
1037 Session::disable_record (bool rt_context, bool force)
1041 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1043 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1044 g_atomic_int_set (&_record_status, Disabled);
1045 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1047 if (rs == Recording) {
1048 g_atomic_int_set (&_record_status, Enabled);
1052 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1054 boost::shared_ptr<RouteList> rl = routes.reader ();
1055 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1056 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1057 if (tr && tr->record_enabled ()) {
1058 tr->monitor_input (false);
1063 RecordStateChanged (); /* emit signal */
1066 remove_pending_capture_state ();
1072 Session::step_back_from_record ()
1074 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1076 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1077 boost::shared_ptr<RouteList> rl = routes.reader ();
1078 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1079 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1080 if (tr && tr->record_enabled ()) {
1081 //cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl;
1082 tr->monitor_input (false);
1090 Session::maybe_enable_record ()
1092 if (_step_editors > 0) {
1096 g_atomic_int_set (&_record_status, Enabled);
1098 /* This function is currently called from somewhere other than an RT thread.
1099 This save_state() call therefore doesn't impact anything. Doing it here
1100 means that we save pending state of which sources the next record will use,
1101 which gives us some chance of recovering from a crash during the record.
1104 save_state ("", true);
1106 if (_transport_speed) {
1107 if (!config.get_punch_in()) {
1111 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1112 RecordStateChanged (); /* EMIT SIGNAL */
1119 Session::audible_frame () const
1125 /* the first of these two possible settings for "offset"
1126 mean that the audible frame is stationary until
1127 audio emerges from the latency compensation
1130 the second means that the audible frame is stationary
1131 until audio would emerge from a physical port
1132 in the absence of any plugin latency compensation
1135 offset = _worst_output_latency;
1137 if (offset > current_block_size) {
1138 offset -= current_block_size;
1140 /* XXX is this correct? if we have no external
1141 physical connections and everything is internal
1142 then surely this is zero? still, how
1143 likely is that anyway?
1145 offset = current_block_size;
1148 if (synced_to_jack()) {
1149 tf = _engine.transport_frame();
1151 tf = _transport_frame;
1156 if (!non_realtime_work_pending()) {
1160 /* Check to see if we have passed the first guaranteed
1161 audible frame past our last start position. if not,
1162 return that last start point because in terms
1163 of audible frames, we have not moved yet.
1165 `Start position' in this context means the time we last
1166 either started or changed transport direction.
1169 if (_transport_speed > 0.0f) {
1171 if (!play_loop || !have_looped) {
1172 if (tf < _last_roll_or_reversal_location + offset) {
1173 return _last_roll_or_reversal_location;
1181 } else if (_transport_speed < 0.0f) {
1183 /* XXX wot? no backward looping? */
1185 if (tf > _last_roll_or_reversal_location - offset) {
1186 return _last_roll_or_reversal_location;
1198 Session::set_frame_rate (framecnt_t frames_per_second)
1200 /** \fn void Session::set_frame_size(framecnt_t)
1201 the AudioEngine object that calls this guarantees
1202 that it will not be called while we are also in
1203 ::process(). Its fine to do things that block
1207 _base_frame_rate = frames_per_second;
1211 Automatable::set_automation_interval (ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1215 // XXX we need some equivalent to this, somehow
1216 // SndFileSource::setup_standard_crossfades (frames_per_second);
1220 /* XXX need to reset/reinstantiate all LADSPA plugins */
1224 Session::set_block_size (pframes_t nframes)
1226 /* the AudioEngine guarantees
1227 that it will not be called while we are also in
1228 ::process(). It is therefore fine to do things that block
1233 current_block_size = nframes;
1237 boost::shared_ptr<RouteList> r = routes.reader ();
1239 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1240 (*i)->set_block_size (nframes);
1243 boost::shared_ptr<RouteList> rl = routes.reader ();
1244 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1245 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1247 tr->set_block_size (nframes);
1251 set_worst_io_latencies ();
1255 struct RouteSorter {
1256 /** @return true to run r1 before r2, otherwise false */
1257 bool operator() (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> r2) {
1258 if (r2->feeds (r1)) {
1259 /* r1 fed by r2; run r2 early */
1261 } else if (r1->feeds (r2)) {
1262 /* r2 fed by r1; run r1 early */
1265 if (r1->not_fed ()) {
1266 if (r2->not_fed ()) {
1267 /* no ardour-based connections inbound to either route. just use signal order */
1268 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1270 /* r2 has connections, r1 does not; run r1 early */
1274 if (r2->not_fed()) {
1275 /* r1 has connections, r2 does not; run r2 early */
1278 /* both r1 and r2 have connections, but not to each other. just use signal order */
1279 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1287 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1289 boost::shared_ptr<Route> r2;
1291 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1292 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1296 /* make a copy of the existing list of routes that feed r1 */
1298 Route::FedBy existing (r1->fed_by());
1300 /* for each route that feeds r1, recurse, marking it as feeding
1304 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1305 if (!(r2 = i->r.lock ())) {
1306 /* (*i) went away, ignore it */
1310 /* r2 is a route that feeds r1 which somehow feeds base. mark
1311 base as being fed by r2
1314 rbase->add_fed_by (r2, i->sends_only);
1318 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1322 if (r1->feeds (r2) && r2->feeds (r1)) {
1326 /* now recurse, so that we can mark base as being fed by
1327 all routes that feed r2
1330 trace_terminal (r2, rbase);
1337 Session::resort_routes ()
1339 /* don't do anything here with signals emitted
1340 by Routes while we are being destroyed.
1343 if (_state_of_the_state & Deletion) {
1348 RCUWriter<RouteList> writer (routes);
1349 boost::shared_ptr<RouteList> r = writer.get_copy ();
1350 resort_routes_using (r);
1351 /* writer goes out of scope and forces update */
1354 //route_graph->dump(1);
1357 boost::shared_ptr<RouteList> rl = routes.reader ();
1358 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1359 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1361 const Route::FedBy& fb ((*i)->fed_by());
1363 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1364 boost::shared_ptr<Route> sf = f->r.lock();
1366 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1374 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1376 RouteList::iterator i, j;
1378 for (i = r->begin(); i != r->end(); ++i) {
1380 (*i)->clear_fed_by ();
1382 for (j = r->begin(); j != r->end(); ++j) {
1384 /* although routes can feed themselves, it will
1385 cause an endless recursive descent if we
1386 detect it. so don't bother checking for
1394 bool via_sends_only;
1396 if ((*j)->direct_feeds (*i, &via_sends_only)) {
1397 (*i)->add_fed_by (*j, via_sends_only);
1402 for (i = r->begin(); i != r->end(); ++i) {
1403 trace_terminal (*i, *i);
1409 route_graph->rechain (r);
1412 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1413 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1414 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1415 (*i)->name(), (*i)->order_key ("signal")));
1421 /** Find a route name starting with \a base, maybe followed by the
1422 * lowest \a id. \a id will always be added if \a definitely_add_number
1423 * is true on entry; otherwise it will only be added if required
1424 * to make the name unique.
1426 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1427 * The available route name with the lowest ID will be used, and \a id
1428 * will be set to the ID.
1430 * \return false if a route name could not be found, and \a track_name
1431 * and \a id do not reflect a free route name.
1434 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1436 if (!definitely_add_number && route_by_name (base) == 0) {
1437 /* juse use the base */
1438 snprintf (name, name_len, "%s", base.c_str());
1443 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1445 if (route_by_name (name) == 0) {
1451 } while (id < (UINT_MAX-1));
1456 /** Count the total ins and outs of all non-hidden routes in the session and return them in in and out */
1458 Session::count_existing_route_channels (ChanCount& in, ChanCount& out)
1460 in = ChanCount::ZERO;
1461 out = ChanCount::ZERO;
1462 boost::shared_ptr<RouteList> r = routes.reader ();
1463 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1464 if (!(*i)->is_hidden()) {
1465 in += (*i)->n_inputs();
1466 out += (*i)->n_outputs();
1471 /** Caller must not hold process lock
1472 * @param name_template string to use for the start of the name, or "" to use "Midi".
1474 list<boost::shared_ptr<MidiTrack> >
1475 Session::new_midi_track (TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1477 char track_name[32];
1478 uint32_t track_id = 0;
1479 ChanCount existing_inputs;
1480 ChanCount existing_outputs;
1482 RouteList new_routes;
1483 list<boost::shared_ptr<MidiTrack> > ret;
1484 uint32_t control_id;
1486 count_existing_route_channels (existing_inputs, existing_outputs);
1488 control_id = ntracks() + nbusses();
1490 bool const use_number = (how_many != 1);
1493 if (!find_route_name (name_template.empty() ? _("Midi") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1494 error << "cannot find name for new midi track" << endmsg;
1498 boost::shared_ptr<MidiTrack> track;
1501 track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1503 if (track->init ()) {
1507 track->use_new_diskstream();
1509 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1510 boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1513 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1514 if (track->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1515 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1519 if (track->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1520 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1525 auto_connect_route (track.get(), existing_inputs, existing_outputs);
1527 track->non_realtime_input_change();
1530 route_group->add (track);
1533 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1534 track->set_remote_control_id (control_id);
1536 new_routes.push_back (track);
1537 ret.push_back (track);
1540 catch (failed_constructor &err) {
1541 error << _("Session: could not create new midi track.") << endmsg;
1545 catch (AudioEngine::PortRegistrationFailure& pfe) {
1547 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;
1555 if (!new_routes.empty()) {
1556 add_routes (new_routes, false);
1557 save_state (_current_snapshot_name);
1563 /** Caller must hold process lock.
1564 * @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1565 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1566 * @param output_start As \a input_start, but for outputs.
1569 Session::auto_connect_route (
1570 Route* route, ChanCount& existing_inputs, ChanCount& existing_outputs, bool connect_inputs, ChanCount input_start, ChanCount output_start
1573 /* If both inputs and outputs are auto-connected to physical ports,
1574 use the max of input and output offsets to ensure auto-connected
1575 port numbers always match up (e.g. the first audio input and the
1576 first audio output of the route will have the same physical
1577 port number). Otherwise just use the lowest input or output
1581 const bool in_out_physical =
1582 (Config->get_input_auto_connect() & AutoConnectPhysical)
1583 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1586 const ChanCount in_offset = in_out_physical
1587 ? ChanCount::max(existing_inputs, existing_outputs)
1590 const ChanCount out_offset = in_out_physical
1591 ? ChanCount::max(existing_inputs, existing_outputs)
1594 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1595 vector<string> physinputs;
1596 vector<string> physoutputs;
1598 _engine.get_physical_outputs (*t, physoutputs);
1599 _engine.get_physical_inputs (*t, physinputs);
1601 if (!physinputs.empty() && connect_inputs) {
1602 uint32_t nphysical_in = physinputs.size();
1603 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1606 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1607 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1610 if (!port.empty() && route->input()->connect (
1611 route->input()->ports().port(*t, i), port, this)) {
1617 if (!physoutputs.empty()) {
1618 uint32_t nphysical_out = physoutputs.size();
1619 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1622 if (Config->get_output_auto_connect() & AutoConnectPhysical) {
1623 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1624 } else if (Config->get_output_auto_connect() & AutoConnectMaster) {
1625 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1626 port = _master_out->input()->ports().port(*t,
1627 i % _master_out->input()->n_ports().get(*t))->name();
1631 if (!port.empty() && route->output()->connect (
1632 route->output()->ports().port(*t, i), port, this)) {
1639 existing_inputs += route->n_inputs();
1640 existing_outputs += route->n_outputs();
1643 /** Caller must not hold process lock
1644 * @param name_template string to use for the start of the name, or "" to use "Audio".
1646 list< boost::shared_ptr<AudioTrack> >
1647 Session::new_audio_track (
1648 int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template
1651 char track_name[32];
1652 uint32_t track_id = 0;
1653 ChanCount existing_inputs;
1654 ChanCount existing_outputs;
1656 RouteList new_routes;
1657 list<boost::shared_ptr<AudioTrack> > ret;
1658 uint32_t control_id;
1660 count_existing_route_channels (existing_inputs, existing_outputs);
1662 control_id = ntracks() + nbusses() + 1;
1664 bool const use_number = (how_many != 1);
1667 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1668 error << "cannot find name for new audio track" << endmsg;
1672 boost::shared_ptr<AudioTrack> track;
1675 track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
1677 if (track->init ()) {
1681 track->use_new_diskstream();
1683 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1684 boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1687 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1689 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1690 error << string_compose (
1691 _("cannot configure %1 in/%2 out configuration for new audio track"),
1692 input_channels, output_channels)
1697 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1698 error << string_compose (
1699 _("cannot configure %1 in/%2 out configuration for new audio track"),
1700 input_channels, output_channels)
1705 auto_connect_route (track.get(), existing_inputs, existing_outputs);
1709 route_group->add (track);
1712 track->non_realtime_input_change();
1714 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1715 track->set_remote_control_id (control_id);
1718 new_routes.push_back (track);
1719 ret.push_back (track);
1722 catch (failed_constructor &err) {
1723 error << _("Session: could not create new audio track.") << endmsg;
1727 catch (AudioEngine::PortRegistrationFailure& pfe) {
1729 error << pfe.what() << endmsg;
1737 if (!new_routes.empty()) {
1738 add_routes (new_routes, true);
1745 Session::set_remote_control_ids ()
1747 RemoteModel m = Config->get_remote_model();
1748 bool emit_signal = false;
1750 boost::shared_ptr<RouteList> r = routes.reader ();
1752 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1753 if (MixerOrdered == m) {
1754 int32_t order = (*i)->order_key(N_("signal"));
1755 (*i)->set_remote_control_id (order+1, false);
1757 } else if (EditorOrdered == m) {
1758 int32_t order = (*i)->order_key(N_("editor"));
1759 (*i)->set_remote_control_id (order+1, false);
1761 } else if (UserOrdered == m) {
1762 //do nothing ... only changes to remote id's are initiated by user
1767 Route::RemoteControlIDChange();
1771 /** Caller must not hold process lock.
1772 * @param name_template string to use for the start of the name, or "" to use "Bus".
1775 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
1778 uint32_t bus_id = 0;
1779 ChanCount existing_inputs;
1780 ChanCount existing_outputs;
1783 uint32_t control_id;
1785 count_existing_route_channels (existing_inputs, existing_outputs);
1787 control_id = ntracks() + nbusses() + 1;
1789 bool const use_number = (how_many != 1);
1791 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
1792 error << "cannot find name for new audio bus" << endmsg;
1797 boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
1803 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1804 boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
1807 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1809 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1810 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1811 input_channels, output_channels)
1817 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1818 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1819 input_channels, output_channels)
1824 auto_connect_route (bus.get(), existing_inputs, existing_outputs, false);
1828 route_group->add (bus);
1830 bus->set_remote_control_id (control_id);
1833 bus->add_internal_return ();
1835 ret.push_back (bus);
1839 catch (failed_constructor &err) {
1840 error << _("Session: could not create new audio route.") << endmsg;
1844 catch (AudioEngine::PortRegistrationFailure& pfe) {
1845 error << pfe.what() << endmsg;
1855 add_routes (ret, true);
1863 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
1867 uint32_t control_id;
1869 uint32_t number = 0;
1871 if (!tree.read (template_path.c_str())) {
1875 XMLNode* node = tree.root();
1877 control_id = ntracks() + nbusses() + 1;
1881 XMLNode node_copy (*node); // make a copy so we can change the name if we need to
1883 std::string node_name = IO::name_from_state (*node_copy.children().front());
1885 /* generate a new name by adding a number to the end of the template name */
1886 if (!find_route_name (node_name.c_str(), ++number, name, sizeof(name), true)) {
1887 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
1891 /* set IO children to use the new name */
1892 XMLNodeList const & children = node_copy.children ();
1893 for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
1894 if ((*i)->name() == IO::state_node_name) {
1895 IO::set_name_in_state (**i, name);
1899 Track::zero_diskstream_id_in_xml (node_copy);
1902 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
1905 error << _("Session: cannot create track/bus from template description") << endmsg;
1909 if (boost::dynamic_pointer_cast<Track>(route)) {
1910 /* force input/output change signals so that the new diskstream
1911 picks up the configuration of the route. During session
1912 loading this normally happens in a different way.
1915 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1917 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
1918 change.after = route->input()->n_ports();
1919 route->input()->changed (change, this);
1920 change.after = route->output()->n_ports();
1921 route->output()->changed (change, this);
1924 route->set_remote_control_id (control_id);
1927 ret.push_back (route);
1930 catch (failed_constructor &err) {
1931 error << _("Session: could not create new route from template") << endmsg;
1935 catch (AudioEngine::PortRegistrationFailure& pfe) {
1936 error << pfe.what() << endmsg;
1945 add_routes (ret, true);
1952 Session::add_routes (RouteList& new_routes, bool save)
1955 RCUWriter<RouteList> writer (routes);
1956 boost::shared_ptr<RouteList> r = writer.get_copy ();
1957 r->insert (r->end(), new_routes.begin(), new_routes.end());
1960 /* if there is no control out and we're not in the middle of loading,
1961 resort the graph here. if there is a control out, we will resort
1962 toward the end of this method. if we are in the middle of loading,
1963 we will resort when done.
1966 if (!_monitor_out && IO::connecting_legal) {
1967 resort_routes_using (r);
1971 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
1973 boost::weak_ptr<Route> wpr (*x);
1974 boost::shared_ptr<Route> r (*x);
1976 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
1977 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
1978 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
1979 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
1980 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
1981 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
1982 r->order_key_changed.connect_same_thread (*this, boost::bind (&Session::route_order_key_changed, this));
1984 if (r->is_master()) {
1988 if (r->is_monitor()) {
1992 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
1994 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
1995 track_playlist_changed (boost::weak_ptr<Track> (tr));
1996 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
1998 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2000 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2005 if (_monitor_out && IO::connecting_legal) {
2007 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2008 if ((*x)->is_monitor()) {
2010 } else if ((*x)->is_master()) {
2013 (*x)->listen_via_monitor ();
2023 save_state (_current_snapshot_name);
2026 RouteAdded (new_routes); /* EMIT SIGNAL */
2027 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
2031 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2033 boost::shared_ptr<RouteList> r = routes.reader ();
2034 boost::shared_ptr<Send> s;
2036 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2037 if ((s = (*i)->internal_send_for (dest)) != 0) {
2038 s->amp()->gain_control()->set_value (0.0);
2044 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2046 boost::shared_ptr<RouteList> r = routes.reader ();
2047 boost::shared_ptr<Send> s;
2049 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2050 if ((s = (*i)->internal_send_for (dest)) != 0) {
2051 s->amp()->gain_control()->set_value (1.0);
2057 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2059 boost::shared_ptr<RouteList> r = routes.reader ();
2060 boost::shared_ptr<Send> s;
2062 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2063 if ((s = (*i)->internal_send_for (dest)) != 0) {
2064 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2069 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2071 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2073 boost::shared_ptr<RouteList> r = routes.reader ();
2074 boost::shared_ptr<RouteList> t (new RouteList);
2076 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2077 if (include_buses || boost::dynamic_pointer_cast<Track>(*i)) {
2082 add_internal_sends (dest, p, t);
2086 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2088 if (dest->is_monitor() || dest->is_master()) {
2092 if (!dest->internal_return()) {
2093 dest->add_internal_return();
2096 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2098 if ((*i)->is_monitor() || (*i)->is_master() || (*i) == dest) {
2102 (*i)->listen_via (dest, p);
2109 Session::remove_route (boost::shared_ptr<Route> route)
2111 if (((route == _master_out) || (route == _monitor_out)) && !Config->get_allow_special_bus_removal()) {
2115 route->set_solo (false, this);
2118 RCUWriter<RouteList> writer (routes);
2119 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2123 /* deleting the master out seems like a dumb
2124 idea, but its more of a UI policy issue
2128 if (route == _master_out) {
2129 _master_out = boost::shared_ptr<Route> ();
2132 if (route == _monitor_out) {
2134 /* cancel control outs for all routes */
2136 for (RouteList::iterator r = rs->begin(); r != rs->end(); ++r) {
2137 (*r)->drop_listen (_monitor_out);
2140 _monitor_out.reset ();
2143 /* writer goes out of scope, forces route list update */
2146 update_route_solo_state ();
2148 // We need to disconnect the route's inputs and outputs
2150 route->input()->disconnect (0);
2151 route->output()->disconnect (0);
2153 /* if the route had internal sends sending to it, remove them */
2154 if (route->internal_return()) {
2156 boost::shared_ptr<RouteList> r = routes.reader ();
2157 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2158 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2160 (*i)->remove_processor (s);
2165 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2166 if (mt && mt->step_editing()) {
2167 if (_step_editors > 0) {
2172 update_latency_compensation (false, false);
2175 /* Re-sort routes to remove the graph's current references to the one that is
2176 * going away, then flush old references out of the graph.
2180 route_graph->clear_other_chain ();
2182 /* get rid of it from the dead wood collection in the route list manager */
2184 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2188 /* try to cause everyone to drop their references */
2190 route->drop_references ();
2192 sync_order_keys (N_("session"));
2194 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2196 /* save the new state of the world */
2198 if (save_state (_current_snapshot_name)) {
2199 save_history (_current_snapshot_name);
2204 Session::route_mute_changed (void* /*src*/)
2210 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2212 boost::shared_ptr<Route> route = wpr.lock();
2214 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2218 if (route->listening_via_monitor ()) {
2220 if (Config->get_exclusive_solo()) {
2221 /* new listen: disable all other listen */
2222 boost::shared_ptr<RouteList> r = routes.reader ();
2223 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2224 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2227 (*i)->set_listen (false, this);
2233 } else if (_listen_cnt > 0) {
2238 update_route_solo_state ();
2241 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2243 boost::shared_ptr<Route> route = wpr.lock ();
2246 /* should not happen */
2247 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2251 bool send_changed = false;
2253 if (route->solo_isolated()) {
2254 if (_solo_isolated_cnt == 0) {
2255 send_changed = true;
2257 _solo_isolated_cnt++;
2258 } else if (_solo_isolated_cnt > 0) {
2259 _solo_isolated_cnt--;
2260 if (_solo_isolated_cnt == 0) {
2261 send_changed = true;
2266 IsolatedChanged (); /* EMIT SIGNAL */
2271 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2273 if (!self_solo_change) {
2274 // session doesn't care about changes to soloed-by-others
2278 if (solo_update_disabled) {
2283 boost::shared_ptr<Route> route = wpr.lock ();
2286 /* should not happen */
2287 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2291 boost::shared_ptr<RouteList> r = routes.reader ();
2294 if (route->self_soloed()) {
2300 if (delta == 1 && Config->get_exclusive_solo()) {
2301 /* new solo: disable all other solos */
2302 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2303 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2306 (*i)->set_solo (false, this);
2310 solo_update_disabled = true;
2312 RouteList uninvolved;
2314 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2315 bool via_sends_only;
2316 bool in_signal_flow;
2318 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2322 in_signal_flow = false;
2324 if ((*i)->feeds (route, &via_sends_only)) {
2325 if (!via_sends_only) {
2326 if (!route->soloed_by_others_upstream()) {
2327 (*i)->mod_solo_by_others_downstream (delta);
2329 in_signal_flow = true;
2333 if (route->feeds (*i, &via_sends_only)) {
2334 (*i)->mod_solo_by_others_upstream (delta);
2335 in_signal_flow = true;
2338 if (!in_signal_flow) {
2339 uninvolved.push_back (*i);
2343 solo_update_disabled = false;
2344 update_route_solo_state (r);
2346 /* now notify that the mute state of the routes not involved in the signal
2347 pathway of the just-solo-changed route may have altered.
2350 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2351 (*i)->mute_changed (this);
2354 SoloChanged (); /* EMIT SIGNAL */
2359 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2361 /* now figure out if anything that matters is soloed (or is "listening")*/
2363 bool something_soloed = false;
2364 uint32_t listeners = 0;
2365 uint32_t isolated = 0;
2368 r = routes.reader();
2371 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2372 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2373 something_soloed = true;
2376 if (!(*i)->is_hidden() && (*i)->listening_via_monitor()) {
2377 if (Config->get_solo_control_is_listen_control()) {
2380 (*i)->set_listen (false, this);
2384 if ((*i)->solo_isolated()) {
2389 if (something_soloed != _non_soloed_outs_muted) {
2390 _non_soloed_outs_muted = something_soloed;
2391 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2394 _listen_cnt = listeners;
2396 if (isolated != _solo_isolated_cnt) {
2397 _solo_isolated_cnt = isolated;
2398 IsolatedChanged (); /* EMIT SIGNAL */
2402 boost::shared_ptr<RouteList>
2403 Session::get_routes_with_internal_returns() const
2405 boost::shared_ptr<RouteList> r = routes.reader ();
2406 boost::shared_ptr<RouteList> rl (new RouteList);
2408 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2409 if ((*i)->internal_return ()) {
2417 Session::io_name_is_legal (const std::string& name)
2419 boost::shared_ptr<RouteList> r = routes.reader ();
2421 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2422 if ((*i)->name() == name) {
2426 if ((*i)->has_io_processor_named (name)) {
2434 boost::shared_ptr<Route>
2435 Session::route_by_name (string name)
2437 boost::shared_ptr<RouteList> r = routes.reader ();
2439 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2440 if ((*i)->name() == name) {
2445 return boost::shared_ptr<Route> ((Route*) 0);
2448 boost::shared_ptr<Route>
2449 Session::route_by_id (PBD::ID id)
2451 boost::shared_ptr<RouteList> r = routes.reader ();
2453 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2454 if ((*i)->id() == id) {
2459 return boost::shared_ptr<Route> ((Route*) 0);
2462 boost::shared_ptr<Route>
2463 Session::route_by_remote_id (uint32_t id)
2465 boost::shared_ptr<RouteList> r = routes.reader ();
2467 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2468 if ((*i)->remote_control_id() == id) {
2473 return boost::shared_ptr<Route> ((Route*) 0);
2477 Session::playlist_region_added (boost::weak_ptr<Region> w)
2479 boost::shared_ptr<Region> r = w.lock ();
2484 /* These are the operations that are currently in progress... */
2485 list<GQuark> curr = _current_trans_quarks;
2488 /* ...and these are the operations during which we want to update
2489 the session range location markers.
2492 ops.push_back (Operations::capture);
2493 ops.push_back (Operations::paste);
2494 ops.push_back (Operations::duplicate_region);
2495 ops.push_back (Operations::insert_file);
2496 ops.push_back (Operations::insert_region);
2497 ops.push_back (Operations::drag_region_brush);
2498 ops.push_back (Operations::region_drag);
2499 ops.push_back (Operations::selection_grab);
2500 ops.push_back (Operations::region_fill);
2501 ops.push_back (Operations::fill_selection);
2502 ops.push_back (Operations::create_region);
2505 /* See if any of the current operations match the ones that we want */
2507 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2509 /* If so, update the session range markers */
2511 maybe_update_session_range (r->position (), r->last_frame ());
2515 /** Update the session range markers if a is before the current start or
2516 * b is after the current end.
2519 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2521 if (_state_of_the_state & Loading) {
2525 if (_session_range_location == 0) {
2527 add_session_range_location (a, b);
2531 if (a < _session_range_location->start()) {
2532 _session_range_location->set_start (a);
2535 if (b > _session_range_location->end()) {
2536 _session_range_location->set_end (b);
2542 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2544 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2545 maybe_update_session_range (i->to, i->to + i->length);
2550 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
2552 for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2553 maybe_update_session_range (i->from, i->to);
2557 /* Region management */
2559 boost::shared_ptr<Region>
2560 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2562 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2563 RegionFactory::RegionMap::const_iterator i;
2564 boost::shared_ptr<Region> region;
2566 Glib::Mutex::Lock lm (region_lock);
2568 for (i = regions.begin(); i != regions.end(); ++i) {
2572 if (region->whole_file()) {
2574 if (child->source_equivalent (region)) {
2580 return boost::shared_ptr<Region> ();
2584 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2586 set<boost::shared_ptr<Region> > relevant_regions;
2588 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2589 RegionFactory::get_regions_using_source (*s, relevant_regions);
2592 cerr << "There are " << relevant_regions.size() << " using " << srcs.size() << " sources" << endl;
2594 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2595 set<boost::shared_ptr<Region> >::iterator tmp;
2600 cerr << "Cleanup " << (*r)->name() << " UC = " << (*r).use_count() << endl;
2602 playlists->destroy_region (*r);
2603 RegionFactory::map_remove (*r);
2605 (*r)->drop_sources ();
2606 (*r)->drop_references ();
2608 cerr << "\tdone UC = " << (*r).use_count() << endl;
2610 relevant_regions.erase (r);
2615 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2618 Glib::Mutex::Lock ls (source_lock);
2619 /* remove from the main source list */
2620 sources.erase ((*s)->id());
2623 (*s)->mark_for_remove ();
2624 (*s)->drop_references ();
2633 Session::remove_last_capture ()
2635 list<boost::shared_ptr<Source> > srcs;
2637 boost::shared_ptr<RouteList> rl = routes.reader ();
2638 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2639 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2644 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2647 srcs.insert (srcs.end(), l.begin(), l.end());
2652 destroy_sources (srcs);
2654 save_state (_current_snapshot_name);
2659 /* Source Management */
2662 Session::add_source (boost::shared_ptr<Source> source)
2664 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2665 pair<SourceMap::iterator,bool> result;
2667 entry.first = source->id();
2668 entry.second = source;
2671 Glib::Mutex::Lock lm (source_lock);
2672 result = sources.insert (entry);
2675 if (result.second) {
2677 /* yay, new source */
2681 boost::shared_ptr<AudioFileSource> afs;
2683 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2684 if (Config->get_auto_analyse_audio()) {
2685 Analyser::queue_source_for_analysis (source, false);
2689 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
2694 Session::remove_source (boost::weak_ptr<Source> src)
2696 SourceMap::iterator i;
2697 boost::shared_ptr<Source> source = src.lock();
2704 Glib::Mutex::Lock lm (source_lock);
2706 if ((i = sources.find (source->id())) != sources.end()) {
2707 cerr << "Removing source " << source->name() << endl;
2712 if (!_state_of_the_state & InCleanup) {
2714 /* save state so we don't end up with a session file
2715 referring to non-existent sources.
2718 save_state (_current_snapshot_name);
2722 boost::shared_ptr<Source>
2723 Session::source_by_id (const PBD::ID& id)
2725 Glib::Mutex::Lock lm (source_lock);
2726 SourceMap::iterator i;
2727 boost::shared_ptr<Source> source;
2729 if ((i = sources.find (id)) != sources.end()) {
2736 boost::shared_ptr<Source>
2737 Session::source_by_path_and_channel (const string& path, uint16_t chn)
2739 Glib::Mutex::Lock lm (source_lock);
2741 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2742 boost::shared_ptr<AudioFileSource> afs
2743 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
2745 if (afs && afs->path() == path && chn == afs->channel()) {
2749 return boost::shared_ptr<Source>();
2753 Session::count_sources_by_origin (const string& path)
2756 Glib::Mutex::Lock lm (source_lock);
2758 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2759 boost::shared_ptr<FileSource> fs
2760 = boost::dynamic_pointer_cast<FileSource>(i->second);
2762 if (fs && fs->origin() == path) {
2772 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
2775 string old_basename = PBD::basename_nosuffix (oldname);
2776 string new_legalized = legalize_for_path (newname);
2778 /* note: we know (or assume) the old path is already valid */
2782 /* destructive file sources have a name of the form:
2784 /path/to/Tnnnn-NAME(%[LR])?.wav
2786 the task here is to replace NAME with the new name.
2791 string::size_type dash;
2793 dir = Glib::path_get_dirname (path);
2794 path = Glib::path_get_basename (path);
2796 /* '-' is not a legal character for the NAME part of the path */
2798 if ((dash = path.find_last_of ('-')) == string::npos) {
2802 prefix = path.substr (0, dash);
2806 path += new_legalized;
2807 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
2808 path = Glib::build_filename (dir, path);
2812 /* non-destructive file sources have a name of the form:
2814 /path/to/NAME-nnnnn(%[LR])?.ext
2816 the task here is to replace NAME with the new name.
2821 string::size_type dash;
2822 string::size_type postfix;
2824 dir = Glib::path_get_dirname (path);
2825 path = Glib::path_get_basename (path);
2827 /* '-' is not a legal character for the NAME part of the path */
2829 if ((dash = path.find_last_of ('-')) == string::npos) {
2833 suffix = path.substr (dash+1);
2835 // Suffix is now everything after the dash. Now we need to eliminate
2836 // the nnnnn part, which is done by either finding a '%' or a '.'
2838 postfix = suffix.find_last_of ("%");
2839 if (postfix == string::npos) {
2840 postfix = suffix.find_last_of ('.');
2843 if (postfix != string::npos) {
2844 suffix = suffix.substr (postfix);
2846 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
2850 const uint32_t limit = 10000;
2851 char buf[PATH_MAX+1];
2853 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
2855 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
2857 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
2858 path = Glib::build_filename (dir, buf);
2866 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
2875 /** Return the full path (in some session directory) for a new within-session source.
2876 * \a name must be a session-unique name that does not contain slashes
2877 * (e.g. as returned by new_*_source_name)
2880 Session::new_source_path_from_name (DataType type, const string& name, bool as_stub)
2882 assert(name.find("/") == string::npos);
2884 SessionDirectory sdir(get_best_session_directory_for_new_source());
2887 if (type == DataType::AUDIO) {
2888 p = (as_stub ? sdir.sound_stub_path() : sdir.sound_path());
2889 } else if (type == DataType::MIDI) {
2890 p = (as_stub ? sdir.midi_stub_path() : sdir.midi_path());
2892 error << "Unknown source type, unable to create file path" << endmsg;
2897 return p.to_string();
2901 Session::peak_path (string base) const
2903 sys::path peakfile_path(_session_dir->peak_path());
2904 peakfile_path /= base + peakfile_suffix;
2905 return peakfile_path.to_string();
2908 /** Return a unique name based on \a base for a new internal audio source */
2910 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
2913 char buf[PATH_MAX+1];
2914 const uint32_t limit = 10000;
2916 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
2919 legalized = legalize_for_path (base);
2921 // Find a "version" of the base name that doesn't exist in any of the possible directories.
2922 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
2924 vector<space_and_path>::iterator i;
2925 uint32_t existing = 0;
2927 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2932 snprintf (buf, sizeof(buf), "T%04d-%s%s",
2933 cnt, legalized.c_str(), ext.c_str());
2934 } else if (nchan == 2) {
2936 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
2937 cnt, legalized.c_str(), ext.c_str());
2939 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
2940 cnt, legalized.c_str(), ext.c_str());
2942 } else if (nchan < 26) {
2943 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
2944 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
2946 snprintf (buf, sizeof(buf), "T%04d-%s%s",
2947 cnt, legalized.c_str(), ext.c_str());
2953 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
2954 } else if (nchan == 2) {
2956 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
2958 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
2960 } else if (nchan < 26) {
2961 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
2963 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
2967 SessionDirectory sdir((*i).path);
2969 string spath = sdir.sound_path().to_string();
2970 string spath_stubs = sdir.sound_stub_path().to_string();
2972 /* note that we search *without* the extension so that
2973 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
2974 in the event that this new name is required for
2975 a file format change.
2978 if (matching_unsuffixed_filename_exists_in (spath, buf) ||
2979 matching_unsuffixed_filename_exists_in (spath_stubs, buf)) {
2985 if (existing == 0) {
2990 error << string_compose(
2991 _("There are already %1 recordings for %2, which I consider too many."),
2992 limit, base) << endmsg;
2994 throw failed_constructor();
2998 return Glib::path_get_basename (buf);
3001 /** Create a new within-session audio source */
3002 boost::shared_ptr<AudioFileSource>
3003 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive, bool as_stub)
3005 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3006 const string path = new_source_path_from_name(DataType::AUDIO, name, as_stub);
3008 return boost::dynamic_pointer_cast<AudioFileSource> (
3009 SourceFactory::createWritable (DataType::AUDIO, *this, path, string(), destructive, frame_rate()));
3012 /** Return a unique name based on \a base for a new internal MIDI source */
3014 Session::new_midi_source_name (const string& base)
3017 char buf[PATH_MAX+1];
3018 const uint32_t limit = 10000;
3022 legalized = legalize_for_path (base);
3024 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3025 for (cnt = 1; cnt <= limit; ++cnt) {
3027 vector<space_and_path>::iterator i;
3028 uint32_t existing = 0;
3030 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3032 SessionDirectory sdir((*i).path);
3034 sys::path p = sdir.midi_path();
3037 snprintf (buf, sizeof(buf), "%s-%u.mid", p.to_string().c_str(), cnt);
3039 if (sys::exists (buf)) {
3044 if (existing == 0) {
3049 error << string_compose(
3050 _("There are already %1 recordings for %2, which I consider too many."),
3051 limit, base) << endmsg;
3053 throw failed_constructor();
3057 return Glib::path_get_basename(buf);
3061 /** Create a new within-session MIDI source */
3062 boost::shared_ptr<MidiSource>
3063 Session::create_midi_source_for_session (Track* track, string const & n, bool as_stub)
3065 /* try to use the existing write source for the track, to keep numbering sane
3069 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3073 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3076 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3077 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3081 const string name = new_midi_source_name (n);
3082 const string path = new_source_path_from_name (DataType::MIDI, name, as_stub);
3084 return boost::dynamic_pointer_cast<SMFSource> (
3085 SourceFactory::createWritable (
3086 DataType::MIDI, *this, path, string(), false, frame_rate()));
3091 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3093 if (playlist->hidden()) {
3097 playlists->add (playlist);
3100 playlist->release();
3107 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3109 if (_state_of_the_state & Deletion) {
3113 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3119 playlists->remove (playlist);
3125 Session::set_audition (boost::shared_ptr<Region> r)
3127 pending_audition_region = r;
3128 add_post_transport_work (PostTransportAudition);
3129 _butler->schedule_transport_work ();
3133 Session::audition_playlist ()
3135 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3136 ev->region.reset ();
3141 Session::non_realtime_set_audition ()
3143 if (!pending_audition_region) {
3144 auditioner->audition_current_playlist ();
3146 auditioner->audition_region (pending_audition_region);
3147 pending_audition_region.reset ();
3149 AuditionActive (true); /* EMIT SIGNAL */
3153 Session::audition_region (boost::shared_ptr<Region> r)
3155 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3161 Session::cancel_audition ()
3163 if (auditioner->auditioning()) {
3164 auditioner->cancel_audition ();
3165 AuditionActive (false); /* EMIT SIGNAL */
3170 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3172 if (a->is_monitor()) {
3175 if (b->is_monitor()) {
3178 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3182 Session::is_auditioning () const
3184 /* can be called before we have an auditioner object */
3186 return auditioner->auditioning();
3193 Session::graph_reordered ()
3195 /* don't do this stuff if we are setting up connections
3196 from a set_state() call or creating new tracks. Ditto for deletion.
3199 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3203 /* every track/bus asked for this to be handled but it was deferred because
3204 we were connecting. do it now.
3207 request_input_change_handling ();
3211 /* force all diskstreams to update their capture offset values to
3212 reflect any changes in latencies within the graph.
3215 boost::shared_ptr<RouteList> rl = routes.reader ();
3216 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3217 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3219 tr->set_capture_offset ();
3225 Session::available_capture_duration ()
3227 float sample_bytes_on_disk = 4.0; // keep gcc happy
3229 switch (config.get_native_file_data_format()) {
3231 sample_bytes_on_disk = 4.0;
3235 sample_bytes_on_disk = 3.0;
3239 sample_bytes_on_disk = 2.0;
3243 /* impossible, but keep some gcc versions happy */
3244 fatal << string_compose (_("programming error: %1"),
3245 X_("illegal native file data format"))
3250 double scale = 4096.0 / sample_bytes_on_disk;
3252 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3253 return max_framecnt;
3256 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3260 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3263 RCUWriter<BundleList> writer (_bundles);
3264 boost::shared_ptr<BundleList> b = writer.get_copy ();
3265 b->push_back (bundle);
3268 BundleAdded (bundle); /* EMIT SIGNAL */
3274 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3276 bool removed = false;
3279 RCUWriter<BundleList> writer (_bundles);
3280 boost::shared_ptr<BundleList> b = writer.get_copy ();
3281 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3283 if (i != b->end()) {
3290 BundleRemoved (bundle); /* EMIT SIGNAL */
3296 boost::shared_ptr<Bundle>
3297 Session::bundle_by_name (string name) const
3299 boost::shared_ptr<BundleList> b = _bundles.reader ();
3301 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3302 if ((*i)->name() == name) {
3307 return boost::shared_ptr<Bundle> ();
3311 Session::tempo_map_changed (const PropertyChange&)
3315 playlists->update_after_tempo_map_change ();
3317 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3323 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3325 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3326 (*i)->recompute_frames_from_bbt ();
3330 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3331 * the given count with the current block size.
3334 Session::ensure_buffers (ChanCount howmany)
3336 BufferManager::ensure_buffers (howmany);
3340 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3342 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3343 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3348 Session::next_insert_id ()
3350 /* this doesn't really loop forever. just think about it */
3353 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3354 if (!insert_bitset[n]) {
3355 insert_bitset[n] = true;
3361 /* none available, so resize and try again */
3363 insert_bitset.resize (insert_bitset.size() + 16, false);
3368 Session::next_send_id ()
3370 /* this doesn't really loop forever. just think about it */
3373 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3374 if (!send_bitset[n]) {
3375 send_bitset[n] = true;
3381 /* none available, so resize and try again */
3383 send_bitset.resize (send_bitset.size() + 16, false);
3388 Session::next_return_id ()
3390 /* this doesn't really loop forever. just think about it */
3393 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3394 if (!return_bitset[n]) {
3395 return_bitset[n] = true;
3401 /* none available, so resize and try again */
3403 return_bitset.resize (return_bitset.size() + 16, false);
3408 Session::mark_send_id (uint32_t id)
3410 if (id >= send_bitset.size()) {
3411 send_bitset.resize (id+16, false);
3413 if (send_bitset[id]) {
3414 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3416 send_bitset[id] = true;
3420 Session::mark_return_id (uint32_t id)
3422 if (id >= return_bitset.size()) {
3423 return_bitset.resize (id+16, false);
3425 if (return_bitset[id]) {
3426 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3428 return_bitset[id] = true;
3432 Session::mark_insert_id (uint32_t id)
3434 if (id >= insert_bitset.size()) {
3435 insert_bitset.resize (id+16, false);
3437 if (insert_bitset[id]) {
3438 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3440 insert_bitset[id] = true;
3444 Session::unmark_send_id (uint32_t id)
3446 if (id < send_bitset.size()) {
3447 send_bitset[id] = false;
3452 Session::unmark_return_id (uint32_t id)
3454 if (id < return_bitset.size()) {
3455 return_bitset[id] = false;
3460 Session::unmark_insert_id (uint32_t id)
3462 if (id < insert_bitset.size()) {
3463 insert_bitset[id] = false;
3468 /* Named Selection management */
3470 boost::shared_ptr<NamedSelection>
3471 Session::named_selection_by_name (string name)
3473 Glib::Mutex::Lock lm (named_selection_lock);
3474 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3475 if ((*i)->name == name) {
3479 return boost::shared_ptr<NamedSelection>();
3483 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3486 Glib::Mutex::Lock lm (named_selection_lock);
3487 named_selections.insert (named_selections.begin(), named_selection);
3492 NamedSelectionAdded (); /* EMIT SIGNAL */
3496 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3498 bool removed = false;
3501 Glib::Mutex::Lock lm (named_selection_lock);
3503 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3505 if (i != named_selections.end()) {
3506 named_selections.erase (i);
3513 NamedSelectionRemoved (); /* EMIT SIGNAL */
3518 Session::reset_native_file_format ()
3520 boost::shared_ptr<RouteList> rl = routes.reader ();
3521 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3522 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3524 /* don't save state as we do this, there's no point
3527 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3528 tr->reset_write_sources (false);
3529 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3535 Session::route_name_unique (string n) const
3537 boost::shared_ptr<RouteList> r = routes.reader ();
3539 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3540 if ((*i)->name() == n) {
3549 Session::route_name_internal (string n) const
3551 if (auditioner && auditioner->name() == n) {
3555 if (_click_io && _click_io->name() == n) {
3563 Session::freeze_all (InterThreadInfo& itt)
3565 boost::shared_ptr<RouteList> r = routes.reader ();
3567 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3569 boost::shared_ptr<Track> t;
3571 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3572 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3582 boost::shared_ptr<Region>
3583 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3584 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3585 InterThreadInfo& itt, bool enable_processing)
3587 boost::shared_ptr<Region> result;
3588 boost::shared_ptr<Playlist> playlist;
3589 boost::shared_ptr<AudioFileSource> fsource;
3591 char buf[PATH_MAX+1];
3592 ChanCount diskstream_channels (track.n_channels());
3593 framepos_t position;
3594 framecnt_t this_chunk;
3597 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3598 const string sound_dir = sdir.sound_path().to_string();
3599 framepos_t len = end - start;
3600 bool need_block_size_reset = false;
3602 ChanCount const max_proc = track.max_processor_streams ();
3605 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3606 end, start) << endmsg;
3610 const framecnt_t chunk_size = (256 * 1024)/4;
3612 // block all process callback handling
3614 block_processing ();
3616 /* call tree *MUST* hold route_lock */
3618 if ((playlist = track.playlist()) == 0) {
3622 /* external redirects will be a problem */
3624 if (track.has_external_redirects()) {
3628 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3630 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
3632 for (x = 0; x < 99999; ++x) {
3633 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());
3634 if (access (buf, F_OK) != 0) {
3640 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3645 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3646 SourceFactory::createWritable (DataType::AUDIO, *this, buf, string(), false, frame_rate()));
3649 catch (failed_constructor& err) {
3650 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3654 srcs.push_back (fsource);
3657 /* tell redirects that care that we are about to use a much larger blocksize */
3659 need_block_size_reset = true;
3660 track.set_block_size (chunk_size);
3662 /* XXX need to flush all redirects */
3667 /* create a set of reasonably-sized buffers */
3668 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
3669 buffers.set_count (max_proc);
3671 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3672 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3674 afs->prepare_for_peakfile_writes ();
3677 while (to_do && !itt.cancel) {
3679 this_chunk = min (to_do, chunk_size);
3681 if (track.export_stuff (buffers, start, this_chunk, enable_processing)) {
3686 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
3687 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3690 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
3696 start += this_chunk;
3697 to_do -= this_chunk;
3699 itt.progress = (float) (1.0 - ((double) to_do / len));
3708 xnow = localtime (&now);
3710 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3711 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3714 afs->update_header (position, *xnow, now);
3715 afs->flush_header ();
3719 /* construct a region to represent the bounced material */
3723 plist.add (Properties::start, 0);
3724 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
3725 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
3727 result = RegionFactory::create (srcs, plist);
3733 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3734 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3737 afs->mark_for_remove ();
3740 (*src)->drop_references ();
3744 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3745 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3748 afs->done_with_peakfile_writes ();
3753 if (need_block_size_reset) {
3754 track.set_block_size (get_block_size());
3757 unblock_processing ();
3763 Session::gain_automation_buffer() const
3765 return ProcessThread::gain_automation_buffer ();
3769 Session::pan_automation_buffer() const
3771 return ProcessThread::pan_automation_buffer ();
3775 Session::get_silent_buffers (ChanCount count)
3777 return ProcessThread::get_silent_buffers (count);
3779 assert(_silent_buffers->available() >= count);
3780 _silent_buffers->set_count(count);
3782 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3783 for (size_t i= 0; i < count.get(*t); ++i) {
3784 _silent_buffers->get(*t, i).clear();
3788 return *_silent_buffers;
3793 Session::get_scratch_buffers (ChanCount count)
3795 return ProcessThread::get_scratch_buffers (count);
3797 if (count != ChanCount::ZERO) {
3798 assert(_scratch_buffers->available() >= count);
3799 _scratch_buffers->set_count(count);
3801 _scratch_buffers->set_count (_scratch_buffers->available());
3804 return *_scratch_buffers;
3809 Session::get_mix_buffers (ChanCount count)
3811 return ProcessThread::get_mix_buffers (count);
3813 assert(_mix_buffers->available() >= count);
3814 _mix_buffers->set_count(count);
3815 return *_mix_buffers;
3820 Session::ntracks () const
3823 boost::shared_ptr<RouteList> r = routes.reader ();
3825 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3826 if (boost::dynamic_pointer_cast<Track> (*i)) {
3835 Session::nbusses () const
3838 boost::shared_ptr<RouteList> r = routes.reader ();
3840 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3841 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
3850 Session::add_automation_list(AutomationList *al)
3852 automation_lists[al->id()] = al;
3856 Session::sync_order_keys (std::string const & base)
3858 if (deletion_in_progress()) {
3862 if (!Config->get_sync_all_route_ordering()) {
3863 /* leave order keys as they are */
3867 boost::shared_ptr<RouteList> r = routes.reader ();
3869 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3870 (*i)->sync_order_keys (base);
3873 Route::SyncOrderKeys (base); // EMIT SIGNAL
3875 /* this might not do anything */
3877 set_remote_control_ids ();
3880 /** @return true if there is at least one record-enabled track, otherwise false */
3882 Session::have_rec_enabled_track () const
3884 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
3887 /** Update the state of our rec-enabled tracks flag */
3889 Session::update_have_rec_enabled_track ()
3891 boost::shared_ptr<RouteList> rl = routes.reader ();
3892 RouteList::iterator i = rl->begin();
3893 while (i != rl->end ()) {
3895 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3896 if (tr && tr->record_enabled ()) {
3903 int const old = g_atomic_int_get (&_have_rec_enabled_track);
3905 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
3907 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
3908 RecordStateChanged (); /* EMIT SIGNAL */
3913 Session::listen_position_changed ()
3915 boost::shared_ptr<RouteList> r = routes.reader ();
3917 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3918 (*i)->listen_position_changed ();
3923 Session::solo_control_mode_changed ()
3925 /* cancel all solo or all listen when solo control mode changes */
3928 set_solo (get_routes(), false);
3929 } else if (listening()) {
3930 set_listen (get_routes(), false);
3934 /** Called when anything about any of our route groups changes (membership, state etc.) */
3936 Session::route_group_changed ()
3938 RouteGroupChanged (); /* EMIT SIGNAL */
3942 Session::get_available_sync_options () const
3944 vector<SyncSource> ret;
3946 ret.push_back (JACK);
3947 ret.push_back (MTC);
3948 ret.push_back (MIDIClock);
3953 boost::shared_ptr<RouteList>
3954 Session::get_routes_with_regions_at (framepos_t const p) const
3956 boost::shared_ptr<RouteList> r = routes.reader ();
3957 boost::shared_ptr<RouteList> rl (new RouteList);
3959 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3960 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3965 boost::shared_ptr<Playlist> pl = tr->playlist ();
3970 if (pl->has_region_at (p)) {
3979 Session::goto_end ()
3981 if (_session_range_location) {
3982 request_locate (_session_range_location->end(), false);
3984 request_locate (0, false);
3989 Session::goto_start ()
3991 if (_session_range_location) {
3992 request_locate (_session_range_location->start(), false);
3994 request_locate (0, false);
3999 Session::current_start_frame () const
4001 return _session_range_location ? _session_range_location->start() : 0;
4005 Session::current_end_frame () const
4007 return _session_range_location ? _session_range_location->end() : 0;
4011 Session::add_session_range_location (framepos_t start, framepos_t end)
4013 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4014 _locations->add (_session_range_location);
4017 /** Called when one of our routes' order keys has changed */
4019 Session::route_order_key_changed ()
4021 RouteOrderKeyChanged (); /* EMIT SIGNAL */
4025 Session::step_edit_status_change (bool yn)
4031 send = (_step_editors == 0);
4036 send = (_step_editors == 1);
4039 if (_step_editors > 0) {
4045 StepEditStatusChange (val);
4051 Session::start_time_changed (framepos_t old)
4053 /* Update the auto loop range to match the session range
4054 (unless the auto loop range has been changed by the user)
4057 Location* s = _locations->session_range_location ();
4062 Location* l = _locations->auto_loop_location ();
4064 if (l->start() == old) {
4065 l->set_start (s->start(), true);
4070 Session::end_time_changed (framepos_t old)
4072 /* Update the auto loop range to match the session range
4073 (unless the auto loop range has been changed by the user)
4076 Location* s = _locations->session_range_location ();
4081 Location* l = _locations->auto_loop_location ();
4083 if (l->end() == old) {
4084 l->set_end (s->end(), true);
4089 Session::source_search_path (DataType type) const
4093 if (session_dirs.size() == 1) {
4095 case DataType::AUDIO:
4096 search_path = _session_dir->sound_path().to_string();
4098 case DataType::MIDI:
4099 search_path = _session_dir->midi_path().to_string();
4103 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4104 SessionDirectory sdir (i->path);
4105 if (!search_path.empty()) {
4109 case DataType::AUDIO:
4110 search_path += sdir.sound_path().to_string();
4112 case DataType::MIDI:
4113 search_path += sdir.midi_path().to_string();
4119 /* now add user-specified locations
4122 vector<string> dirs;
4125 case DataType::AUDIO:
4126 split (config.get_audio_search_path (), dirs, ':');
4128 case DataType::MIDI:
4129 split (config.get_midi_search_path (), dirs, ':');
4133 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4143 Session::ensure_search_path_includes (const string& path, DataType type)
4146 vector<string> dirs;
4153 case DataType::AUDIO:
4154 search_path = config.get_audio_search_path ();
4156 case DataType::MIDI:
4157 search_path = config.get_midi_search_path ();
4161 split (search_path, dirs, ':');
4163 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4169 if (!search_path.empty()) {
4173 search_path += path;
4176 case DataType::AUDIO:
4177 config.set_audio_search_path (search_path);
4179 case DataType::MIDI:
4180 config.set_midi_search_path (search_path);
4185 boost::shared_ptr<Speakers>
4186 Session::get_speakers()
4192 Session::unknown_processors () const
4196 boost::shared_ptr<RouteList> r = routes.reader ();
4197 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4198 list<string> t = (*i)->unknown_processors ();
4199 copy (t.begin(), t.end(), back_inserter (p));
4208 #ifdef HAVE_JACK_NEW_LATENCY
4210 Session::update_latency (bool playback)
4212 DEBUG_TRACE (DEBUG::Latency, "JACK latency callback\n");
4214 boost::shared_ptr<RouteList> r = routes.reader ();
4217 /* reverse the list so that we work backwards from the last route to run to the first */
4218 reverse (r->begin(), r->end());
4221 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4222 DEBUG_TRACE (DEBUG::Latency, string_compose ("------------- Working on latency for %1\n", (*i)->name()));
4223 (*i)->set_latency_ranges (playback);
4224 DEBUG_TRACE (DEBUG::Latency, string_compose ("------------- Done working on latency for %1\n\n", (*i)->name()));