2 Copyright (C) 1999-2010 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #define __STDC_LIMIT_MACROS
28 #include <cstdio> /* sprintf(3) ... grrr */
34 #include <glibmm/thread.h>
35 #include <glibmm/miscutils.h>
36 #include <glibmm/fileutils.h>
38 #include "pbd/error.h"
39 #include "pbd/boost_debug.h"
40 #include "pbd/pathscanner.h"
41 #include "pbd/stl_delete.h"
42 #include "pbd/basename.h"
43 #include "pbd/stacktrace.h"
44 #include "pbd/file_utils.h"
45 #include "pbd/convert.h"
47 #include "ardour/amp.h"
48 #include "ardour/analyser.h"
49 #include "ardour/audio_buffer.h"
50 #include "ardour/audio_diskstream.h"
51 #include "ardour/audio_port.h"
52 #include "ardour/audio_track.h"
53 #include "ardour/audioengine.h"
54 #include "ardour/audiofilesource.h"
55 #include "ardour/audioplaylist.h"
56 #include "ardour/audioregion.h"
57 #include "ardour/auditioner.h"
58 #include "ardour/buffer_manager.h"
59 #include "ardour/buffer_set.h"
60 #include "ardour/bundle.h"
61 #include "ardour/butler.h"
62 #include "ardour/click.h"
63 #include "ardour/configuration.h"
64 #include "ardour/crossfade.h"
65 #include "ardour/cycle_timer.h"
66 #include "ardour/data_type.h"
67 #include "ardour/debug.h"
68 #include "ardour/filename_extensions.h"
69 #include "ardour/internal_send.h"
70 #include "ardour/io_processor.h"
71 #include "ardour/midi_diskstream.h"
72 #include "ardour/midi_playlist.h"
73 #include "ardour/midi_region.h"
74 #include "ardour/midi_track.h"
75 #include "ardour/midi_ui.h"
76 #include "ardour/named_selection.h"
77 #include "ardour/process_thread.h"
78 #include "ardour/playlist.h"
79 #include "ardour/plugin_insert.h"
80 #include "ardour/port_insert.h"
81 #include "ardour/processor.h"
82 #include "ardour/rc_configuration.h"
83 #include "ardour/recent_sessions.h"
84 #include "ardour/region_factory.h"
85 #include "ardour/return.h"
86 #include "ardour/route_group.h"
87 #include "ardour/send.h"
88 #include "ardour/session.h"
89 #include "ardour/session_directory.h"
90 #include "ardour/session_directory.h"
91 #include "ardour/session_metadata.h"
92 #include "ardour/session_playlists.h"
93 #include "ardour/slave.h"
94 #include "ardour/smf_source.h"
95 #include "ardour/source_factory.h"
96 #include "ardour/tape_file_matcher.h"
97 #include "ardour/tempo.h"
98 #include "ardour/utils.h"
99 #include "ardour/graph.h"
101 #include "midi++/port.h"
102 #include "midi++/mmc.h"
103 #include "midi++/manager.h"
108 using namespace ARDOUR;
110 using boost::shared_ptr;
111 using boost::weak_ptr;
113 bool Session::_disable_all_loaded_plugins = false;
115 PBD::Signal1<void,std::string> Session::Dialog;
116 PBD::Signal0<int> Session::AskAboutPendingState;
117 PBD::Signal2<int,nframes_t,nframes_t> Session::AskAboutSampleRateMismatch;
118 PBD::Signal0<void> Session::SendFeedback;
120 PBD::Signal0<void> Session::TimecodeOffsetChanged;
121 PBD::Signal0<void> Session::StartTimeChanged;
122 PBD::Signal0<void> Session::EndTimeChanged;
123 PBD::Signal0<void> Session::AutoBindingOn;
124 PBD::Signal0<void> Session::AutoBindingOff;
125 PBD::Signal2<void,std::string, std::string> Session::Exported;
126 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
128 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
129 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
131 Session::Session (AudioEngine &eng,
132 const string& fullpath,
133 const string& snapshot_name,
134 BusProfile* bus_profile,
138 _target_transport_speed (0.0),
139 _requested_return_frame (-1),
140 _session_dir (new SessionDirectory(fullpath)),
142 _butler (new Butler (*this)),
143 _post_transport_work (0),
144 _send_timecode_update (false),
145 route_graph (new Graph(*this)),
146 routes (new RouteList),
147 _total_free_4k_blocks (0),
148 _bundles (new BundleList),
149 _bundle_xml_node (0),
152 click_emphasis_data (0),
154 _metadata (new SessionMetadata()),
155 _have_rec_enabled_track (false)
158 playlists.reset (new SessionPlaylists);
160 interpolation.add_channel_to (0, 0);
162 if (!eng.connected()) {
163 throw failed_constructor();
166 n_physical_outputs = _engine.n_physical_outputs(DataType::AUDIO);
167 n_physical_inputs = _engine.n_physical_inputs(DataType::AUDIO);
169 first_stage_init (fullpath, snapshot_name);
171 _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
174 if (create (mix_template, bus_profile)) {
176 throw failed_constructor ();
180 if (second_stage_init ()) {
182 throw failed_constructor ();
185 store_recent_sessions(_name, _path);
187 bool was_dirty = dirty();
189 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
191 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
192 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
195 DirtyChanged (); /* EMIT SIGNAL */
209 vector<void*> debug_pointers;
211 /* if we got to here, leaving pending capture state around
215 remove_pending_capture_state ();
217 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
219 _engine.remove_session ();
221 /* clear history so that no references to objects are held any more */
225 /* clear state tree so that no references to objects are held any more */
229 /* remove all stubfiles that might still be lurking */
231 cleanup_stubfiles ();
233 /* reset dynamic state version back to default */
235 Stateful::loading_state_version = 0;
237 _butler->drop_references ();
239 delete midi_control_ui;
241 if (click_data != default_click) {
242 delete [] click_data;
245 if (click_emphasis_data != default_click_emphasis) {
246 delete [] click_emphasis_data;
251 /* clear out any pending dead wood from RCU managed objects */
256 AudioDiskstream::free_working_buffers();
258 /* tell everyone who is still standing that we're about to die */
261 /* tell everyone to drop references and delete objects as we go */
263 DEBUG_TRACE (DEBUG::Destruction, "delete named selections\n");
264 named_selections.clear ();
266 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
267 RegionFactory::delete_all_regions ();
269 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
271 /* reset these three references to special routes before we do the usual route delete thing */
274 _master_out.reset ();
275 _monitor_out.reset ();
278 RCUWriter<RouteList> writer (routes);
279 boost::shared_ptr<RouteList> r = writer.get_copy ();
281 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
282 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
283 (*i)->drop_references ();
287 /* writer goes out of scope and updates master */
291 boost::shared_ptr<RouteList> r = routes.reader ();
293 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
294 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
295 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->path(), i->second.use_count()));
296 i->second->drop_references ();
301 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
302 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
307 Crossfade::set_buffer_size (0);
309 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
312 boost_debug_list_ptrs ();
314 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
318 Session::set_worst_io_latencies ()
320 _worst_output_latency = 0;
321 _worst_input_latency = 0;
323 if (!_engine.connected()) {
327 boost::shared_ptr<RouteList> r = routes.reader ();
329 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
330 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
331 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
336 Session::when_engine_running ()
338 string first_physical_output;
340 BootMessage (_("Set block size and sample rate"));
342 set_block_size (_engine.frames_per_cycle());
343 set_frame_rate (_engine.frame_rate());
345 BootMessage (_("Using configuration"));
347 boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
348 boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
350 Config->map_parameters (ff);
351 config.map_parameters (ft);
353 /* every time we reconnect, recompute worst case output latencies */
355 _engine.Running.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies, this));
357 if (synced_to_jack()) {
358 _engine.transport_stop ();
361 if (config.get_jack_time_master()) {
362 _engine.transport_locate (_transport_frame);
370 _click_io.reset (new ClickIO (*this, "click"));
372 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
374 /* existing state for Click */
377 if (Stateful::loading_state_version < 3000) {
378 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
380 c = _click_io->set_state (*child->children().front(), Stateful::loading_state_version);
385 _clicking = Config->get_clicking ();
389 error << _("could not setup Click I/O") << endmsg;
396 /* default state for Click: dual-mono to first 2 physical outputs */
398 for (int physport = 0; physport < 2; ++physport) {
399 string physical_output = _engine.get_nth_physical_output (DataType::AUDIO, physport);
401 if (physical_output.length()) {
402 if (_click_io->add_port (physical_output, this)) {
403 // relax, even though its an error
408 if (_click_io->n_ports () > ChanCount::ZERO) {
409 _clicking = Config->get_clicking ();
414 catch (failed_constructor& err) {
415 error << _("cannot setup Click I/O") << endmsg;
418 BootMessage (_("Compute I/O Latencies"));
420 set_worst_io_latencies ();
423 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
426 BootMessage (_("Set up standard connections"));
428 /* Create a set of Bundle objects that map
429 to the physical I/O currently available. We create both
430 mono and stereo bundles, so that the common cases of mono
431 and stereo tracks get bundles to put in their mixer strip
432 in / out menus. There may be a nicer way of achieving that;
433 it doesn't really scale that well to higher channel counts
436 /* mono output bundles */
438 for (uint32_t np = 0; np < n_physical_outputs; ++np) {
440 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
442 shared_ptr<Bundle> c (new Bundle (buf, true));
443 c->add_channel (_("mono"), DataType::AUDIO);
444 c->set_port (0, _engine.get_nth_physical_output (DataType::AUDIO, np));
449 /* stereo output bundles */
451 for (uint32_t np = 0; np < n_physical_outputs; np += 2) {
452 if (np + 1 < n_physical_outputs) {
454 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
455 shared_ptr<Bundle> c (new Bundle (buf, true));
456 c->add_channel (_("L"), DataType::AUDIO);
457 c->set_port (0, _engine.get_nth_physical_output (DataType::AUDIO, np));
458 c->add_channel (_("R"), DataType::AUDIO);
459 c->set_port (1, _engine.get_nth_physical_output (DataType::AUDIO, np + 1));
465 /* mono input bundles */
467 for (uint32_t np = 0; np < n_physical_inputs; ++np) {
469 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
471 shared_ptr<Bundle> c (new Bundle (buf, false));
472 c->add_channel (_("mono"), DataType::AUDIO);
473 c->set_port (0, _engine.get_nth_physical_input (DataType::AUDIO, np));
478 /* stereo input bundles */
480 for (uint32_t np = 0; np < n_physical_inputs; np += 2) {
481 if (np + 1 < n_physical_inputs) {
483 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
485 shared_ptr<Bundle> c (new Bundle (buf, false));
486 c->add_channel (_("L"), DataType::AUDIO);
487 c->set_port (0, _engine.get_nth_physical_input (DataType::AUDIO, np));
488 c->add_channel (_("R"), DataType::AUDIO);
489 c->set_port (1, _engine.get_nth_physical_input (DataType::AUDIO, np + 1));
495 BootMessage (_("Setup signal flow and plugins"));
499 if (_is_new && !no_auto_connect()) {
501 /* don't connect the master bus outputs if there is a monitor bus */
503 if (_master_out && Config->get_auto_connect_standard_busses() && !_monitor_out) {
505 /* if requested auto-connect the outputs to the first N physical ports.
508 uint32_t limit = _master_out->n_outputs().n_total();
510 for (uint32_t n = 0; n < limit; ++n) {
511 Port* p = _master_out->output()->nth (n);
512 string connect_to = _engine.get_nth_physical_output (DataType (p->type()), n);
514 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
515 if (_master_out->output()->connect (p, connect_to, this)) {
516 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
526 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
527 are undefined, at best.
530 /* control out listens to master bus (but ignores it
531 under some conditions)
534 uint32_t limit = _monitor_out->n_inputs().n_audio();
537 for (uint32_t n = 0; n < limit; ++n) {
538 AudioPort* p = _monitor_out->input()->ports().nth_audio_port (n);
539 AudioPort* o = _master_out->output()->ports().nth_audio_port (n);
542 string connect_to = o->name();
543 if (_monitor_out->input()->connect (p, connect_to, this)) {
544 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
552 /* if control out is not connected, connect control out to physical outs
555 if (!_monitor_out->output()->connected ()) {
557 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
559 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
562 _monitor_out->output()->connect_ports_to_bundle (b, this);
564 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
565 Config->get_monitor_bus_preferred_bundle())
571 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
572 uint32_t mod = _engine.n_physical_outputs (*t);
573 uint32_t limit = _monitor_out->n_outputs().get(*t);
575 for (uint32_t n = 0; n < limit; ++n) {
577 Port* p = _monitor_out->output()->ports().port(*t, n);
578 string connect_to = _engine.get_nth_physical_output (*t, (n % mod));
580 if (!connect_to.empty()) {
581 if (_monitor_out->output()->connect (p, connect_to, this)) {
582 error << string_compose (
583 _("cannot connect control output %1 to %2"),
596 /* catch up on send+insert cnts */
598 _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
600 /* hook us up to the engine */
602 BootMessage (_("Connect to engine"));
604 _engine.set_session (this);
608 Session::hookup_io ()
610 /* stop graph reordering notifications from
611 causing resorts, etc.
614 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
619 /* we delay creating the auditioner till now because
620 it makes its own connections to ports.
624 Auditioner* a = new Auditioner (*this);
627 throw failed_constructor();
629 a->use_new_diskstream ();
630 auditioner.reset (a);
633 catch (failed_constructor& err) {
634 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
638 /* load bundles, which we may have postponed earlier on */
639 if (_bundle_xml_node) {
640 load_bundles (*_bundle_xml_node);
641 delete _bundle_xml_node;
644 /* Tell all IO objects to connect themselves together */
646 IO::enable_connecting ();
647 MIDI::Port::MakeConnections ();
649 /* Now reset all panners */
651 Delivery::reset_panners ();
653 /* Connect tracks to monitor/listen bus if there is one.
654 Note that in an existing session, the internal sends will
655 already exist, but we want the routes to notice that
656 they connect to the control out specifically.
660 boost::shared_ptr<RouteList> r = routes.reader ();
661 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
663 if ((*x)->is_monitor()) {
667 } else if ((*x)->is_master()) {
673 (*x)->listen_via (_monitor_out,
674 (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader),
680 /* Anyone who cares about input state, wake up and do something */
682 IOConnectionsComplete (); /* EMIT SIGNAL */
684 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
686 /* now handle the whole enchilada as if it was one
692 /* update the full solo state, which can't be
693 correctly determined on a per-route basis, but
694 needs the global overview that only the session
698 update_route_solo_state ();
702 Session::playlist_length_changed ()
704 update_session_range_location_marker ();
708 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
710 boost::shared_ptr<Track> track = wp.lock ();
715 boost::shared_ptr<Playlist> playlist;
717 if ((playlist = track->playlist()) != 0) {
718 playlist->LengthChanged.connect_same_thread (*this, boost::bind (&Session::playlist_length_changed, this));
721 update_session_range_location_marker ();
725 Session::record_enabling_legal () const
727 /* this used to be in here, but survey says.... we don't need to restrict it */
728 // if (record_status() == Recording) {
732 if (Config->get_all_safe()) {
739 Session::reset_input_monitor_state ()
741 if (transport_rolling()) {
743 boost::shared_ptr<RouteList> rl = routes.reader ();
744 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
745 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
746 if (tr && tr->record_enabled ()) {
747 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
748 tr->monitor_input (Config->get_monitoring_model() == HardwareMonitoring && !config.get_auto_input());
754 boost::shared_ptr<RouteList> rl = routes.reader ();
755 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
756 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
757 if (tr && tr->record_enabled ()) {
758 //cerr << "switching to input = " << !Config->get_auto_input() << __FILE__ << __LINE__ << endl << endl;
759 tr->monitor_input (Config->get_monitoring_model() == HardwareMonitoring);
766 Session::auto_punch_start_changed (Location* location)
768 replace_event (SessionEvent::PunchIn, location->start());
770 if (get_record_enabled() && config.get_punch_in()) {
771 /* capture start has been changed, so save new pending state */
772 save_state ("", true);
777 Session::auto_punch_end_changed (Location* location)
779 nframes_t when_to_stop = location->end();
780 // when_to_stop += _worst_output_latency + _worst_input_latency;
781 replace_event (SessionEvent::PunchOut, when_to_stop);
785 Session::auto_punch_changed (Location* location)
787 nframes_t when_to_stop = location->end();
789 replace_event (SessionEvent::PunchIn, location->start());
790 //when_to_stop += _worst_output_latency + _worst_input_latency;
791 replace_event (SessionEvent::PunchOut, when_to_stop);
795 Session::auto_loop_changed (Location* location)
797 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
799 if (transport_rolling() && play_loop) {
802 // if (_transport_frame > location->end()) {
804 if (_transport_frame < location->start() || _transport_frame > location->end()) {
805 // relocate to beginning of loop
806 clear_events (SessionEvent::LocateRoll);
808 request_locate (location->start(), true);
811 else if (Config->get_seamless_loop() && !loop_changing) {
813 // schedule a locate-roll to refill the diskstreams at the
815 loop_changing = true;
817 if (location->end() > last_loopend) {
818 clear_events (SessionEvent::LocateRoll);
819 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
826 last_loopend = location->end();
830 Session::set_auto_punch_location (Location* location)
834 if ((existing = _locations.auto_punch_location()) != 0 && existing != location) {
835 punch_connections.drop_connections();
836 existing->set_auto_punch (false, this);
837 remove_event (existing->start(), SessionEvent::PunchIn);
838 clear_events (SessionEvent::PunchOut);
839 auto_punch_location_changed (0);
848 if (location->end() <= location->start()) {
849 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
853 punch_connections.drop_connections ();
855 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
856 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
857 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
859 location->set_auto_punch (true, this);
861 auto_punch_changed (location);
863 auto_punch_location_changed (location);
867 Session::set_auto_loop_location (Location* location)
871 if ((existing = _locations.auto_loop_location()) != 0 && existing != location) {
872 loop_connections.drop_connections ();
873 existing->set_auto_loop (false, this);
874 remove_event (existing->end(), SessionEvent::AutoLoop);
875 auto_loop_location_changed (0);
884 if (location->end() <= location->start()) {
885 error << _("Session: you can't use a mark for auto loop") << endmsg;
889 last_loopend = location->end();
891 loop_connections.drop_connections ();
893 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
894 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
895 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
897 location->set_auto_loop (true, this);
899 /* take care of our stuff first */
901 auto_loop_changed (location);
903 /* now tell everyone else */
905 auto_loop_location_changed (location);
909 Session::locations_added (Location *)
915 Session::locations_changed ()
917 _locations.apply (*this, &Session::handle_locations_changed);
921 Session::handle_locations_changed (Locations::LocationList& locations)
923 Locations::LocationList::iterator i;
925 bool set_loop = false;
926 bool set_punch = false;
928 for (i = locations.begin(); i != locations.end(); ++i) {
932 if (location->is_auto_punch()) {
933 set_auto_punch_location (location);
936 if (location->is_auto_loop()) {
937 set_auto_loop_location (location);
941 if (location->is_session_range()) {
942 _session_range_location = location;
947 set_auto_loop_location (0);
950 set_auto_punch_location (0);
957 Session::enable_record ()
960 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
962 if (rs == Recording) {
966 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
968 _last_record_location = _transport_frame;
969 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
971 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
973 boost::shared_ptr<RouteList> rl = routes.reader ();
974 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
975 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
976 if (tr && tr->record_enabled ()) {
977 tr->monitor_input (true);
982 RecordStateChanged ();
989 Session::disable_record (bool rt_context, bool force)
993 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
995 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
996 g_atomic_int_set (&_record_status, Disabled);
997 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
999 if (rs == Recording) {
1000 g_atomic_int_set (&_record_status, Enabled);
1004 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1006 boost::shared_ptr<RouteList> rl = routes.reader ();
1007 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1008 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1009 if (tr && tr->record_enabled ()) {
1010 tr->monitor_input (false);
1015 RecordStateChanged (); /* emit signal */
1018 remove_pending_capture_state ();
1024 Session::step_back_from_record ()
1026 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1028 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1029 boost::shared_ptr<RouteList> rl = routes.reader ();
1030 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1031 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1032 if (tr && tr->record_enabled ()) {
1033 //cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl;
1034 tr->monitor_input (false);
1042 Session::maybe_enable_record ()
1044 if (_step_editors > 0) {
1048 g_atomic_int_set (&_record_status, Enabled);
1050 /* this function is currently called from somewhere other than an RT thread.
1051 this save_state() call therefore doesn't impact anything.
1054 save_state ("", true);
1056 if (_transport_speed) {
1057 if (!config.get_punch_in()) {
1061 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1062 RecordStateChanged (); /* EMIT SIGNAL */
1069 Session::audible_frame () const
1075 /* the first of these two possible settings for "offset"
1076 mean that the audible frame is stationary until
1077 audio emerges from the latency compensation
1080 the second means that the audible frame is stationary
1081 until audio would emerge from a physical port
1082 in the absence of any plugin latency compensation
1085 offset = _worst_output_latency;
1087 if (offset > current_block_size) {
1088 offset -= current_block_size;
1090 /* XXX is this correct? if we have no external
1091 physical connections and everything is internal
1092 then surely this is zero? still, how
1093 likely is that anyway?
1095 offset = current_block_size;
1098 if (synced_to_jack()) {
1099 tf = _engine.transport_frame();
1101 tf = _transport_frame;
1106 if (!non_realtime_work_pending()) {
1110 /* Check to see if we have passed the first guaranteed
1111 audible frame past our last start position. if not,
1112 return that last start point because in terms
1113 of audible frames, we have not moved yet.
1115 `Start position' in this context means the time we last
1116 either started or changed transport direction.
1119 if (_transport_speed > 0.0f) {
1121 if (!play_loop || !have_looped) {
1122 if (tf < _last_roll_or_reversal_location + offset) {
1123 return _last_roll_or_reversal_location;
1131 } else if (_transport_speed < 0.0f) {
1133 /* XXX wot? no backward looping? */
1135 if (tf > _last_roll_or_reversal_location - offset) {
1136 return _last_roll_or_reversal_location;
1148 Session::set_frame_rate (nframes_t frames_per_second)
1150 /** \fn void Session::set_frame_size(nframes_t)
1151 the AudioEngine object that calls this guarantees
1152 that it will not be called while we are also in
1153 ::process(). Its fine to do things that block
1157 _base_frame_rate = frames_per_second;
1161 Automatable::set_automation_interval ((jack_nframes_t) ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1165 // XXX we need some equivalent to this, somehow
1166 // SndFileSource::setup_standard_crossfades (frames_per_second);
1170 /* XXX need to reset/reinstantiate all LADSPA plugins */
1174 Session::set_block_size (nframes_t nframes)
1176 /* the AudioEngine guarantees
1177 that it will not be called while we are also in
1178 ::process(). It is therefore fine to do things that block
1183 current_block_size = nframes;
1187 boost::shared_ptr<RouteList> r = routes.reader ();
1189 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1190 (*i)->set_block_size (nframes);
1193 boost::shared_ptr<RouteList> rl = routes.reader ();
1194 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1195 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1197 tr->set_block_size (nframes);
1201 set_worst_io_latencies ();
1206 Session::set_default_fade (float /*steepness*/, float /*fade_msecs*/)
1209 nframes_t fade_frames;
1211 /* Don't allow fade of less 1 frame */
1213 if (fade_msecs < (1000.0 * (1.0/_current_frame_rate))) {
1220 fade_frames = (nframes_t) floor (fade_msecs * _current_frame_rate * 0.001);
1224 default_fade_msecs = fade_msecs;
1225 default_fade_steepness = steepness;
1228 // jlc, WTF is this!
1229 Glib::RWLock::ReaderLock lm (route_lock);
1230 AudioRegion::set_default_fade (steepness, fade_frames);
1235 /* XXX have to do this at some point */
1236 /* foreach region using default fade, reset, then
1237 refill_all_diskstream_buffers ();
1242 struct RouteSorter {
1243 bool operator() (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> r2) {
1244 if (r2->feeds (r1)) {
1246 } else if (r1->feeds (r2)) {
1249 if (r1->not_fed ()) {
1250 if (r2->not_fed ()) {
1251 /* no ardour-based connections inbound to either route. just use signal order */
1252 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1254 /* r2 has connections, r1 does not; run r1 early */
1258 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1265 trace_terminal (shared_ptr<Route> r1, shared_ptr<Route> rbase)
1267 shared_ptr<Route> r2;
1269 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1270 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1274 /* make a copy of the existing list of routes that feed r1 */
1276 Route::FedBy existing (r1->fed_by());
1278 /* for each route that feeds r1, recurse, marking it as feeding
1282 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1283 if (!(r2 = i->r.lock ())) {
1284 /* (*i) went away, ignore it */
1288 /* r2 is a route that feeds r1 which somehow feeds base. mark
1289 base as being fed by r2
1292 rbase->add_fed_by (r2, i->sends_only);
1296 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1300 if (r1->feeds (r2) && r2->feeds (r1)) {
1304 /* now recurse, so that we can mark base as being fed by
1305 all routes that feed r2
1308 trace_terminal (r2, rbase);
1315 Session::resort_routes ()
1317 /* don't do anything here with signals emitted
1318 by Routes while we are being destroyed.
1321 if (_state_of_the_state & Deletion) {
1326 RCUWriter<RouteList> writer (routes);
1327 shared_ptr<RouteList> r = writer.get_copy ();
1328 resort_routes_using (r);
1329 /* writer goes out of scope and forces update */
1332 //route_graph->dump(1);
1335 boost::shared_ptr<RouteList> rl = routes.reader ();
1336 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1337 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1339 const Route::FedBy& fb ((*i)->fed_by());
1341 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1342 boost::shared_ptr<Route> sf = f->r.lock();
1344 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1352 Session::resort_routes_using (shared_ptr<RouteList> r)
1354 RouteList::iterator i, j;
1356 for (i = r->begin(); i != r->end(); ++i) {
1358 (*i)->clear_fed_by ();
1360 for (j = r->begin(); j != r->end(); ++j) {
1362 /* although routes can feed themselves, it will
1363 cause an endless recursive descent if we
1364 detect it. so don't bother checking for
1372 bool via_sends_only;
1374 if ((*j)->direct_feeds (*i, &via_sends_only)) {
1375 (*i)->add_fed_by (*j, via_sends_only);
1380 for (i = r->begin(); i != r->end(); ++i) {
1381 trace_terminal (*i, *i);
1387 route_graph->rechain (r);
1390 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1391 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1392 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1393 (*i)->name(), (*i)->order_key ("signal")));
1399 /** Find the route name starting with \a base with the lowest \a id.
1401 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1402 * The available route name with the lowest ID will be used, and \a id
1403 * will be set to the ID.
1405 * \return false if a route name could not be found, and \a track_name
1406 * and \a id do not reflect a free route name.
1409 Session::find_route_name (const char* base, uint32_t& id, char* name, size_t name_len)
1412 snprintf (name, name_len, "%s %" PRIu32, base, id);
1414 if (route_by_name (name) == 0) {
1420 } while (id < (UINT_MAX-1));
1426 Session::count_existing_route_channels (ChanCount& in, ChanCount& out)
1428 in = ChanCount::ZERO;
1429 out = ChanCount::ZERO;
1430 shared_ptr<RouteList> r = routes.reader ();
1431 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1432 if (!(*i)->is_hidden()) {
1433 in += (*i)->n_inputs();
1434 out += (*i)->n_outputs();
1439 list<boost::shared_ptr<MidiTrack> >
1440 Session::new_midi_track (TrackMode mode, RouteGroup* route_group, uint32_t how_many)
1442 char track_name[32];
1443 uint32_t track_id = 0;
1444 ChanCount existing_inputs;
1445 ChanCount existing_outputs;
1447 RouteList new_routes;
1448 list<boost::shared_ptr<MidiTrack> > ret;
1449 uint32_t control_id;
1451 count_existing_route_channels (existing_inputs, existing_outputs);
1453 control_id = ntracks() + nbusses();
1456 if (!find_route_name ("Midi", ++track_id, track_name, sizeof(track_name))) {
1457 error << "cannot find name for new midi track" << endmsg;
1461 shared_ptr<MidiTrack> track;
1464 MidiTrack* mt = new MidiTrack (*this, track_name, Route::Flag (0), mode);
1471 mt->use_new_diskstream();
1473 boost_debug_shared_ptr_mark_interesting (mt, "Track");
1474 track = boost::shared_ptr<MidiTrack>(mt);
1476 if (track->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1477 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1482 if (track->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1483 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1487 auto_connect_route (track, existing_inputs, existing_outputs);
1489 track->non_realtime_input_change();
1492 route_group->add (track);
1495 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1496 track->set_remote_control_id (control_id);
1498 new_routes.push_back (track);
1499 ret.push_back (track);
1502 catch (failed_constructor &err) {
1503 error << _("Session: could not create new midi track.") << endmsg;
1507 catch (AudioEngine::PortRegistrationFailure& pfe) {
1509 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;
1517 if (!new_routes.empty()) {
1518 add_routes (new_routes, false);
1519 save_state (_current_snapshot_name);
1525 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs */
1527 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs, bool connect_inputs)
1529 /* If both inputs and outputs are auto-connected to physical ports,
1530 use the max of input and output offsets to ensure auto-connected
1531 port numbers always match up (e.g. the first audio input and the
1532 first audio output of the route will have the same physical
1533 port number). Otherwise just use the lowest input or output
1537 const bool in_out_physical =
1538 (Config->get_input_auto_connect() & AutoConnectPhysical)
1539 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1542 const ChanCount in_offset = in_out_physical
1543 ? ChanCount::max(existing_inputs, existing_outputs)
1546 const ChanCount out_offset = in_out_physical
1547 ? ChanCount::max(existing_inputs, existing_outputs)
1550 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1551 vector<string> physinputs;
1552 vector<string> physoutputs;
1554 _engine.get_physical_outputs (*t, physoutputs);
1555 _engine.get_physical_inputs (*t, physinputs);
1557 if (!physinputs.empty() && connect_inputs) {
1558 uint32_t nphysical_in = physinputs.size();
1559 for (uint32_t i = 0; i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1562 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1563 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1566 if (!port.empty() && route->input()->connect (
1567 route->input()->ports().port(*t, i), port, this)) {
1573 if (!physoutputs.empty()) {
1574 uint32_t nphysical_out = physoutputs.size();
1575 for (uint32_t i = 0; i < route->n_outputs().get(*t); ++i) {
1578 if (Config->get_output_auto_connect() & AutoConnectPhysical) {
1579 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1580 } else if (Config->get_output_auto_connect() & AutoConnectMaster) {
1581 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1582 port = _master_out->input()->ports().port(*t,
1583 i % _master_out->input()->n_ports().get(*t))->name();
1587 if (!port.empty() && route->output()->connect (
1588 route->output()->ports().port(*t, i), port, this)) {
1595 existing_inputs += route->n_inputs();
1596 existing_outputs += route->n_outputs();
1599 list< boost::shared_ptr<AudioTrack> >
1600 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group, uint32_t how_many)
1602 char track_name[32];
1603 uint32_t track_id = 0;
1604 ChanCount existing_inputs;
1605 ChanCount existing_outputs;
1607 RouteList new_routes;
1608 list<boost::shared_ptr<AudioTrack> > ret;
1609 uint32_t control_id;
1611 count_existing_route_channels (existing_inputs, existing_outputs);
1613 control_id = ntracks() + nbusses() + 1;
1616 if (!find_route_name ("Audio", ++track_id, track_name, sizeof(track_name))) {
1617 error << "cannot find name for new audio track" << endmsg;
1621 shared_ptr<AudioTrack> track;
1624 AudioTrack* at = new AudioTrack (*this, track_name, Route::Flag (0), mode);
1631 at->use_new_diskstream();
1633 boost_debug_shared_ptr_mark_interesting (at, "Track");
1634 track = boost::shared_ptr<AudioTrack>(at);
1636 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1637 error << string_compose (
1638 _("cannot configure %1 in/%2 out configuration for new audio track"),
1639 input_channels, output_channels)
1644 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1645 error << string_compose (
1646 _("cannot configure %1 in/%2 out configuration for new audio track"),
1647 input_channels, output_channels)
1652 auto_connect_route (track, existing_inputs, existing_outputs);
1655 route_group->add (track);
1658 track->non_realtime_input_change();
1660 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1661 track->set_remote_control_id (control_id);
1664 new_routes.push_back (track);
1665 ret.push_back (track);
1668 catch (failed_constructor &err) {
1669 error << _("Session: could not create new audio track.") << endmsg;
1673 catch (AudioEngine::PortRegistrationFailure& pfe) {
1675 error << pfe.what() << endmsg;
1683 if (!new_routes.empty()) {
1684 add_routes (new_routes, true);
1691 Session::set_remote_control_ids ()
1693 RemoteModel m = Config->get_remote_model();
1694 bool emit_signal = false;
1696 shared_ptr<RouteList> r = routes.reader ();
1698 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1699 if (MixerOrdered == m) {
1700 int32_t order = (*i)->order_key(N_("signal"));
1701 (*i)->set_remote_control_id (order+1, false);
1703 } else if (EditorOrdered == m) {
1704 int32_t order = (*i)->order_key(N_("editor"));
1705 (*i)->set_remote_control_id (order+1, false);
1707 } else if (UserOrdered == m) {
1708 //do nothing ... only changes to remote id's are initiated by user
1713 Route::RemoteControlIDChange();
1719 Session::new_audio_route (bool aux, int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many)
1722 uint32_t bus_id = 0;
1723 ChanCount existing_inputs;
1724 ChanCount existing_outputs;
1727 uint32_t control_id;
1729 count_existing_route_channels (existing_inputs, existing_outputs);
1731 control_id = ntracks() + nbusses() + 1;
1734 if (!find_route_name ("Bus", ++bus_id, bus_name, sizeof(bus_name))) {
1735 error << "cannot find name for new audio bus" << endmsg;
1740 Route* rt = new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO);
1747 boost_debug_shared_ptr_mark_interesting (rt, "Route");
1748 shared_ptr<Route> bus (rt);
1750 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1751 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1752 input_channels, output_channels)
1758 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1759 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1760 input_channels, output_channels)
1765 auto_connect_route (bus, existing_inputs, existing_outputs, false);
1768 route_group->add (bus);
1770 bus->set_remote_control_id (control_id);
1774 bus->add_internal_return ();
1777 ret.push_back (bus);
1781 catch (failed_constructor &err) {
1782 error << _("Session: could not create new audio route.") << endmsg;
1786 catch (AudioEngine::PortRegistrationFailure& pfe) {
1787 error << pfe.what() << endmsg;
1797 add_routes (ret, true);
1805 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
1809 uint32_t control_id;
1811 uint32_t number = 0;
1813 if (!tree.read (template_path.c_str())) {
1817 XMLNode* node = tree.root();
1819 control_id = ntracks() + nbusses() + 1;
1823 XMLNode node_copy (*node); // make a copy so we can change the name if we need to
1825 std::string node_name = IO::name_from_state (*node_copy.children().front());
1827 /* generate a new name by adding a number to the end of the template name */
1828 if (!find_route_name (node_name.c_str(), ++number, name, sizeof(name))) {
1829 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
1833 /* set IO children to use the new name */
1834 XMLNodeList const & children = node_copy.children ();
1835 for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
1836 if ((*i)->name() == IO::state_node_name) {
1837 IO::set_name_in_state (**i, name);
1841 Track::zero_diskstream_id_in_xml (node_copy);
1844 shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
1847 error << _("Session: cannot create track/bus from template description") << endmsg;
1851 if (boost::dynamic_pointer_cast<Track>(route)) {
1852 /* force input/output change signals so that the new diskstream
1853 picks up the configuration of the route. During session
1854 loading this normally happens in a different way.
1856 route->input()->changed (IOChange (ConfigurationChanged|ConnectionsChanged), this);
1857 route->output()->changed (IOChange (ConfigurationChanged|ConnectionsChanged), this);
1860 route->set_remote_control_id (control_id);
1863 ret.push_back (route);
1866 catch (failed_constructor &err) {
1867 error << _("Session: could not create new route from template") << endmsg;
1871 catch (AudioEngine::PortRegistrationFailure& pfe) {
1872 error << pfe.what() << endmsg;
1881 add_routes (ret, true);
1888 Session::add_routes (RouteList& new_routes, bool save)
1891 RCUWriter<RouteList> writer (routes);
1892 shared_ptr<RouteList> r = writer.get_copy ();
1893 r->insert (r->end(), new_routes.begin(), new_routes.end());
1896 /* if there is no control out and we're not in the middle of loading,
1897 resort the graph here. if there is a control out, we will resort
1898 toward the end of this method. if we are in the middle of loading,
1899 we will resort when done.
1902 if (!_monitor_out && IO::connecting_legal) {
1903 resort_routes_using (r);
1907 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
1909 boost::weak_ptr<Route> wpr (*x);
1910 boost::shared_ptr<Route> r (*x);
1912 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
1913 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
1914 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
1915 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
1916 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
1917 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
1918 r->order_key_changed.connect_same_thread (*this, boost::bind (&Session::route_order_key_changed, this));
1920 if (r->is_master()) {
1924 if (r->is_monitor()) {
1928 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
1930 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
1931 track_playlist_changed (boost::weak_ptr<Track> (tr));
1932 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
1934 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
1936 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
1941 if (_monitor_out && IO::connecting_legal) {
1943 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
1944 if ((*x)->is_monitor()) {
1946 } else if ((*x)->is_master()) {
1949 (*x)->listen_via (_monitor_out,
1950 (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader),
1961 save_state (_current_snapshot_name);
1964 RouteAdded (new_routes); /* EMIT SIGNAL */
1965 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
1969 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
1971 boost::shared_ptr<RouteList> r = routes.reader ();
1972 boost::shared_ptr<Send> s;
1976 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1977 if (boost::dynamic_pointer_cast<Track>(*i)) {
1978 if ((s = (*i)->internal_send_for (dest)) != 0) {
1979 s->amp()->gain_control()->set_value (0.0);
1986 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
1988 boost::shared_ptr<RouteList> r = routes.reader ();
1989 boost::shared_ptr<Send> s;
1993 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1994 if (boost::dynamic_pointer_cast<Track>(*i)) {
1995 if ((s = (*i)->internal_send_for (dest)) != 0) {
1996 s->amp()->gain_control()->set_value (1.0);
2003 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2005 boost::shared_ptr<RouteList> r = routes.reader ();
2006 boost::shared_ptr<Send> s;
2010 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2011 if (boost::dynamic_pointer_cast<Track>(*i)) {
2012 if ((s = (*i)->internal_send_for (dest)) != 0) {
2013 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2020 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p)
2022 boost::shared_ptr<RouteList> r = routes.reader ();
2023 boost::shared_ptr<RouteList> t (new RouteList);
2025 /* only send tracks */
2027 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2028 if (boost::dynamic_pointer_cast<Track>(*i)) {
2033 add_internal_sends (dest, p, t);
2037 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2039 if (dest->is_monitor() || dest->is_master()) {
2043 if (!dest->internal_return()) {
2044 dest->add_internal_return();
2047 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2049 if ((*i)->is_monitor() || (*i)->is_master() || (*i) == dest) {
2053 (*i)->listen_via (dest, p, true, true);
2060 Session::remove_route (shared_ptr<Route> route)
2062 if (((route == _master_out) || (route == _monitor_out)) && !Config->get_allow_special_bus_removal()) {
2067 RCUWriter<RouteList> writer (routes);
2068 shared_ptr<RouteList> rs = writer.get_copy ();
2072 /* deleting the master out seems like a dumb
2073 idea, but its more of a UI policy issue
2077 if (route == _master_out) {
2078 _master_out = shared_ptr<Route> ();
2081 if (route == _monitor_out) {
2083 /* cancel control outs for all routes */
2085 for (RouteList::iterator r = rs->begin(); r != rs->end(); ++r) {
2086 (*r)->drop_listen (_monitor_out);
2089 _monitor_out.reset ();
2092 /* writer goes out of scope, forces route list update */
2095 update_route_solo_state ();
2096 update_session_range_location_marker ();
2098 // We need to disconnect the route's inputs and outputs
2100 route->input()->disconnect (0);
2101 route->output()->disconnect (0);
2103 /* if the route had internal sends sending to it, remove them */
2104 if (route->internal_return()) {
2106 boost::shared_ptr<RouteList> r = routes.reader ();
2107 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2108 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2110 (*i)->remove_processor (s);
2115 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2116 if (mt && mt->step_editing()) {
2117 if (_step_editors > 0) {
2122 update_latency_compensation (false, false);
2125 /* Re-sort routes to remove the graph's current references to the one that is
2126 * going away, then flush old references out of the graph.
2130 route_graph->clear_other_chain ();
2132 /* get rid of it from the dead wood collection in the route list manager */
2134 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2138 /* try to cause everyone to drop their references */
2140 route->drop_references ();
2142 sync_order_keys (N_("session"));
2144 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2146 /* save the new state of the world */
2148 if (save_state (_current_snapshot_name)) {
2149 save_history (_current_snapshot_name);
2154 Session::route_mute_changed (void* /*src*/)
2160 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2162 boost::shared_ptr<Route> route = wpr.lock();
2164 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2168 if (route->listening()) {
2170 if (Config->get_exclusive_solo()) {
2171 /* new listen: disable all other listen */
2172 shared_ptr<RouteList> r = routes.reader ();
2173 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2174 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2177 (*i)->set_listen (false, this);
2183 } else if (_listen_cnt > 0) {
2189 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2191 boost::shared_ptr<Route> route = wpr.lock ();
2194 /* should not happen */
2195 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2199 bool send_changed = false;
2201 if (route->solo_isolated()) {
2202 if (_solo_isolated_cnt == 0) {
2203 send_changed = true;
2205 _solo_isolated_cnt++;
2206 } else if (_solo_isolated_cnt > 0) {
2207 _solo_isolated_cnt--;
2208 if (_solo_isolated_cnt == 0) {
2209 send_changed = true;
2214 IsolatedChanged (); /* EMIT SIGNAL */
2219 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2221 if (!self_solo_change) {
2222 // session doesn't care about changes to soloed-by-others
2226 if (solo_update_disabled) {
2231 boost::shared_ptr<Route> route = wpr.lock ();
2234 /* should not happen */
2235 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2239 shared_ptr<RouteList> r = routes.reader ();
2242 if (route->self_soloed()) {
2248 if (delta == 1 && Config->get_exclusive_solo()) {
2249 /* new solo: disable all other solos */
2250 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2251 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2254 (*i)->set_solo (false, this);
2258 solo_update_disabled = true;
2260 RouteList uninvolved;
2262 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2263 bool via_sends_only;
2264 bool in_signal_flow;
2266 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2270 in_signal_flow = false;
2272 if ((*i)->feeds (route, &via_sends_only)) {
2273 if (!via_sends_only) {
2274 if (!route->soloed_by_others_upstream()) {
2275 (*i)->mod_solo_by_others_downstream (delta);
2277 in_signal_flow = true;
2281 if (route->feeds (*i, &via_sends_only)) {
2282 (*i)->mod_solo_by_others_upstream (delta);
2283 in_signal_flow = true;
2286 if (!in_signal_flow) {
2287 uninvolved.push_back (*i);
2291 solo_update_disabled = false;
2292 update_route_solo_state (r);
2294 /* now notify that the mute state of the routes not involved in the signal
2295 pathway of the just-solo-changed route may have altered.
2298 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2299 (*i)->mute_changed (this);
2302 SoloChanged (); /* EMIT SIGNAL */
2307 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2309 /* now figure out if anything that matters is soloed (or is "listening")*/
2311 bool something_soloed = false;
2312 uint32_t listeners = 0;
2313 uint32_t isolated = 0;
2316 r = routes.reader();
2319 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2320 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2321 something_soloed = true;
2324 if (!(*i)->is_hidden() && (*i)->listening()) {
2325 if (Config->get_solo_control_is_listen_control()) {
2328 (*i)->set_listen (false, this);
2332 if ((*i)->solo_isolated()) {
2337 if (something_soloed != _non_soloed_outs_muted) {
2338 _non_soloed_outs_muted = something_soloed;
2339 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2342 _listen_cnt = listeners;
2344 if (isolated != _solo_isolated_cnt) {
2345 _solo_isolated_cnt = isolated;
2346 IsolatedChanged (); /* EMIT SIGNAL */
2350 boost::shared_ptr<RouteList>
2351 Session::get_routes_with_internal_returns() const
2353 shared_ptr<RouteList> r = routes.reader ();
2354 boost::shared_ptr<RouteList> rl (new RouteList);
2356 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2357 if ((*i)->internal_return ()) {
2365 Session::io_name_is_legal (const std::string& name)
2367 shared_ptr<RouteList> r = routes.reader ();
2369 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2370 if ((*i)->name() == name) {
2374 if ((*i)->has_io_processor_named (name)) {
2383 Session::route_by_name (string name)
2385 shared_ptr<RouteList> r = routes.reader ();
2387 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2388 if ((*i)->name() == name) {
2393 return shared_ptr<Route> ((Route*) 0);
2397 Session::route_by_id (PBD::ID id)
2399 shared_ptr<RouteList> r = routes.reader ();
2401 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2402 if ((*i)->id() == id) {
2407 return shared_ptr<Route> ((Route*) 0);
2411 Session::route_by_remote_id (uint32_t id)
2413 shared_ptr<RouteList> r = routes.reader ();
2415 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2416 if ((*i)->remote_control_id() == id) {
2421 return shared_ptr<Route> ((Route*) 0);
2424 /** If either end of the session range location marker lies inside the current
2425 * session extent, move it to the corresponding session extent.
2428 Session::update_session_range_location_marker ()
2430 if (_state_of_the_state & Loading) {
2434 pair<nframes_t, nframes_t> const ext = get_extent ();
2436 if (_session_range_location == 0) {
2437 /* we don't have a session range yet; use this one (provided it is valid) */
2438 if (ext.first != max_frames) {
2439 add_session_range_location (ext.first, ext.second);
2442 /* update the existing session range */
2443 if (ext.first < _session_range_location->start()) {
2444 _session_range_location->set_start (ext.first);
2448 if (ext.second > _session_range_location->end()) {
2449 _session_range_location->set_end (ext.second);
2456 /** @return Extent of the session's contents; if the session is empty, the first value of
2457 * the pair will equal max_frames.
2459 pair<nframes_t, nframes_t>
2460 Session::get_extent () const
2462 pair<nframes_t, nframes_t> ext (max_frames, 0);
2464 boost::shared_ptr<RouteList> rl = routes.reader ();
2465 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2466 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2467 if (!tr || tr->destructive()) {
2468 // ignore tape tracks when getting extents
2472 pair<nframes_t, nframes_t> e = tr->playlist()->get_extent ();
2473 if (e.first < ext.first) {
2474 ext.first = e.first;
2476 if (e.second > ext.second) {
2477 ext.second = e.second;
2484 /* Region management */
2486 boost::shared_ptr<Region>
2487 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2489 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2490 RegionFactory::RegionMap::const_iterator i;
2491 boost::shared_ptr<Region> region;
2493 Glib::Mutex::Lock lm (region_lock);
2495 for (i = regions.begin(); i != regions.end(); ++i) {
2499 if (region->whole_file()) {
2501 if (child->source_equivalent (region)) {
2507 return boost::shared_ptr<Region> ();
2511 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2513 set<boost::shared_ptr<Region> > relevant_regions;
2515 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2516 RegionFactory::get_regions_using_source (*s, relevant_regions);
2519 cerr << "There are " << relevant_regions.size() << " using " << srcs.size() << " sources" << endl;
2521 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2522 set<boost::shared_ptr<Region> >::iterator tmp;
2527 cerr << "Cleanup " << (*r)->name() << " UC = " << (*r).use_count() << endl;
2529 playlists->destroy_region (*r);
2530 RegionFactory::map_remove (*r);
2532 (*r)->drop_sources ();
2533 (*r)->drop_references ();
2535 cerr << "\tdone UC = " << (*r).use_count() << endl;
2537 relevant_regions.erase (r);
2542 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2545 Glib::Mutex::Lock ls (source_lock);
2546 /* remove from the main source list */
2547 sources.erase ((*s)->id());
2550 (*s)->mark_for_remove ();
2551 (*s)->drop_references ();
2560 Session::remove_last_capture ()
2562 list<boost::shared_ptr<Source> > srcs;
2564 boost::shared_ptr<RouteList> rl = routes.reader ();
2565 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2566 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2571 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2574 srcs.insert (srcs.end(), l.begin(), l.end());
2579 destroy_sources (srcs);
2581 save_state (_current_snapshot_name);
2586 /* Source Management */
2589 Session::add_source (boost::shared_ptr<Source> source)
2591 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2592 pair<SourceMap::iterator,bool> result;
2594 entry.first = source->id();
2595 entry.second = source;
2598 Glib::Mutex::Lock lm (source_lock);
2599 result = sources.insert (entry);
2602 if (result.second) {
2604 /* yay, new source */
2608 boost::shared_ptr<AudioFileSource> afs;
2610 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2611 if (Config->get_auto_analyse_audio()) {
2612 Analyser::queue_source_for_analysis (source, false);
2619 Session::remove_source (boost::weak_ptr<Source> src)
2621 SourceMap::iterator i;
2622 boost::shared_ptr<Source> source = src.lock();
2629 Glib::Mutex::Lock lm (source_lock);
2631 if ((i = sources.find (source->id())) != sources.end()) {
2632 cerr << "Removing source " << source->name() << endl;
2637 if (!_state_of_the_state & InCleanup) {
2639 /* save state so we don't end up with a session file
2640 referring to non-existent sources.
2643 save_state (_current_snapshot_name);
2647 boost::shared_ptr<Source>
2648 Session::source_by_id (const PBD::ID& id)
2650 Glib::Mutex::Lock lm (source_lock);
2651 SourceMap::iterator i;
2652 boost::shared_ptr<Source> source;
2654 if ((i = sources.find (id)) != sources.end()) {
2661 boost::shared_ptr<Source>
2662 Session::source_by_path_and_channel (const Glib::ustring& path, uint16_t chn)
2664 Glib::Mutex::Lock lm (source_lock);
2666 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2667 boost::shared_ptr<AudioFileSource> afs
2668 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
2670 if (afs && afs->path() == path && chn == afs->channel()) {
2674 return boost::shared_ptr<Source>();
2679 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
2682 string old_basename = PBD::basename_nosuffix (oldname);
2683 string new_legalized = legalize_for_path (newname);
2685 /* note: we know (or assume) the old path is already valid */
2689 /* destructive file sources have a name of the form:
2691 /path/to/Tnnnn-NAME(%[LR])?.wav
2693 the task here is to replace NAME with the new name.
2698 string::size_type dash;
2700 dir = Glib::path_get_dirname (path);
2701 path = Glib::path_get_basename (path);
2703 /* '-' is not a legal character for the NAME part of the path */
2705 if ((dash = path.find_last_of ('-')) == string::npos) {
2709 prefix = path.substr (0, dash);
2713 path += new_legalized;
2714 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
2716 path = Glib::build_filename (dir, path);
2720 /* non-destructive file sources have a name of the form:
2722 /path/to/NAME-nnnnn(%[LR])?.ext
2724 the task here is to replace NAME with the new name.
2729 string::size_type dash;
2730 string::size_type postfix;
2732 dir = Glib::path_get_dirname (path);
2733 path = Glib::path_get_basename (path);
2735 /* '-' is not a legal character for the NAME part of the path */
2737 if ((dash = path.find_last_of ('-')) == string::npos) {
2741 suffix = path.substr (dash+1);
2743 // Suffix is now everything after the dash. Now we need to eliminate
2744 // the nnnnn part, which is done by either finding a '%' or a '.'
2746 postfix = suffix.find_last_of ("%");
2747 if (postfix == string::npos) {
2748 postfix = suffix.find_last_of ('.');
2751 if (postfix != string::npos) {
2752 suffix = suffix.substr (postfix);
2754 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
2758 const uint32_t limit = 10000;
2759 char buf[PATH_MAX+1];
2761 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
2763 snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
2765 if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
2766 path = Glib::build_filename (dir, buf);
2774 fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
2783 /** Return the full path (in some session directory) for a new within-session source.
2784 * \a name must be a session-unique name that does not contain slashes
2785 * (e.g. as returned by new_*_source_name)
2788 Session::new_source_path_from_name (DataType type, const string& name, bool as_stub)
2790 assert(name.find("/") == string::npos);
2792 SessionDirectory sdir(get_best_session_directory_for_new_source());
2795 if (type == DataType::AUDIO) {
2796 p = (as_stub ? sdir.sound_stub_path() : sdir.sound_path());
2797 } else if (type == DataType::MIDI) {
2798 p = (as_stub ? sdir.midi_stub_path() : sdir.midi_path());
2800 error << "Unknown source type, unable to create file path" << endmsg;
2805 return p.to_string();
2809 Session::peak_path (Glib::ustring base) const
2811 sys::path peakfile_path(_session_dir->peak_path());
2812 peakfile_path /= basename_nosuffix (base) + peakfile_suffix;
2813 return peakfile_path.to_string();
2816 /** Return a unique name based on \a base for a new internal audio source */
2818 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
2821 char buf[PATH_MAX+1];
2822 const uint32_t limit = 10000;
2824 string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
2827 legalized = legalize_for_path (base);
2829 // Find a "version" of the base name that doesn't exist in any of the possible directories.
2830 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
2832 vector<space_and_path>::iterator i;
2833 uint32_t existing = 0;
2835 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2840 snprintf (buf, sizeof(buf), "T%04d-%s%s",
2841 cnt, legalized.c_str(), ext.c_str());
2842 } else if (nchan == 2) {
2844 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
2845 cnt, legalized.c_str(), ext.c_str());
2847 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
2848 cnt, legalized.c_str(), ext.c_str());
2850 } else if (nchan < 26) {
2851 snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
2852 cnt, legalized.c_str(), 'a' + chan, ext.c_str());
2854 snprintf (buf, sizeof(buf), "T%04d-%s%s",
2855 cnt, legalized.c_str(), ext.c_str());
2861 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
2862 } else if (nchan == 2) {
2864 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
2866 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
2868 } else if (nchan < 26) {
2869 snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
2871 snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
2875 SessionDirectory sdir((*i).path);
2877 string spath = sdir.sound_path().to_string();
2878 string spath_stubs = sdir.sound_stub_path().to_string();
2880 /* note that we search *without* the extension so that
2881 we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
2882 in the event that this new name is required for
2883 a file format change.
2886 if (matching_unsuffixed_filename_exists_in (spath, buf) ||
2887 matching_unsuffixed_filename_exists_in (spath_stubs, buf)) {
2893 if (existing == 0) {
2898 error << string_compose(
2899 _("There are already %1 recordings for %2, which I consider too many."),
2900 limit, base) << endmsg;
2902 throw failed_constructor();
2906 return Glib::path_get_basename (buf);
2909 /** Create a new within-session audio source */
2910 boost::shared_ptr<AudioFileSource>
2911 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive, bool as_stub)
2913 const string name = new_audio_source_name (n, n_chans, chan, destructive);
2914 const string path = new_source_path_from_name(DataType::AUDIO, name, as_stub);
2916 return boost::dynamic_pointer_cast<AudioFileSource> (
2917 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
2920 /** Return a unique name based on \a base for a new internal MIDI source */
2922 Session::new_midi_source_name (const string& base)
2925 char buf[PATH_MAX+1];
2926 const uint32_t limit = 10000;
2930 legalized = legalize_for_path (base);
2932 // Find a "version" of the file name that doesn't exist in any of the possible directories.
2933 for (cnt = 1; cnt <= limit; ++cnt) {
2935 vector<space_and_path>::iterator i;
2936 uint32_t existing = 0;
2938 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2940 SessionDirectory sdir((*i).path);
2942 sys::path p = sdir.midi_path();
2945 snprintf (buf, sizeof(buf), "%s-%u.mid", p.to_string().c_str(), cnt);
2947 if (sys::exists (buf)) {
2952 if (existing == 0) {
2957 error << string_compose(
2958 _("There are already %1 recordings for %2, which I consider too many."),
2959 limit, base) << endmsg;
2961 throw failed_constructor();
2965 return Glib::path_get_basename(buf);
2969 /** Create a new within-session MIDI source */
2970 boost::shared_ptr<MidiSource>
2971 Session::create_midi_source_for_session (Track* track, string const & n, bool as_stub)
2973 /* try to use the existing write source for the track, to keep numbering sane
2977 /*MidiTrack* mt = dynamic_cast<Track*> (track);
2981 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
2984 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
2985 return boost::dynamic_pointer_cast<MidiSource> (l.front());
2989 const string name = new_midi_source_name (n);
2990 const string path = new_source_path_from_name (DataType::MIDI, name, as_stub);
2992 return boost::dynamic_pointer_cast<SMFSource> (
2993 SourceFactory::createWritable (
2994 DataType::MIDI, *this, path, false, frame_rate()));
2999 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3001 if (playlist->hidden()) {
3005 playlists->add (playlist);
3008 playlist->release();
3015 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3017 if (_state_of_the_state & Deletion) {
3021 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3027 playlists->remove (playlist);
3033 Session::set_audition (boost::shared_ptr<Region> r)
3035 pending_audition_region = r;
3036 add_post_transport_work (PostTransportAudition);
3037 _butler->schedule_transport_work ();
3041 Session::audition_playlist ()
3043 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3044 ev->region.reset ();
3049 Session::non_realtime_set_audition ()
3051 if (!pending_audition_region) {
3052 auditioner->audition_current_playlist ();
3054 auditioner->audition_region (pending_audition_region);
3055 pending_audition_region.reset ();
3057 AuditionActive (true); /* EMIT SIGNAL */
3061 Session::audition_region (boost::shared_ptr<Region> r)
3063 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3069 Session::cancel_audition ()
3071 if (auditioner->auditioning()) {
3072 auditioner->cancel_audition ();
3073 AuditionActive (false); /* EMIT SIGNAL */
3078 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3080 if (a->is_monitor()) {
3083 if (b->is_monitor()) {
3086 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3090 Session::is_auditioning () const
3092 /* can be called before we have an auditioner object */
3094 return auditioner->auditioning();
3101 Session::graph_reordered ()
3103 /* don't do this stuff if we are setting up connections
3104 from a set_state() call or creating new tracks. Ditto for deletion.
3107 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3111 /* every track/bus asked for this to be handled but it was deferred because
3112 we were connecting. do it now.
3115 request_input_change_handling ();
3119 /* force all diskstreams to update their capture offset values to
3120 reflect any changes in latencies within the graph.
3123 boost::shared_ptr<RouteList> rl = routes.reader ();
3124 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3125 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3127 tr->set_capture_offset ();
3133 Session::available_capture_duration ()
3135 float sample_bytes_on_disk = 4.0; // keep gcc happy
3137 switch (config.get_native_file_data_format()) {
3139 sample_bytes_on_disk = 4.0;
3143 sample_bytes_on_disk = 3.0;
3147 sample_bytes_on_disk = 2.0;
3151 /* impossible, but keep some gcc versions happy */
3152 fatal << string_compose (_("programming error: %1"),
3153 X_("illegal native file data format"))
3158 double scale = 4096.0 / sample_bytes_on_disk;
3160 if (_total_free_4k_blocks * scale > (double) max_frames) {
3164 return (nframes_t) floor (_total_free_4k_blocks * scale);
3168 Session::add_bundle (shared_ptr<Bundle> bundle)
3171 RCUWriter<BundleList> writer (_bundles);
3172 boost::shared_ptr<BundleList> b = writer.get_copy ();
3173 b->push_back (bundle);
3176 BundleAdded (bundle); /* EMIT SIGNAL */
3182 Session::remove_bundle (shared_ptr<Bundle> bundle)
3184 bool removed = false;
3187 RCUWriter<BundleList> writer (_bundles);
3188 boost::shared_ptr<BundleList> b = writer.get_copy ();
3189 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3191 if (i != b->end()) {
3198 BundleRemoved (bundle); /* EMIT SIGNAL */
3205 Session::bundle_by_name (string name) const
3207 boost::shared_ptr<BundleList> b = _bundles.reader ();
3209 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3210 if ((*i)->name() == name) {
3215 return boost::shared_ptr<Bundle> ();
3219 Session::tempo_map_changed (const PropertyChange&)
3223 playlists->update_after_tempo_map_change ();
3228 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3229 * the given count with the current block size.
3232 Session::ensure_buffers (ChanCount howmany)
3234 BufferManager::ensure_buffers (howmany);
3238 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3240 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3241 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3246 Session::next_insert_id ()
3248 /* this doesn't really loop forever. just think about it */
3251 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3252 if (!insert_bitset[n]) {
3253 insert_bitset[n] = true;
3259 /* none available, so resize and try again */
3261 insert_bitset.resize (insert_bitset.size() + 16, false);
3266 Session::next_send_id ()
3268 /* this doesn't really loop forever. just think about it */
3271 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3272 if (!send_bitset[n]) {
3273 send_bitset[n] = true;
3279 /* none available, so resize and try again */
3281 send_bitset.resize (send_bitset.size() + 16, false);
3286 Session::next_return_id ()
3288 /* this doesn't really loop forever. just think about it */
3291 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3292 if (!return_bitset[n]) {
3293 return_bitset[n] = true;
3299 /* none available, so resize and try again */
3301 return_bitset.resize (return_bitset.size() + 16, false);
3306 Session::mark_send_id (uint32_t id)
3308 if (id >= send_bitset.size()) {
3309 send_bitset.resize (id+16, false);
3311 if (send_bitset[id]) {
3312 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3314 send_bitset[id] = true;
3318 Session::mark_return_id (uint32_t id)
3320 if (id >= return_bitset.size()) {
3321 return_bitset.resize (id+16, false);
3323 if (return_bitset[id]) {
3324 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3326 return_bitset[id] = true;
3330 Session::mark_insert_id (uint32_t id)
3332 if (id >= insert_bitset.size()) {
3333 insert_bitset.resize (id+16, false);
3335 if (insert_bitset[id]) {
3336 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3338 insert_bitset[id] = true;
3342 Session::unmark_send_id (uint32_t id)
3344 if (id < send_bitset.size()) {
3345 send_bitset[id] = false;
3350 Session::unmark_return_id (uint32_t id)
3352 if (id < return_bitset.size()) {
3353 return_bitset[id] = false;
3358 Session::unmark_insert_id (uint32_t id)
3360 if (id < insert_bitset.size()) {
3361 insert_bitset[id] = false;
3366 /* Named Selection management */
3368 boost::shared_ptr<NamedSelection>
3369 Session::named_selection_by_name (string name)
3371 Glib::Mutex::Lock lm (named_selection_lock);
3372 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3373 if ((*i)->name == name) {
3377 return boost::shared_ptr<NamedSelection>();
3381 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3384 Glib::Mutex::Lock lm (named_selection_lock);
3385 named_selections.insert (named_selections.begin(), named_selection);
3390 NamedSelectionAdded (); /* EMIT SIGNAL */
3394 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3396 bool removed = false;
3399 Glib::Mutex::Lock lm (named_selection_lock);
3401 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3403 if (i != named_selections.end()) {
3404 named_selections.erase (i);
3411 NamedSelectionRemoved (); /* EMIT SIGNAL */
3416 Session::reset_native_file_format ()
3418 boost::shared_ptr<RouteList> rl = routes.reader ();
3419 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3420 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3422 /* don't save state as we do this, there's no point
3425 _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3426 tr->reset_write_sources (false);
3427 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3433 Session::route_name_unique (string n) const
3435 shared_ptr<RouteList> r = routes.reader ();
3437 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3438 if ((*i)->name() == n) {
3447 Session::route_name_internal (string n) const
3449 if (auditioner && auditioner->name() == n) {
3453 if (_click_io && _click_io->name() == n) {
3461 Session::freeze_all (InterThreadInfo& itt)
3463 shared_ptr<RouteList> r = routes.reader ();
3465 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3467 boost::shared_ptr<Track> t;
3469 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3470 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3480 boost::shared_ptr<Region>
3481 Session::write_one_track (AudioTrack& track, nframes_t start, nframes_t end,
3482 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3483 InterThreadInfo& itt, bool enable_processing)
3485 boost::shared_ptr<Region> result;
3486 boost::shared_ptr<Playlist> playlist;
3487 boost::shared_ptr<AudioFileSource> fsource;
3489 char buf[PATH_MAX+1];
3490 ChanCount nchans(track.n_channels());
3492 nframes_t this_chunk;
3495 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3496 const string sound_dir = sdir.sound_path().to_string();
3497 nframes_t len = end - start;
3501 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3502 end, start) << endmsg;
3506 const nframes_t chunk_size = (256 * 1024)/4;
3508 // block all process callback handling
3510 block_processing ();
3512 /* call tree *MUST* hold route_lock */
3514 if ((playlist = track.playlist()) == 0) {
3518 /* external redirects will be a problem */
3520 if (track.has_external_redirects()) {
3524 ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3526 for (uint32_t chan_n=0; chan_n < nchans.n_audio(); ++chan_n) {
3528 for (x = 0; x < 99999; ++x) {
3529 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());
3530 if (access (buf, F_OK) != 0) {
3536 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3541 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3542 SourceFactory::createWritable (DataType::AUDIO, *this, buf, false, frame_rate()));
3545 catch (failed_constructor& err) {
3546 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3550 srcs.push_back (fsource);
3553 /* XXX need to flush all redirects */
3558 /* create a set of reasonably-sized buffers */
3559 buffers.ensure_buffers(DataType::AUDIO, nchans.n_audio(), chunk_size);
3560 buffers.set_count(nchans);
3562 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3563 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3565 afs->prepare_for_peakfile_writes ();
3568 while (to_do && !itt.cancel) {
3570 this_chunk = min (to_do, chunk_size);
3572 if (track.export_stuff (buffers, start, this_chunk, enable_processing)) {
3577 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
3578 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3581 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
3587 start += this_chunk;
3588 to_do -= this_chunk;
3590 itt.progress = (float) (1.0 - ((double) to_do / len));
3599 xnow = localtime (&now);
3601 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3602 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3605 afs->update_header (position, *xnow, now);
3606 afs->flush_header ();
3610 /* construct a region to represent the bounced material */
3614 plist.add (Properties::start, 0);
3615 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
3616 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
3618 result = RegionFactory::create (srcs, plist);
3624 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3625 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3628 afs->mark_for_remove ();
3631 (*src)->drop_references ();
3635 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3636 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3639 afs->done_with_peakfile_writes ();
3643 unblock_processing ();
3649 Session::gain_automation_buffer() const
3651 return ProcessThread::gain_automation_buffer ();
3655 Session::pan_automation_buffer() const
3657 return ProcessThread::pan_automation_buffer ();
3661 Session::get_silent_buffers (ChanCount count)
3663 return ProcessThread::get_silent_buffers (count);
3665 assert(_silent_buffers->available() >= count);
3666 _silent_buffers->set_count(count);
3668 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3669 for (size_t i= 0; i < count.get(*t); ++i) {
3670 _silent_buffers->get(*t, i).clear();
3674 return *_silent_buffers;
3679 Session::get_scratch_buffers (ChanCount count)
3681 return ProcessThread::get_scratch_buffers (count);
3683 if (count != ChanCount::ZERO) {
3684 assert(_scratch_buffers->available() >= count);
3685 _scratch_buffers->set_count(count);
3687 _scratch_buffers->set_count (_scratch_buffers->available());
3690 return *_scratch_buffers;
3695 Session::get_mix_buffers (ChanCount count)
3697 return ProcessThread::get_mix_buffers (count);
3699 assert(_mix_buffers->available() >= count);
3700 _mix_buffers->set_count(count);
3701 return *_mix_buffers;
3706 Session::ntracks () const
3709 shared_ptr<RouteList> r = routes.reader ();
3711 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3712 if (boost::dynamic_pointer_cast<Track> (*i)) {
3721 Session::nbusses () const
3724 shared_ptr<RouteList> r = routes.reader ();
3726 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3727 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
3736 Session::add_automation_list(AutomationList *al)
3738 automation_lists[al->id()] = al;
3742 Session::sync_order_keys (std::string const & base)
3744 if (deletion_in_progress()) {
3748 if (!Config->get_sync_all_route_ordering()) {
3749 /* leave order keys as they are */
3753 boost::shared_ptr<RouteList> r = routes.reader ();
3755 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3756 (*i)->sync_order_keys (base);
3759 Route::SyncOrderKeys (base); // EMIT SIGNAL
3761 /* this might not do anything */
3763 set_remote_control_ids ();
3766 /** @return true if there is at least one record-enabled track, otherwise false */
3768 Session::have_rec_enabled_track () const
3770 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
3773 /** Update the state of our rec-enabled tracks flag */
3775 Session::update_have_rec_enabled_track ()
3777 boost::shared_ptr<RouteList> rl = routes.reader ();
3778 RouteList::iterator i = rl->begin();
3779 while (i != rl->end ()) {
3781 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3782 if (tr && tr->record_enabled ()) {
3789 int const old = g_atomic_int_get (&_have_rec_enabled_track);
3791 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
3793 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
3794 RecordStateChanged (); /* EMIT SIGNAL */
3799 Session::listen_position_changed ()
3803 switch (Config->get_listen_position()) {
3804 case AfterFaderListen:
3808 case PreFaderListen:
3813 boost::shared_ptr<RouteList> r = routes.reader ();
3815 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3816 (*i)->put_monitor_send_at (p);
3821 Session::solo_control_mode_changed ()
3823 /* cancel all solo or all listen when solo control mode changes */
3826 set_solo (get_routes(), false);
3827 } else if (listening()) {
3828 set_listen (get_routes(), false);
3832 /** Called when anything about any of our route groups changes (membership, state etc.) */
3834 Session::route_group_changed ()
3836 RouteGroupChanged (); /* EMIT SIGNAL */
3840 Session::get_available_sync_options () const
3842 vector<SyncSource> ret;
3844 ret.push_back (JACK);
3845 ret.push_back (MTC);
3846 ret.push_back (MIDIClock);
3851 boost::shared_ptr<RouteList>
3852 Session::get_routes_with_regions_at (nframes64_t const p) const
3854 shared_ptr<RouteList> r = routes.reader ();
3855 shared_ptr<RouteList> rl (new RouteList);
3857 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3858 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3863 boost::shared_ptr<Playlist> pl = tr->playlist ();
3868 if (pl->has_region_at (p)) {
3877 Session::goto_end ()
3879 if (_session_range_location) {
3880 request_locate (_session_range_location->end(), false);
3882 request_locate (0, false);
3887 Session::goto_start ()
3889 if (_session_range_location) {
3890 request_locate (_session_range_location->start(), false);
3892 request_locate (0, false);
3897 Session::set_session_start (nframes_t start)
3899 if (_session_range_location) {
3900 _session_range_location->set_start (start);
3902 add_session_range_location (start, start);
3907 Session::set_session_end (nframes_t end)
3909 if (_session_range_location) {
3910 _session_range_location->set_end (end);
3912 add_session_range_location (end, end);
3917 Session::current_start_frame () const
3919 return _session_range_location ? _session_range_location->start() : 0;
3923 Session::current_end_frame () const
3925 return _session_range_location ? _session_range_location->end() : 0;
3929 Session::add_session_range_location (nframes_t start, nframes_t end)
3931 _session_range_location = new Location (start, end, _("session"), Location::IsSessionRange);
3932 _locations.add (_session_range_location);
3935 /** Called when one of our routes' order keys has changed */
3937 Session::route_order_key_changed ()
3939 RouteOrderKeyChanged (); /* EMIT SIGNAL */
3943 Session::step_edit_status_change (bool yn)
3949 send = (_step_editors == 0);
3954 send = (_step_editors == 1);
3957 if (_step_editors > 0) {
3963 StepEditStatusChange (val);