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,
141 , _target_transport_speed (0.0)
142 , _requested_return_frame (-1)
143 , _session_dir (new SessionDirectory(fullpath))
145 , _state_of_the_state (Clean)
146 , _butler (new Butler (*this))
147 , _post_transport_work (0)
148 , _send_timecode_update (false)
149 , _all_route_group (new RouteGroup (*this, "all"))
150 , route_graph (new Graph(*this))
151 , routes (new RouteList)
152 , _total_free_4k_blocks (0)
153 , _bundles (new BundleList)
154 , _bundle_xml_node (0)
156 , _click_io ((IO*) 0)
158 , click_emphasis_data (0)
160 , _metadata (new SessionMetadata())
161 , _have_rec_enabled_track (false)
162 , _suspend_timecode_transmission (0)
164 _locations = new Locations (*this);
166 playlists.reset (new SessionPlaylists);
168 _all_route_group->set_active (true, this);
170 interpolation.add_channel_to (0, 0);
172 if (!eng.connected()) {
173 throw failed_constructor();
176 n_physical_outputs = _engine.n_physical_outputs ();
177 n_physical_inputs = _engine.n_physical_inputs ();
179 first_stage_init (fullpath, snapshot_name);
181 _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
184 if (create (mix_template, bus_profile)) {
186 throw failed_constructor ();
190 if (second_stage_init ()) {
192 throw failed_constructor ();
195 store_recent_sessions(_name, _path);
197 bool was_dirty = dirty();
199 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
201 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
202 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
205 DirtyChanged (); /* EMIT SIGNAL */
208 StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
209 EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
222 vector<void*> debug_pointers;
224 /* if we got to here, leaving pending capture state around
228 remove_pending_capture_state ();
230 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
232 _engine.remove_session ();
234 /* clear history so that no references to objects are held any more */
238 /* clear state tree so that no references to objects are held any more */
242 /* remove all stubfiles that might still be lurking */
244 cleanup_stubfiles ();
246 /* reset dynamic state version back to default */
248 Stateful::loading_state_version = 0;
250 _butler->drop_references ();
252 delete midi_control_ui;
253 delete _all_route_group;
255 if (click_data != default_click) {
256 delete [] click_data;
259 if (click_emphasis_data != default_click_emphasis) {
260 delete [] click_emphasis_data;
265 /* clear out any pending dead wood from RCU managed objects */
270 AudioDiskstream::free_working_buffers();
272 /* tell everyone who is still standing that we're about to die */
275 /* tell everyone to drop references and delete objects as we go */
277 DEBUG_TRACE (DEBUG::Destruction, "delete named selections\n");
278 named_selections.clear ();
280 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
281 RegionFactory::delete_all_regions ();
283 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
285 /* reset these three references to special routes before we do the usual route delete thing */
288 _master_out.reset ();
289 _monitor_out.reset ();
292 RCUWriter<RouteList> writer (routes);
293 boost::shared_ptr<RouteList> r = writer.get_copy ();
295 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
296 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
297 (*i)->drop_references ();
301 /* writer goes out of scope and updates master */
305 boost::shared_ptr<RouteList> r = routes.reader ();
307 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
308 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
309 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->path(), i->second.use_count()));
310 i->second->drop_references ();
315 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
316 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
321 Crossfade::set_buffer_size (0);
323 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
326 boost_debug_list_ptrs ();
331 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
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);
665 Session::hookup_io ()
667 /* stop graph reordering notifications from
668 causing resorts, etc.
671 _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 Auditioner* a = new Auditioner (*this);
684 throw failed_constructor();
686 a->use_new_diskstream ();
687 auditioner.reset (a);
690 catch (failed_constructor& err) {
691 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
695 /* load bundles, which we may have postponed earlier on */
696 if (_bundle_xml_node) {
697 load_bundles (*_bundle_xml_node);
698 delete _bundle_xml_node;
701 /* Tell all IO objects to connect themselves together */
703 IO::enable_connecting ();
704 MIDI::Port::MakeConnections ();
706 /* Now reset all panners */
708 Delivery::reset_panners ();
710 /* Connect tracks to monitor/listen bus if there is one.
711 Note that in an existing session, the internal sends will
712 already exist, but we want the routes to notice that
713 they connect to the control out specifically.
717 boost::shared_ptr<RouteList> r = routes.reader ();
718 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
720 if ((*x)->is_monitor()) {
724 } else if ((*x)->is_master()) {
730 (*x)->listen_via (_monitor_out,
731 (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader),
737 /* Anyone who cares about input state, wake up and do something */
739 IOConnectionsComplete (); /* EMIT SIGNAL */
741 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
743 /* now handle the whole enchilada as if it was one
749 /* update the full solo state, which can't be
750 correctly determined on a per-route basis, but
751 needs the global overview that only the session
755 update_route_solo_state ();
759 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
761 boost::shared_ptr<Track> track = wp.lock ();
766 boost::shared_ptr<Playlist> playlist;
768 if ((playlist = track->playlist()) != 0) {
769 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
770 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
775 Session::record_enabling_legal () const
777 /* this used to be in here, but survey says.... we don't need to restrict it */
778 // if (record_status() == Recording) {
782 if (Config->get_all_safe()) {
789 Session::reset_input_monitor_state ()
791 if (transport_rolling()) {
793 boost::shared_ptr<RouteList> rl = routes.reader ();
794 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
795 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
796 if (tr && tr->record_enabled ()) {
797 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
798 tr->monitor_input (Config->get_monitoring_model() == HardwareMonitoring && !config.get_auto_input());
804 boost::shared_ptr<RouteList> rl = routes.reader ();
805 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
806 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
807 if (tr && tr->record_enabled ()) {
808 //cerr << "switching to input = " << !Config->get_auto_input() << __FILE__ << __LINE__ << endl << endl;
809 tr->monitor_input (Config->get_monitoring_model() == HardwareMonitoring);
816 Session::auto_punch_start_changed (Location* location)
818 replace_event (SessionEvent::PunchIn, location->start());
820 if (get_record_enabled() && config.get_punch_in()) {
821 /* capture start has been changed, so save new pending state */
822 save_state ("", true);
827 Session::auto_punch_end_changed (Location* location)
829 framepos_t when_to_stop = location->end();
830 // when_to_stop += _worst_output_latency + _worst_input_latency;
831 replace_event (SessionEvent::PunchOut, when_to_stop);
835 Session::auto_punch_changed (Location* location)
837 framepos_t when_to_stop = location->end();
839 replace_event (SessionEvent::PunchIn, location->start());
840 //when_to_stop += _worst_output_latency + _worst_input_latency;
841 replace_event (SessionEvent::PunchOut, when_to_stop);
845 Session::auto_loop_changed (Location* location)
847 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
849 if (transport_rolling() && play_loop) {
852 // if (_transport_frame > location->end()) {
854 if (_transport_frame < location->start() || _transport_frame > location->end()) {
855 // relocate to beginning of loop
856 clear_events (SessionEvent::LocateRoll);
858 request_locate (location->start(), true);
861 else if (Config->get_seamless_loop() && !loop_changing) {
863 // schedule a locate-roll to refill the diskstreams at the
865 loop_changing = true;
867 if (location->end() > last_loopend) {
868 clear_events (SessionEvent::LocateRoll);
869 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
876 last_loopend = location->end();
880 Session::set_auto_punch_location (Location* location)
884 if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
885 punch_connections.drop_connections();
886 existing->set_auto_punch (false, this);
887 remove_event (existing->start(), SessionEvent::PunchIn);
888 clear_events (SessionEvent::PunchOut);
889 auto_punch_location_changed (0);
898 if (location->end() <= location->start()) {
899 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
903 punch_connections.drop_connections ();
905 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
906 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
907 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
909 location->set_auto_punch (true, this);
911 auto_punch_changed (location);
913 auto_punch_location_changed (location);
917 Session::set_auto_loop_location (Location* location)
921 if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
922 loop_connections.drop_connections ();
923 existing->set_auto_loop (false, this);
924 remove_event (existing->end(), SessionEvent::AutoLoop);
925 auto_loop_location_changed (0);
934 if (location->end() <= location->start()) {
935 error << _("Session: you can't use a mark for auto loop") << endmsg;
939 last_loopend = location->end();
941 loop_connections.drop_connections ();
943 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
944 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
945 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
947 location->set_auto_loop (true, this);
949 /* take care of our stuff first */
951 auto_loop_changed (location);
953 /* now tell everyone else */
955 auto_loop_location_changed (location);
959 Session::locations_added (Location *)
965 Session::locations_changed ()
967 _locations->apply (*this, &Session::handle_locations_changed);
971 Session::handle_locations_changed (Locations::LocationList& locations)
973 Locations::LocationList::iterator i;
975 bool set_loop = false;
976 bool set_punch = false;
978 for (i = locations.begin(); i != locations.end(); ++i) {
982 if (location->is_auto_punch()) {
983 set_auto_punch_location (location);
986 if (location->is_auto_loop()) {
987 set_auto_loop_location (location);
991 if (location->is_session_range()) {
992 _session_range_location = location;
997 set_auto_loop_location (0);
1000 set_auto_punch_location (0);
1007 Session::enable_record ()
1010 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1012 if (rs == Recording) {
1016 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1018 _last_record_location = _transport_frame;
1019 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1021 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1023 boost::shared_ptr<RouteList> rl = routes.reader ();
1024 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1025 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1026 if (tr && tr->record_enabled ()) {
1027 tr->monitor_input (true);
1032 RecordStateChanged ();
1039 Session::disable_record (bool rt_context, bool force)
1043 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1045 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1046 g_atomic_int_set (&_record_status, Disabled);
1047 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1049 if (rs == Recording) {
1050 g_atomic_int_set (&_record_status, Enabled);
1054 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1056 boost::shared_ptr<RouteList> rl = routes.reader ();
1057 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1058 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1059 if (tr && tr->record_enabled ()) {
1060 tr->monitor_input (false);
1065 RecordStateChanged (); /* emit signal */
1068 remove_pending_capture_state ();
1074 Session::step_back_from_record ()
1076 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1078 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1079 boost::shared_ptr<RouteList> rl = routes.reader ();
1080 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1081 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1082 if (tr && tr->record_enabled ()) {
1083 //cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl;
1084 tr->monitor_input (false);
1092 Session::maybe_enable_record ()
1094 if (_step_editors > 0) {
1098 g_atomic_int_set (&_record_status, Enabled);
1100 /* This function is currently called from somewhere other than an RT thread.
1101 This save_state() call therefore doesn't impact anything. Doing it here
1102 means that we save pending state of which sources the next record will use,
1103 which gives us some chance of recovering from a crash during the record.
1106 save_state ("", true);
1108 if (_transport_speed) {
1109 if (!config.get_punch_in()) {
1113 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1114 RecordStateChanged (); /* EMIT SIGNAL */
1121 Session::audible_frame () const
1127 /* the first of these two possible settings for "offset"
1128 mean that the audible frame is stationary until
1129 audio emerges from the latency compensation
1132 the second means that the audible frame is stationary
1133 until audio would emerge from a physical port
1134 in the absence of any plugin latency compensation
1137 offset = _worst_output_latency;
1139 if (offset > current_block_size) {
1140 offset -= current_block_size;
1142 /* XXX is this correct? if we have no external
1143 physical connections and everything is internal
1144 then surely this is zero? still, how
1145 likely is that anyway?
1147 offset = current_block_size;
1150 if (synced_to_jack()) {
1151 tf = _engine.transport_frame();
1153 tf = _transport_frame;
1158 if (!non_realtime_work_pending()) {
1162 /* Check to see if we have passed the first guaranteed
1163 audible frame past our last start position. if not,
1164 return that last start point because in terms
1165 of audible frames, we have not moved yet.
1167 `Start position' in this context means the time we last
1168 either started or changed transport direction.
1171 if (_transport_speed > 0.0f) {
1173 if (!play_loop || !have_looped) {
1174 if (tf < _last_roll_or_reversal_location + offset) {
1175 return _last_roll_or_reversal_location;
1183 } else if (_transport_speed < 0.0f) {
1185 /* XXX wot? no backward looping? */
1187 if (tf > _last_roll_or_reversal_location - offset) {
1188 return _last_roll_or_reversal_location;
1200 Session::set_frame_rate (framecnt_t frames_per_second)
1202 /** \fn void Session::set_frame_size(framecnt_t)
1203 the AudioEngine object that calls this guarantees
1204 that it will not be called while we are also in
1205 ::process(). Its fine to do things that block
1209 _base_frame_rate = frames_per_second;
1213 Automatable::set_automation_interval (ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1217 // XXX we need some equivalent to this, somehow
1218 // SndFileSource::setup_standard_crossfades (frames_per_second);
1222 /* XXX need to reset/reinstantiate all LADSPA plugins */
1226 Session::set_block_size (pframes_t nframes)
1228 /* the AudioEngine guarantees
1229 that it will not be called while we are also in
1230 ::process(). It is therefore fine to do things that block
1235 current_block_size = nframes;
1239 boost::shared_ptr<RouteList> r = routes.reader ();
1241 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1242 (*i)->set_block_size (nframes);
1245 boost::shared_ptr<RouteList> rl = routes.reader ();
1246 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1247 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1249 tr->set_block_size (nframes);
1253 set_worst_io_latencies ();
1258 Session::set_default_fade (float /*steepness*/, float /*fade_msecs*/)
1261 framecnt_t fade_frames;
1263 /* Don't allow fade of less 1 frame */
1265 if (fade_msecs < (1000.0 * (1.0/_current_frame_rate))) {
1272 fade_frames = (framecnt_t) floor (fade_msecs * _current_frame_rate * 0.001);
1276 default_fade_msecs = fade_msecs;
1277 default_fade_steepness = steepness;
1280 // jlc, WTF is this!
1281 Glib::RWLock::ReaderLock lm (route_lock);
1282 AudioRegion::set_default_fade (steepness, fade_frames);
1287 /* XXX have to do this at some point */
1288 /* foreach region using default fade, reset, then
1289 refill_all_diskstream_buffers ();
1294 struct RouteSorter {
1295 /** @return true to run r1 before r2, otherwise false */
1296 bool operator() (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> r2) {
1297 if (r2->feeds (r1)) {
1298 /* r1 fed by r2; run r2 early */
1300 } else if (r1->feeds (r2)) {
1301 /* r2 fed by r1; run r1 early */
1304 if (r1->not_fed ()) {
1305 if (r2->not_fed ()) {
1306 /* no ardour-based connections inbound to either route. just use signal order */
1307 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1309 /* r2 has connections, r1 does not; run r1 early */
1313 if (r2->not_fed()) {
1314 /* r1 has connections, r2 does not; run r2 early */
1317 /* both r1 and r2 have connections, but not to each other. just use signal order */
1318 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1326 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1328 boost::shared_ptr<Route> r2;
1330 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1331 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1335 /* make a copy of the existing list of routes that feed r1 */
1337 Route::FedBy existing (r1->fed_by());
1339 /* for each route that feeds r1, recurse, marking it as feeding
1343 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1344 if (!(r2 = i->r.lock ())) {
1345 /* (*i) went away, ignore it */
1349 /* r2 is a route that feeds r1 which somehow feeds base. mark
1350 base as being fed by r2
1353 rbase->add_fed_by (r2, i->sends_only);
1357 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1361 if (r1->feeds (r2) && r2->feeds (r1)) {
1365 /* now recurse, so that we can mark base as being fed by
1366 all routes that feed r2
1369 trace_terminal (r2, rbase);
1376 Session::resort_routes ()
1378 /* don't do anything here with signals emitted
1379 by Routes while we are being destroyed.
1382 if (_state_of_the_state & Deletion) {
1387 RCUWriter<RouteList> writer (routes);
1388 boost::shared_ptr<RouteList> r = writer.get_copy ();
1389 resort_routes_using (r);
1390 /* writer goes out of scope and forces update */
1393 //route_graph->dump(1);
1396 boost::shared_ptr<RouteList> rl = routes.reader ();
1397 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1398 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1400 const Route::FedBy& fb ((*i)->fed_by());
1402 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1403 boost::shared_ptr<Route> sf = f->r.lock();
1405 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1413 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1415 RouteList::iterator i, j;
1417 for (i = r->begin(); i != r->end(); ++i) {
1419 (*i)->clear_fed_by ();
1421 for (j = r->begin(); j != r->end(); ++j) {
1423 /* although routes can feed themselves, it will
1424 cause an endless recursive descent if we
1425 detect it. so don't bother checking for
1433 bool via_sends_only;
1435 if ((*j)->direct_feeds (*i, &via_sends_only)) {
1436 (*i)->add_fed_by (*j, via_sends_only);
1441 for (i = r->begin(); i != r->end(); ++i) {
1442 trace_terminal (*i, *i);
1448 route_graph->rechain (r);
1451 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1452 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1453 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1454 (*i)->name(), (*i)->order_key ("signal")));
1460 /** Find the route name starting with \a base with the lowest \a id.
1462 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1463 * The available route name with the lowest ID will be used, and \a id
1464 * will be set to the ID.
1466 * \return false if a route name could not be found, and \a track_name
1467 * and \a id do not reflect a free route name.
1470 Session::find_route_name (const char* base, uint32_t& id, char* name, size_t name_len)
1473 snprintf (name, name_len, "%s %" PRIu32, base, id);
1475 if (route_by_name (name) == 0) {
1481 } while (id < (UINT_MAX-1));
1486 /** Count the total ins and outs of all non-hidden routes in the session and return them in in and out */
1488 Session::count_existing_route_channels (ChanCount& in, ChanCount& out)
1490 in = ChanCount::ZERO;
1491 out = ChanCount::ZERO;
1492 boost::shared_ptr<RouteList> r = routes.reader ();
1493 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1494 if (!(*i)->is_hidden()) {
1495 in += (*i)->n_inputs();
1496 out += (*i)->n_outputs();
1501 /** Caller must not hold process lock */
1502 list<boost::shared_ptr<MidiTrack> >
1503 Session::new_midi_track (TrackMode mode, RouteGroup* route_group, uint32_t how_many)
1505 char track_name[32];
1506 uint32_t track_id = 0;
1507 ChanCount existing_inputs;
1508 ChanCount existing_outputs;
1510 RouteList new_routes;
1511 list<boost::shared_ptr<MidiTrack> > ret;
1512 uint32_t control_id;
1514 count_existing_route_channels (existing_inputs, existing_outputs);
1516 control_id = ntracks() + nbusses();
1519 if (!find_route_name ("Midi", ++track_id, track_name, sizeof(track_name))) {
1520 error << "cannot find name for new midi track" << endmsg;
1524 boost::shared_ptr<MidiTrack> track;
1527 MidiTrack* mt = new MidiTrack (*this, track_name, Route::Flag (0), mode);
1534 mt->use_new_diskstream();
1536 boost_debug_shared_ptr_mark_interesting (mt, "Track");
1537 track = boost::shared_ptr<MidiTrack>(mt);
1540 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1541 if (track->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1542 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1546 if (track->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1547 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1552 auto_connect_route (track.get(), existing_inputs, existing_outputs);
1554 track->non_realtime_input_change();
1557 route_group->add (track);
1560 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1561 track->set_remote_control_id (control_id);
1563 new_routes.push_back (track);
1564 ret.push_back (track);
1567 catch (failed_constructor &err) {
1568 error << _("Session: could not create new midi track.") << endmsg;
1572 catch (AudioEngine::PortRegistrationFailure& pfe) {
1574 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;
1582 if (!new_routes.empty()) {
1583 add_routes (new_routes, false);
1584 save_state (_current_snapshot_name);
1590 /** Caller must hold process lock.
1591 * @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1592 * @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1593 * @param output_start As \a input_start, but for outputs.
1596 Session::auto_connect_route (
1597 Route* route, ChanCount& existing_inputs, ChanCount& existing_outputs, bool connect_inputs, ChanCount input_start, ChanCount output_start
1600 /* If both inputs and outputs are auto-connected to physical ports,
1601 use the max of input and output offsets to ensure auto-connected
1602 port numbers always match up (e.g. the first audio input and the
1603 first audio output of the route will have the same physical
1604 port number). Otherwise just use the lowest input or output
1608 const bool in_out_physical =
1609 (Config->get_input_auto_connect() & AutoConnectPhysical)
1610 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1613 const ChanCount in_offset = in_out_physical
1614 ? ChanCount::max(existing_inputs, existing_outputs)
1617 const ChanCount out_offset = in_out_physical
1618 ? ChanCount::max(existing_inputs, existing_outputs)
1621 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1622 vector<string> physinputs;
1623 vector<string> physoutputs;
1625 _engine.get_physical_outputs (*t, physoutputs);
1626 _engine.get_physical_inputs (*t, physinputs);
1628 if (!physinputs.empty() && connect_inputs) {
1629 uint32_t nphysical_in = physinputs.size();
1630 for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1633 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1634 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1637 if (!port.empty() && route->input()->connect (
1638 route->input()->ports().port(*t, i), port, this)) {
1644 if (!physoutputs.empty()) {
1645 uint32_t nphysical_out = physoutputs.size();
1646 for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1649 if (Config->get_output_auto_connect() & AutoConnectPhysical) {
1650 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1651 } else if (Config->get_output_auto_connect() & AutoConnectMaster) {
1652 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1653 port = _master_out->input()->ports().port(*t,
1654 i % _master_out->input()->n_ports().get(*t))->name();
1658 if (!port.empty() && route->output()->connect (
1659 route->output()->ports().port(*t, i), port, this)) {
1666 existing_inputs += route->n_inputs();
1667 existing_outputs += route->n_outputs();
1670 /** Caller must not hold process lock */
1671 list< boost::shared_ptr<AudioTrack> >
1672 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group, uint32_t how_many)
1674 char track_name[32];
1675 uint32_t track_id = 0;
1676 ChanCount existing_inputs;
1677 ChanCount existing_outputs;
1679 RouteList new_routes;
1680 list<boost::shared_ptr<AudioTrack> > ret;
1681 uint32_t control_id;
1683 count_existing_route_channels (existing_inputs, existing_outputs);
1685 control_id = ntracks() + nbusses() + 1;
1688 if (!find_route_name ("Audio", ++track_id, track_name, sizeof(track_name))) {
1689 error << "cannot find name for new audio track" << endmsg;
1693 boost::shared_ptr<AudioTrack> track;
1696 AudioTrack* at = new AudioTrack (*this, track_name, Route::Flag (0), mode);
1703 at->use_new_diskstream();
1705 boost_debug_shared_ptr_mark_interesting (at, "Track");
1706 track = boost::shared_ptr<AudioTrack>(at);
1709 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1711 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1712 error << string_compose (
1713 _("cannot configure %1 in/%2 out configuration for new audio track"),
1714 input_channels, output_channels)
1719 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1720 error << string_compose (
1721 _("cannot configure %1 in/%2 out configuration for new audio track"),
1722 input_channels, output_channels)
1727 auto_connect_route (track.get(), existing_inputs, existing_outputs);
1731 route_group->add (track);
1734 track->non_realtime_input_change();
1736 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1737 track->set_remote_control_id (control_id);
1740 new_routes.push_back (track);
1741 ret.push_back (track);
1744 catch (failed_constructor &err) {
1745 error << _("Session: could not create new audio track.") << endmsg;
1749 catch (AudioEngine::PortRegistrationFailure& pfe) {
1751 error << pfe.what() << endmsg;
1759 if (!new_routes.empty()) {
1760 add_routes (new_routes, true);
1767 Session::set_remote_control_ids ()
1769 RemoteModel m = Config->get_remote_model();
1770 bool emit_signal = false;
1772 boost::shared_ptr<RouteList> r = routes.reader ();
1774 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1775 if (MixerOrdered == m) {
1776 int32_t order = (*i)->order_key(N_("signal"));
1777 (*i)->set_remote_control_id (order+1, false);
1779 } else if (EditorOrdered == m) {
1780 int32_t order = (*i)->order_key(N_("editor"));
1781 (*i)->set_remote_control_id (order+1, false);
1783 } else if (UserOrdered == m) {
1784 //do nothing ... only changes to remote id's are initiated by user
1789 Route::RemoteControlIDChange();
1793 /** Caller must not hold process lock */
1795 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many)
1798 uint32_t bus_id = 0;
1799 ChanCount existing_inputs;
1800 ChanCount existing_outputs;
1803 uint32_t control_id;
1805 count_existing_route_channels (existing_inputs, existing_outputs);
1807 control_id = ntracks() + nbusses() + 1;
1810 if (!find_route_name ("Bus", ++bus_id, bus_name, sizeof(bus_name))) {
1811 error << "cannot find name for new audio bus" << endmsg;
1816 Route* rt = new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO);
1823 boost_debug_shared_ptr_mark_interesting (rt, "Route");
1824 boost::shared_ptr<Route> bus (rt);
1827 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1829 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1830 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1831 input_channels, output_channels)
1837 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1838 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1839 input_channels, output_channels)
1844 auto_connect_route (bus.get(), existing_inputs, existing_outputs, false);
1848 route_group->add (bus);
1850 bus->set_remote_control_id (control_id);
1853 bus->add_internal_return ();
1855 ret.push_back (bus);
1859 catch (failed_constructor &err) {
1860 error << _("Session: could not create new audio route.") << endmsg;
1864 catch (AudioEngine::PortRegistrationFailure& pfe) {
1865 error << pfe.what() << endmsg;
1875 add_routes (ret, true);
1883 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
1887 uint32_t control_id;
1889 uint32_t number = 0;
1891 if (!tree.read (template_path.c_str())) {
1895 XMLNode* node = tree.root();
1897 control_id = ntracks() + nbusses() + 1;
1901 XMLNode node_copy (*node); // make a copy so we can change the name if we need to
1903 std::string node_name = IO::name_from_state (*node_copy.children().front());
1905 /* generate a new name by adding a number to the end of the template name */
1906 if (!find_route_name (node_name.c_str(), ++number, name, sizeof(name))) {
1907 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
1911 /* set IO children to use the new name */
1912 XMLNodeList const & children = node_copy.children ();
1913 for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
1914 if ((*i)->name() == IO::state_node_name) {
1915 IO::set_name_in_state (**i, name);
1919 Track::zero_diskstream_id_in_xml (node_copy);
1922 boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
1925 error << _("Session: cannot create track/bus from template description") << endmsg;
1929 if (boost::dynamic_pointer_cast<Track>(route)) {
1930 /* force input/output change signals so that the new diskstream
1931 picks up the configuration of the route. During session
1932 loading this normally happens in a different way.
1935 Glib::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1937 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
1938 change.after = route->input()->n_ports();
1939 route->input()->changed (change, this);
1940 change.after = route->output()->n_ports();
1941 route->output()->changed (change, this);
1944 route->set_remote_control_id (control_id);
1947 ret.push_back (route);
1950 catch (failed_constructor &err) {
1951 error << _("Session: could not create new route from template") << endmsg;
1955 catch (AudioEngine::PortRegistrationFailure& pfe) {
1956 error << pfe.what() << endmsg;
1965 add_routes (ret, true);
1972 Session::add_routes (RouteList& new_routes, bool save)
1975 RCUWriter<RouteList> writer (routes);
1976 boost::shared_ptr<RouteList> r = writer.get_copy ();
1977 r->insert (r->end(), new_routes.begin(), new_routes.end());
1980 /* if there is no control out and we're not in the middle of loading,
1981 resort the graph here. if there is a control out, we will resort
1982 toward the end of this method. if we are in the middle of loading,
1983 we will resort when done.
1986 if (!_monitor_out && IO::connecting_legal) {
1987 resort_routes_using (r);
1991 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
1993 boost::weak_ptr<Route> wpr (*x);
1994 boost::shared_ptr<Route> r (*x);
1996 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
1997 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
1998 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
1999 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2000 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2001 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2002 r->order_key_changed.connect_same_thread (*this, boost::bind (&Session::route_order_key_changed, this));
2004 if (r->is_master()) {
2008 if (r->is_monitor()) {
2012 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2014 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2015 track_playlist_changed (boost::weak_ptr<Track> (tr));
2016 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2018 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2020 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2025 if (_monitor_out && IO::connecting_legal) {
2027 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2028 if ((*x)->is_monitor()) {
2030 } else if ((*x)->is_master()) {
2033 (*x)->listen_via (_monitor_out,
2034 (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader),
2045 save_state (_current_snapshot_name);
2048 RouteAdded (new_routes); /* EMIT SIGNAL */
2049 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
2053 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2055 boost::shared_ptr<RouteList> r = routes.reader ();
2056 boost::shared_ptr<Send> s;
2058 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2059 if ((s = (*i)->internal_send_for (dest)) != 0) {
2060 s->amp()->gain_control()->set_value (0.0);
2066 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2068 boost::shared_ptr<RouteList> r = routes.reader ();
2069 boost::shared_ptr<Send> s;
2071 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2072 if ((s = (*i)->internal_send_for (dest)) != 0) {
2073 s->amp()->gain_control()->set_value (1.0);
2079 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2081 boost::shared_ptr<RouteList> r = routes.reader ();
2082 boost::shared_ptr<Send> s;
2084 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2085 if ((s = (*i)->internal_send_for (dest)) != 0) {
2086 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2091 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2093 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2095 boost::shared_ptr<RouteList> r = routes.reader ();
2096 boost::shared_ptr<RouteList> t (new RouteList);
2098 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2099 if (include_buses || boost::dynamic_pointer_cast<Track>(*i)) {
2104 add_internal_sends (dest, p, t);
2108 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2110 if (dest->is_monitor() || dest->is_master()) {
2114 if (!dest->internal_return()) {
2115 dest->add_internal_return();
2118 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2120 if ((*i)->is_monitor() || (*i)->is_master() || (*i) == dest) {
2124 (*i)->listen_via (dest, p, true, true);
2131 Session::remove_route (boost::shared_ptr<Route> route)
2133 if (((route == _master_out) || (route == _monitor_out)) && !Config->get_allow_special_bus_removal()) {
2137 route->set_solo (false, this);
2140 RCUWriter<RouteList> writer (routes);
2141 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2145 /* deleting the master out seems like a dumb
2146 idea, but its more of a UI policy issue
2150 if (route == _master_out) {
2151 _master_out = boost::shared_ptr<Route> ();
2154 if (route == _monitor_out) {
2156 /* cancel control outs for all routes */
2158 for (RouteList::iterator r = rs->begin(); r != rs->end(); ++r) {
2159 (*r)->drop_listen (_monitor_out);
2162 _monitor_out.reset ();
2165 /* writer goes out of scope, forces route list update */
2168 update_route_solo_state ();
2170 // We need to disconnect the route's inputs and outputs
2172 route->input()->disconnect (0);
2173 route->output()->disconnect (0);
2175 /* if the route had internal sends sending to it, remove them */
2176 if (route->internal_return()) {
2178 boost::shared_ptr<RouteList> r = routes.reader ();
2179 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2180 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2182 (*i)->remove_processor (s);
2187 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2188 if (mt && mt->step_editing()) {
2189 if (_step_editors > 0) {
2194 update_latency_compensation (false, false);
2197 /* Re-sort routes to remove the graph's current references to the one that is
2198 * going away, then flush old references out of the graph.
2202 route_graph->clear_other_chain ();
2204 /* get rid of it from the dead wood collection in the route list manager */
2206 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2210 /* try to cause everyone to drop their references */
2212 route->drop_references ();
2214 sync_order_keys (N_("session"));
2216 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2218 /* save the new state of the world */
2220 if (save_state (_current_snapshot_name)) {
2221 save_history (_current_snapshot_name);
2226 Session::route_mute_changed (void* /*src*/)
2232 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2234 boost::shared_ptr<Route> route = wpr.lock();
2236 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2240 if (route->listening()) {
2242 if (Config->get_exclusive_solo()) {
2243 /* new listen: disable all other listen */
2244 boost::shared_ptr<RouteList> r = routes.reader ();
2245 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2246 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2249 (*i)->set_listen (false, this);
2255 } else if (_listen_cnt > 0) {
2261 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2263 boost::shared_ptr<Route> route = wpr.lock ();
2266 /* should not happen */
2267 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2271 bool send_changed = false;
2273 if (route->solo_isolated()) {
2274 if (_solo_isolated_cnt == 0) {
2275 send_changed = true;
2277 _solo_isolated_cnt++;
2278 } else if (_solo_isolated_cnt > 0) {
2279 _solo_isolated_cnt--;
2280 if (_solo_isolated_cnt == 0) {
2281 send_changed = true;
2286 IsolatedChanged (); /* EMIT SIGNAL */
2291 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2293 if (!self_solo_change) {
2294 // session doesn't care about changes to soloed-by-others
2298 if (solo_update_disabled) {
2303 boost::shared_ptr<Route> route = wpr.lock ();
2306 /* should not happen */
2307 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2311 boost::shared_ptr<RouteList> r = routes.reader ();
2314 if (route->self_soloed()) {
2320 if (delta == 1 && Config->get_exclusive_solo()) {
2321 /* new solo: disable all other solos */
2322 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2323 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2326 (*i)->set_solo (false, this);
2330 solo_update_disabled = true;
2332 RouteList uninvolved;
2334 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2335 bool via_sends_only;
2336 bool in_signal_flow;
2338 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2342 in_signal_flow = false;
2344 if ((*i)->feeds (route, &via_sends_only)) {
2345 if (!via_sends_only) {
2346 if (!route->soloed_by_others_upstream()) {
2347 (*i)->mod_solo_by_others_downstream (delta);
2349 in_signal_flow = true;
2353 if (route->feeds (*i, &via_sends_only)) {
2354 (*i)->mod_solo_by_others_upstream (delta);
2355 in_signal_flow = true;
2358 if (!in_signal_flow) {
2359 uninvolved.push_back (*i);
2363 solo_update_disabled = false;
2364 update_route_solo_state (r);
2366 /* now notify that the mute state of the routes not involved in the signal
2367 pathway of the just-solo-changed route may have altered.
2370 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2371 (*i)->mute_changed (this);
2374 SoloChanged (); /* EMIT SIGNAL */
2379 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2381 /* now figure out if anything that matters is soloed (or is "listening")*/
2383 bool something_soloed = false;
2384 uint32_t listeners = 0;
2385 uint32_t isolated = 0;
2388 r = routes.reader();
2391 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2392 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2393 something_soloed = true;
2396 if (!(*i)->is_hidden() && (*i)->listening()) {
2397 if (Config->get_solo_control_is_listen_control()) {
2400 (*i)->set_listen (false, this);
2404 if ((*i)->solo_isolated()) {
2409 if (something_soloed != _non_soloed_outs_muted) {
2410 _non_soloed_outs_muted = something_soloed;
2411 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2414 _listen_cnt = listeners;
2416 if (isolated != _solo_isolated_cnt) {
2417 _solo_isolated_cnt = isolated;
2418 IsolatedChanged (); /* EMIT SIGNAL */
2422 boost::shared_ptr<RouteList>
2423 Session::get_routes_with_internal_returns() const
2425 boost::shared_ptr<RouteList> r = routes.reader ();
2426 boost::shared_ptr<RouteList> rl (new RouteList);
2428 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2429 if ((*i)->internal_return ()) {
2437 Session::io_name_is_legal (const std::string& name)
2439 boost::shared_ptr<RouteList> r = routes.reader ();
2441 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2442 if ((*i)->name() == name) {
2446 if ((*i)->has_io_processor_named (name)) {
2454 boost::shared_ptr<Route>
2455 Session::route_by_name (string name)
2457 boost::shared_ptr<RouteList> r = routes.reader ();
2459 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2460 if ((*i)->name() == name) {
2465 return boost::shared_ptr<Route> ((Route*) 0);
2468 boost::shared_ptr<Route>
2469 Session::route_by_id (PBD::ID id)
2471 boost::shared_ptr<RouteList> r = routes.reader ();
2473 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2474 if ((*i)->id() == id) {
2479 return boost::shared_ptr<Route> ((Route*) 0);
2482 boost::shared_ptr<Route>
2483 Session::route_by_remote_id (uint32_t id)
2485 boost::shared_ptr<RouteList> r = routes.reader ();
2487 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2488 if ((*i)->remote_control_id() == id) {
2493 return boost::shared_ptr<Route> ((Route*) 0);
2497 Session::playlist_region_added (boost::weak_ptr<Region> w)
2499 boost::shared_ptr<Region> r = w.lock ();
2504 /* These are the operations that are currently in progress... */
2505 list<GQuark> curr = _current_trans_quarks;
2508 /* ...and these are the operations during which we want to update
2509 the session range location markers.
2512 ops.push_back (Operations::capture);
2513 ops.push_back (Operations::paste);
2514 ops.push_back (Operations::duplicate_region);
2515 ops.push_back (Operations::insert_file);
2516 ops.push_back (Operations::insert_region);
2517 ops.push_back (Operations::drag_region_brush);
2518 ops.push_back (Operations::region_drag);
2519 ops.push_back (Operations::selection_grab);
2520 ops.push_back (Operations::region_fill);
2521 ops.push_back (Operations::fill_selection);
2522 ops.push_back (Operations::create_region);
2525 /* See if any of the current operations match the ones that we want */
2527 set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2529 /* If so, update the session range markers */
2531 maybe_update_session_range (r->position (), r->last_frame ());
2535 /** Update the session range markers if a is before the current start or
2536 * b is after the current end.
2539 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2541 if (_state_of_the_state & Loading) {
2545 if (_session_range_location == 0) {
2547 add_session_range_location (a, b);
2551 if (a < _session_range_location->start()) {
2552 _session_range_location->set_start (a);
2555 if (b > _session_range_location->end()) {
2556 _session_range_location->set_end (b);
2562 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2564 for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2565 maybe_update_session_range (i->to, i->to + i->length);
2569 /* Region management */
2571 boost::shared_ptr<Region>
2572 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2574 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2575 RegionFactory::RegionMap::const_iterator i;
2576 boost::shared_ptr<Region> region;
2578 Glib::Mutex::Lock lm (region_lock);
2580 for (i = regions.begin(); i != regions.end(); ++i) {
2584 if (region->whole_file()) {
2586 if (child->source_equivalent (region)) {
2592 return boost::shared_ptr<Region> ();
2596 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2598 set<boost::shared_ptr<Region> > relevant_regions;
2600 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2601 RegionFactory::get_regions_using_source (*s, relevant_regions);
2604 cerr << "There are " << relevant_regions.size() << " using " << srcs.size() << " sources" << endl;
2606 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2607 set<boost::shared_ptr<Region> >::iterator tmp;
2612 cerr << "Cleanup " << (*r)->name() << " UC = " << (*r).use_count() << endl;
2614 playlists->destroy_region (*r);
2615 RegionFactory::map_remove (*r);
2617 (*r)->drop_sources ();
2618 (*r)->drop_references ();
2620 cerr << "\tdone UC = " << (*r).use_count() << endl;
2622 relevant_regions.erase (r);
2627 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2630 Glib::Mutex::Lock ls (source_lock);
2631 /* remove from the main source list */
2632 sources.erase ((*s)->id());
2635 (*s)->mark_for_remove ();
2636 (*s)->drop_references ();
2645 Session::remove_last_capture ()
2647 list<boost::shared_ptr<Source> > srcs;
2649 boost::shared_ptr<RouteList> rl = routes.reader ();
2650 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2651 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2656 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2659 srcs.insert (srcs.end(), l.begin(), l.end());
2664 destroy_sources (srcs);
2666 save_state (_current_snapshot_name);
2671 /* Source Management */
2674 Session::add_source (boost::shared_ptr<Source> source)
2676 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2677 pair<SourceMap::iterator,bool> result;
2679 entry.first = source->id();
2680 entry.second = source;
2683 Glib::Mutex::Lock lm (source_lock);
2684 result = sources.insert (entry);
2687 if (result.second) {
2689 /* yay, new source */
2693 boost::shared_ptr<AudioFileSource> afs;
2695 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2696 if (Config->get_auto_analyse_audio()) {
2697 Analyser::queue_source_for_analysis (source, false);
2704 Session::remove_source (boost::weak_ptr<Source> src)
2706 SourceMap::iterator i;
2707 boost::shared_ptr<Source> source = src.lock();
2714 Glib::Mutex::Lock lm (source_lock);
2716 if ((i = sources.find (source->id())) != sources.end()) {
2717 cerr << "Removing source " << source->name() << endl;
2722 if (!_state_of_the_state & InCleanup) {
2724 /* save state so we don't end up with a session file
2725 referring to non-existent sources.
2728 save_state (_current_snapshot_name);
2732 boost::shared_ptr<Source>
2733 Session::source_by_id (const PBD::ID& id)
2735 Glib::Mutex::Lock lm (source_lock);
2736 SourceMap::iterator i;
2737 boost::shared_ptr<Source> source;
2739 if ((i = sources.find (id)) != sources.end()) {
2746 boost::shared_ptr<Source>
2747 Session::source_by_path_and_channel (const string& path, uint16_t chn)
2749 Glib::Mutex::Lock lm (source_lock);
2751 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2752 boost::shared_ptr<AudioFileSource> afs
2753 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
2755 if (afs && afs->path() == path && chn == afs->channel()) {
2759 return boost::shared_ptr<Source>();
2763 Session::count_sources_by_origin (const string& path)
2766 Glib::Mutex::Lock lm (source_lock);
2768 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2769 boost::shared_ptr<FileSource> fs
2770 = boost::dynamic_pointer_cast<FileSource>(i->second);
2772 if (fs && fs->origin() == path) {
2782 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
2785 string old_basename = PBD::basename_nosuffix (oldname);
2786 string new_legalized = legalize_for_path (newname);
2788 /* note: we know (or assume) the old path is already valid */
2792 /* destructive file sources have a name of the form:
2794 /path/to/Tnnnn-NAME(%[LR])?.wav
2796 the task here is to replace NAME with the new name.
2801 string::size_type dash;
2803 dir = Glib::path_get_dirname (path);
2804 path = Glib::path_get_basename (path);
2806 /* '-' is not a legal character for the NAME part of the path */
2808 if ((dash = path.find_last_of ('-')) == string::npos) {
2812 prefix = path.substr (0, dash);
2816 path += new_legalized;
2817 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
2818 path = Glib::build_filename (dir, path);
2822 /* non-destructive file sources have a name of the form:
2824 /path/to/NAME-nnnnn(%[LR])?.ext
2826 the task here is to replace NAME with the new name.
2831 string::size_type dash;
2832 string::size_type postfix;
2834 dir = Glib::path_get_dirname (path);
2835 path = Glib::path_get_basename (path);
2837 /* '-' is not a legal character for the NAME part of the path */
2839 if ((dash = path.find_last_of ('-')) == string::npos) {
2843 suffix = path.substr (dash+1);
2845 // Suffix is now everything after the dash. Now we need to eliminate
2846 // the nnnnn part, which is done by either finding a '%' or a '.'
2848 postfix = suffix.find_last_of ("%");
2849 if (postfix == string::npos) {
2850 postfix = suffix.find_last_of ('.');
2853 if (postfix != string::npos) {
2854 suffix = suffix.substr (postfix);
2856 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
2860 const uint32_t limit = 10000;
2861 char buf[PATH_MAX+1];
2863 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
2865 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
2867 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
2868 path = Glib::build_filename (dir, buf);
2876 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
2885 /** Return the full path (in some session directory) for a new within-session source.
2886 * \a name must be a session-unique name that does not contain slashes
2887 * (e.g. as returned by new_*_source_name)
2890 Session::new_source_path_from_name (DataType type, const string& name, bool as_stub)
2892 assert(name.find("/") == string::npos);
2894 SessionDirectory sdir(get_best_session_directory_for_new_source());
2897 if (type == DataType::AUDIO) {
2898 p = (as_stub ? sdir.sound_stub_path() : sdir.sound_path());
2899 } else if (type == DataType::MIDI) {
2900 p = (as_stub ? sdir.midi_stub_path() : sdir.midi_path());
2902 error << "Unknown source type, unable to create file path" << endmsg;
2907 return p.to_string();
2911 Session::peak_path (string base) const
2913 sys::path peakfile_path(_session_dir->peak_path());
2914 peakfile_path /= base + peakfile_suffix;
2915 return peakfile_path.to_string();
2918 /** Return a unique name based on \a base for a new internal audio source */
2920 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
2923 char buf[PATH_MAX+1];
2924 const uint32_t limit = 10000;
2926 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
2929 legalized = legalize_for_path (base);
2931 // Find a "version" of the base name that doesn't exist in any of the possible directories.
2932 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
2934 vector<space_and_path>::iterator i;
2935 uint32_t existing = 0;
2937 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2942 snprintf (buf, sizeof(buf), "T%04d-%s%s",
2943 cnt, legalized.c_str(), ext.c_str());
2944 } else if (nchan == 2) {
2946 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
2947 cnt, legalized.c_str(), ext.c_str());
2949 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
2950 cnt, legalized.c_str(), ext.c_str());
2952 } else if (nchan < 26) {
2953 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
2954 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
2956 snprintf (buf, sizeof(buf), "T%04d-%s%s",
2957 cnt, legalized.c_str(), ext.c_str());
2963 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
2964 } else if (nchan == 2) {
2966 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
2968 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
2970 } else if (nchan < 26) {
2971 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
2973 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
2977 SessionDirectory sdir((*i).path);
2979 string spath = sdir.sound_path().to_string();
2980 string spath_stubs = sdir.sound_stub_path().to_string();
2982 /* note that we search *without* the extension so that
2983 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
2984 in the event that this new name is required for
2985 a file format change.
2988 if (matching_unsuffixed_filename_exists_in (spath, buf) ||
2989 matching_unsuffixed_filename_exists_in (spath_stubs, buf)) {
2995 if (existing == 0) {
3000 error << string_compose(
3001 _("There are already %1 recordings for %2, which I consider too many."),
3002 limit, base) << endmsg;
3004 throw failed_constructor();
3008 return Glib::path_get_basename (buf);
3011 /** Create a new within-session audio source */
3012 boost::shared_ptr<AudioFileSource>
3013 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive, bool as_stub)
3015 const string name = new_audio_source_name (n, n_chans, chan, destructive);
3016 const string path = new_source_path_from_name(DataType::AUDIO, name, as_stub);
3018 return boost::dynamic_pointer_cast<AudioFileSource> (
3019 SourceFactory::createWritable (DataType::AUDIO, *this, path, string(), destructive, frame_rate()));
3022 /** Return a unique name based on \a base for a new internal MIDI source */
3024 Session::new_midi_source_name (const string& base)
3027 char buf[PATH_MAX+1];
3028 const uint32_t limit = 10000;
3032 legalized = legalize_for_path (base);
3034 // Find a "version" of the file name that doesn't exist in any of the possible directories.
3035 for (cnt = 1; cnt <= limit; ++cnt) {
3037 vector<space_and_path>::iterator i;
3038 uint32_t existing = 0;
3040 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3042 SessionDirectory sdir((*i).path);
3044 sys::path p = sdir.midi_path();
3047 snprintf (buf, sizeof(buf), "%s-%u.mid", p.to_string().c_str(), cnt);
3049 if (sys::exists (buf)) {
3054 if (existing == 0) {
3059 error << string_compose(
3060 _("There are already %1 recordings for %2, which I consider too many."),
3061 limit, base) << endmsg;
3063 throw failed_constructor();
3067 return Glib::path_get_basename(buf);
3071 /** Create a new within-session MIDI source */
3072 boost::shared_ptr<MidiSource>
3073 Session::create_midi_source_for_session (Track* track, string const & n, bool as_stub)
3075 /* try to use the existing write source for the track, to keep numbering sane
3079 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3083 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3086 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3087 return boost::dynamic_pointer_cast<MidiSource> (l.front());
3091 const string name = new_midi_source_name (n);
3092 const string path = new_source_path_from_name (DataType::MIDI, name, as_stub);
3094 return boost::dynamic_pointer_cast<SMFSource> (
3095 SourceFactory::createWritable (
3096 DataType::MIDI, *this, path, string(), false, frame_rate()));
3101 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3103 if (playlist->hidden()) {
3107 playlists->add (playlist);
3110 playlist->release();
3117 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3119 if (_state_of_the_state & Deletion) {
3123 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3129 playlists->remove (playlist);
3135 Session::set_audition (boost::shared_ptr<Region> r)
3137 pending_audition_region = r;
3138 add_post_transport_work (PostTransportAudition);
3139 _butler->schedule_transport_work ();
3143 Session::audition_playlist ()
3145 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3146 ev->region.reset ();
3151 Session::non_realtime_set_audition ()
3153 if (!pending_audition_region) {
3154 auditioner->audition_current_playlist ();
3156 auditioner->audition_region (pending_audition_region);
3157 pending_audition_region.reset ();
3159 AuditionActive (true); /* EMIT SIGNAL */
3163 Session::audition_region (boost::shared_ptr<Region> r)
3165 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3171 Session::cancel_audition ()
3173 if (auditioner->auditioning()) {
3174 auditioner->cancel_audition ();
3175 AuditionActive (false); /* EMIT SIGNAL */
3180 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3182 if (a->is_monitor()) {
3185 if (b->is_monitor()) {
3188 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3192 Session::is_auditioning () const
3194 /* can be called before we have an auditioner object */
3196 return auditioner->auditioning();
3203 Session::graph_reordered ()
3205 /* don't do this stuff if we are setting up connections
3206 from a set_state() call or creating new tracks. Ditto for deletion.
3209 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3213 /* every track/bus asked for this to be handled but it was deferred because
3214 we were connecting. do it now.
3217 request_input_change_handling ();
3221 /* force all diskstreams to update their capture offset values to
3222 reflect any changes in latencies within the graph.
3225 boost::shared_ptr<RouteList> rl = routes.reader ();
3226 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3227 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3229 tr->set_capture_offset ();
3235 Session::available_capture_duration ()
3237 float sample_bytes_on_disk = 4.0; // keep gcc happy
3239 switch (config.get_native_file_data_format()) {
3241 sample_bytes_on_disk = 4.0;
3245 sample_bytes_on_disk = 3.0;
3249 sample_bytes_on_disk = 2.0;
3253 /* impossible, but keep some gcc versions happy */
3254 fatal << string_compose (_("programming error: %1"),
3255 X_("illegal native file data format"))
3260 double scale = 4096.0 / sample_bytes_on_disk;
3262 if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3263 return max_framecnt;
3266 return (framecnt_t) floor (_total_free_4k_blocks * scale);
3270 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3273 RCUWriter<BundleList> writer (_bundles);
3274 boost::shared_ptr<BundleList> b = writer.get_copy ();
3275 b->push_back (bundle);
3278 BundleAdded (bundle); /* EMIT SIGNAL */
3284 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3286 bool removed = false;
3289 RCUWriter<BundleList> writer (_bundles);
3290 boost::shared_ptr<BundleList> b = writer.get_copy ();
3291 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3293 if (i != b->end()) {
3300 BundleRemoved (bundle); /* EMIT SIGNAL */
3306 boost::shared_ptr<Bundle>
3307 Session::bundle_by_name (string name) const
3309 boost::shared_ptr<BundleList> b = _bundles.reader ();
3311 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3312 if ((*i)->name() == name) {
3317 return boost::shared_ptr<Bundle> ();
3321 Session::tempo_map_changed (const PropertyChange&)
3325 playlists->update_after_tempo_map_change ();
3327 _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3333 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3335 for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3336 (*i)->recompute_frames_from_bbt ();
3340 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3341 * the given count with the current block size.
3344 Session::ensure_buffers (ChanCount howmany)
3346 BufferManager::ensure_buffers (howmany);
3350 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3352 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3353 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3358 Session::next_insert_id ()
3360 /* this doesn't really loop forever. just think about it */
3363 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3364 if (!insert_bitset[n]) {
3365 insert_bitset[n] = true;
3371 /* none available, so resize and try again */
3373 insert_bitset.resize (insert_bitset.size() + 16, false);
3378 Session::next_send_id ()
3380 /* this doesn't really loop forever. just think about it */
3383 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3384 if (!send_bitset[n]) {
3385 send_bitset[n] = true;
3391 /* none available, so resize and try again */
3393 send_bitset.resize (send_bitset.size() + 16, false);
3398 Session::next_return_id ()
3400 /* this doesn't really loop forever. just think about it */
3403 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3404 if (!return_bitset[n]) {
3405 return_bitset[n] = true;
3411 /* none available, so resize and try again */
3413 return_bitset.resize (return_bitset.size() + 16, false);
3418 Session::mark_send_id (uint32_t id)
3420 if (id >= send_bitset.size()) {
3421 send_bitset.resize (id+16, false);
3423 if (send_bitset[id]) {
3424 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3426 send_bitset[id] = true;
3430 Session::mark_return_id (uint32_t id)
3432 if (id >= return_bitset.size()) {
3433 return_bitset.resize (id+16, false);
3435 if (return_bitset[id]) {
3436 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3438 return_bitset[id] = true;
3442 Session::mark_insert_id (uint32_t id)
3444 if (id >= insert_bitset.size()) {
3445 insert_bitset.resize (id+16, false);
3447 if (insert_bitset[id]) {
3448 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3450 insert_bitset[id] = true;
3454 Session::unmark_send_id (uint32_t id)
3456 if (id < send_bitset.size()) {
3457 send_bitset[id] = false;
3462 Session::unmark_return_id (uint32_t id)
3464 if (id < return_bitset.size()) {
3465 return_bitset[id] = false;
3470 Session::unmark_insert_id (uint32_t id)
3472 if (id < insert_bitset.size()) {
3473 insert_bitset[id] = false;
3478 /* Named Selection management */
3480 boost::shared_ptr<NamedSelection>
3481 Session::named_selection_by_name (string name)
3483 Glib::Mutex::Lock lm (named_selection_lock);
3484 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3485 if ((*i)->name == name) {
3489 return boost::shared_ptr<NamedSelection>();
3493 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3496 Glib::Mutex::Lock lm (named_selection_lock);
3497 named_selections.insert (named_selections.begin(), named_selection);
3502 NamedSelectionAdded (); /* EMIT SIGNAL */
3506 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3508 bool removed = false;
3511 Glib::Mutex::Lock lm (named_selection_lock);
3513 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3515 if (i != named_selections.end()) {
3516 named_selections.erase (i);
3523 NamedSelectionRemoved (); /* EMIT SIGNAL */
3528 Session::reset_native_file_format ()
3530 boost::shared_ptr<RouteList> rl = routes.reader ();
3531 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3532 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3534 /* don't save state as we do this, there's no point
3537 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3538 tr->reset_write_sources (false);
3539 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3545 Session::route_name_unique (string n) const
3547 boost::shared_ptr<RouteList> r = routes.reader ();
3549 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3550 if ((*i)->name() == n) {
3559 Session::route_name_internal (string n) const
3561 if (auditioner && auditioner->name() == n) {
3565 if (_click_io && _click_io->name() == n) {
3573 Session::freeze_all (InterThreadInfo& itt)
3575 boost::shared_ptr<RouteList> r = routes.reader ();
3577 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3579 boost::shared_ptr<Track> t;
3581 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3582 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3592 boost::shared_ptr<Region>
3593 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3594 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3595 InterThreadInfo& itt, bool enable_processing)
3597 boost::shared_ptr<Region> result;
3598 boost::shared_ptr<Playlist> playlist;
3599 boost::shared_ptr<AudioFileSource> fsource;
3601 char buf[PATH_MAX+1];
3602 ChanCount diskstream_channels (track.n_channels());
3603 framepos_t position;
3604 framecnt_t this_chunk;
3607 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3608 const string sound_dir = sdir.sound_path().to_string();
3609 framepos_t len = end - start;
3610 bool need_block_size_reset = false;
3612 ChanCount const max_proc = track.max_processor_streams ();
3615 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3616 end, start) << endmsg;
3620 const framecnt_t chunk_size = (256 * 1024)/4;
3622 // block all process callback handling
3624 block_processing ();
3626 /* call tree *MUST* hold route_lock */
3628 if ((playlist = track.playlist()) == 0) {
3632 /* external redirects will be a problem */
3634 if (track.has_external_redirects()) {
3638 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3640 for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
3642 for (x = 0; x < 99999; ++x) {
3643 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());
3644 if (access (buf, F_OK) != 0) {
3650 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3655 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3656 SourceFactory::createWritable (DataType::AUDIO, *this, buf, string(), false, frame_rate()));
3659 catch (failed_constructor& err) {
3660 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3664 srcs.push_back (fsource);
3667 /* tell redirects that care that we are about to use a much larger blocksize */
3669 need_block_size_reset = true;
3670 track.set_block_size (chunk_size);
3672 /* XXX need to flush all redirects */
3677 /* create a set of reasonably-sized buffers */
3678 buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
3679 buffers.set_count (max_proc);
3681 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3682 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3684 afs->prepare_for_peakfile_writes ();
3687 while (to_do && !itt.cancel) {
3689 this_chunk = min (to_do, chunk_size);
3691 if (track.export_stuff (buffers, start, this_chunk, enable_processing)) {
3696 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
3697 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3700 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
3706 start += this_chunk;
3707 to_do -= this_chunk;
3709 itt.progress = (float) (1.0 - ((double) to_do / len));
3718 xnow = localtime (&now);
3720 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3721 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3724 afs->update_header (position, *xnow, now);
3725 afs->flush_header ();
3729 /* construct a region to represent the bounced material */
3733 plist.add (Properties::start, 0);
3734 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
3735 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
3737 result = RegionFactory::create (srcs, plist);
3743 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3744 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3747 afs->mark_for_remove ();
3750 (*src)->drop_references ();
3754 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3755 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3758 afs->done_with_peakfile_writes ();
3763 if (need_block_size_reset) {
3764 track.set_block_size (get_block_size());
3767 unblock_processing ();
3773 Session::gain_automation_buffer() const
3775 return ProcessThread::gain_automation_buffer ();
3779 Session::pan_automation_buffer() const
3781 return ProcessThread::pan_automation_buffer ();
3785 Session::get_silent_buffers (ChanCount count)
3787 return ProcessThread::get_silent_buffers (count);
3789 assert(_silent_buffers->available() >= count);
3790 _silent_buffers->set_count(count);
3792 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3793 for (size_t i= 0; i < count.get(*t); ++i) {
3794 _silent_buffers->get(*t, i).clear();
3798 return *_silent_buffers;
3803 Session::get_scratch_buffers (ChanCount count)
3805 return ProcessThread::get_scratch_buffers (count);
3807 if (count != ChanCount::ZERO) {
3808 assert(_scratch_buffers->available() >= count);
3809 _scratch_buffers->set_count(count);
3811 _scratch_buffers->set_count (_scratch_buffers->available());
3814 return *_scratch_buffers;
3819 Session::get_mix_buffers (ChanCount count)
3821 return ProcessThread::get_mix_buffers (count);
3823 assert(_mix_buffers->available() >= count);
3824 _mix_buffers->set_count(count);
3825 return *_mix_buffers;
3830 Session::ntracks () const
3833 boost::shared_ptr<RouteList> r = routes.reader ();
3835 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3836 if (boost::dynamic_pointer_cast<Track> (*i)) {
3845 Session::nbusses () const
3848 boost::shared_ptr<RouteList> r = routes.reader ();
3850 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3851 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
3860 Session::add_automation_list(AutomationList *al)
3862 automation_lists[al->id()] = al;
3866 Session::sync_order_keys (std::string const & base)
3868 if (deletion_in_progress()) {
3872 if (!Config->get_sync_all_route_ordering()) {
3873 /* leave order keys as they are */
3877 boost::shared_ptr<RouteList> r = routes.reader ();
3879 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3880 (*i)->sync_order_keys (base);
3883 Route::SyncOrderKeys (base); // EMIT SIGNAL
3885 /* this might not do anything */
3887 set_remote_control_ids ();
3890 /** @return true if there is at least one record-enabled track, otherwise false */
3892 Session::have_rec_enabled_track () const
3894 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
3897 /** Update the state of our rec-enabled tracks flag */
3899 Session::update_have_rec_enabled_track ()
3901 boost::shared_ptr<RouteList> rl = routes.reader ();
3902 RouteList::iterator i = rl->begin();
3903 while (i != rl->end ()) {
3905 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3906 if (tr && tr->record_enabled ()) {
3913 int const old = g_atomic_int_get (&_have_rec_enabled_track);
3915 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
3917 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
3918 RecordStateChanged (); /* EMIT SIGNAL */
3923 Session::listen_position_changed ()
3927 switch (Config->get_listen_position()) {
3928 case AfterFaderListen:
3932 case PreFaderListen:
3937 boost::shared_ptr<RouteList> r = routes.reader ();
3939 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3940 (*i)->put_monitor_send_at (p);
3945 Session::solo_control_mode_changed ()
3947 /* cancel all solo or all listen when solo control mode changes */
3950 set_solo (get_routes(), false);
3951 } else if (listening()) {
3952 set_listen (get_routes(), false);
3956 /** Called when anything about any of our route groups changes (membership, state etc.) */
3958 Session::route_group_changed ()
3960 RouteGroupChanged (); /* EMIT SIGNAL */
3964 Session::get_available_sync_options () const
3966 vector<SyncSource> ret;
3968 ret.push_back (JACK);
3969 ret.push_back (MTC);
3970 ret.push_back (MIDIClock);
3975 boost::shared_ptr<RouteList>
3976 Session::get_routes_with_regions_at (framepos_t const p) const
3978 boost::shared_ptr<RouteList> r = routes.reader ();
3979 boost::shared_ptr<RouteList> rl (new RouteList);
3981 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3982 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3987 boost::shared_ptr<Playlist> pl = tr->playlist ();
3992 if (pl->has_region_at (p)) {
4001 Session::goto_end ()
4003 if (_session_range_location) {
4004 request_locate (_session_range_location->end(), false);
4006 request_locate (0, false);
4011 Session::goto_start ()
4013 if (_session_range_location) {
4014 request_locate (_session_range_location->start(), false);
4016 request_locate (0, false);
4021 Session::current_start_frame () const
4023 return _session_range_location ? _session_range_location->start() : 0;
4027 Session::current_end_frame () const
4029 return _session_range_location ? _session_range_location->end() : 0;
4033 Session::add_session_range_location (framepos_t start, framepos_t end)
4035 _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4036 _locations->add (_session_range_location);
4039 /** Called when one of our routes' order keys has changed */
4041 Session::route_order_key_changed ()
4043 RouteOrderKeyChanged (); /* EMIT SIGNAL */
4047 Session::step_edit_status_change (bool yn)
4053 send = (_step_editors == 0);
4058 send = (_step_editors == 1);
4061 if (_step_editors > 0) {
4067 StepEditStatusChange (val);
4073 Session::start_time_changed (framepos_t old)
4075 /* Update the auto loop range to match the session range
4076 (unless the auto loop range has been changed by the user)
4079 Location* s = _locations->session_range_location ();
4084 Location* l = _locations->auto_loop_location ();
4086 if (l->start() == old) {
4087 l->set_start (s->start(), true);
4092 Session::end_time_changed (framepos_t old)
4094 /* Update the auto loop range to match the session range
4095 (unless the auto loop range has been changed by the user)
4098 Location* s = _locations->session_range_location ();
4103 Location* l = _locations->auto_loop_location ();
4105 if (l->end() == old) {
4106 l->set_end (s->end(), true);
4111 Session::source_search_path (DataType type) const
4115 if (session_dirs.size() == 1) {
4117 case DataType::AUDIO:
4118 search_path = _session_dir->sound_path().to_string();
4120 case DataType::MIDI:
4121 search_path = _session_dir->midi_path().to_string();
4125 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4126 SessionDirectory sdir (i->path);
4127 if (!search_path.empty()) {
4131 case DataType::AUDIO:
4132 search_path += sdir.sound_path().to_string();
4134 case DataType::MIDI:
4135 search_path += sdir.midi_path().to_string();
4141 /* now add user-specified locations
4144 vector<string> dirs;
4147 case DataType::AUDIO:
4148 split (config.get_audio_search_path (), dirs, ':');
4150 case DataType::MIDI:
4151 split (config.get_midi_search_path (), dirs, ':');
4155 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4165 Session::ensure_search_path_includes (const string& path, DataType type)
4168 vector<string> dirs;
4175 case DataType::AUDIO:
4176 search_path = config.get_audio_search_path ();
4178 case DataType::MIDI:
4179 search_path = config.get_midi_search_path ();
4183 split (search_path, dirs, ':');
4185 for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4191 if (!search_path.empty()) {
4195 search_path += path;
4198 case DataType::AUDIO:
4199 config.set_audio_search_path (search_path);
4201 case DataType::MIDI:
4202 config.set_midi_search_path (search_path);
4208 Session::get_speakers()
4214 Session::unknown_processors () const
4218 boost::shared_ptr<RouteList> r = routes.reader ();
4219 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4220 list<string> t = (*i)->unknown_processors ();
4221 copy (t.begin(), t.end(), back_inserter (p));