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++/jack.h"
106 using namespace ARDOUR;
108 using boost::shared_ptr;
109 using boost::weak_ptr;
111 bool Session::_disable_all_loaded_plugins = false;
113 PBD::Signal1<void,std::string> Session::Dialog;
114 PBD::Signal0<int> Session::AskAboutPendingState;
115 PBD::Signal2<int,nframes_t,nframes_t> Session::AskAboutSampleRateMismatch;
116 PBD::Signal0<void> Session::SendFeedback;
118 PBD::Signal0<void> Session::TimecodeOffsetChanged;
119 PBD::Signal0<void> Session::StartTimeChanged;
120 PBD::Signal0<void> Session::EndTimeChanged;
121 PBD::Signal0<void> Session::AutoBindingOn;
122 PBD::Signal0<void> Session::AutoBindingOff;
123 PBD::Signal2<void,std::string, std::string> Session::Exported;
124 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
126 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
127 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
129 Session::Session (AudioEngine &eng,
130 const string& fullpath,
131 const string& snapshot_name,
132 BusProfile* bus_profile,
136 _target_transport_speed (0.0),
137 _requested_return_frame (-1),
139 _mmc_port (default_mmc_port),
140 _mtc_port (default_mtc_port),
141 _midi_port (default_midi_port),
142 _midi_clock_port (default_midi_clock_port),
143 _session_dir (new SessionDirectory(fullpath)),
145 _butler (new Butler (*this)),
146 _post_transport_work (0),
147 _send_timecode_update (false),
148 route_graph (new Graph(*this)),
149 routes (new RouteList),
150 _total_free_4k_blocks (0),
151 _bundles (new BundleList),
152 _bundle_xml_node (0),
155 click_emphasis_data (0),
157 _metadata (new SessionMetadata()),
158 _have_rec_enabled_track (false)
161 playlists.reset (new SessionPlaylists);
163 interpolation.add_channel_to (0, 0);
165 if (!eng.connected()) {
166 throw failed_constructor();
169 n_physical_outputs = _engine.n_physical_outputs(DataType::AUDIO);
170 n_physical_inputs = _engine.n_physical_inputs(DataType::AUDIO);
172 first_stage_init (fullpath, snapshot_name);
174 _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
177 if (create (mix_template, bus_profile)) {
179 throw failed_constructor ();
183 if (second_stage_init ()) {
185 throw failed_constructor ();
188 store_recent_sessions(_name, _path);
190 bool was_dirty = dirty();
192 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
194 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
195 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
198 DirtyChanged (); /* EMIT SIGNAL */
212 vector<void*> debug_pointers;
214 /* if we got to here, leaving pending capture state around
218 remove_pending_capture_state ();
220 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
222 _engine.remove_session ();
224 /* clear history so that no references to objects are held any more */
228 /* clear state tree so that no references to objects are held any more */
232 /* reset dynamic state version back to default */
234 Stateful::loading_state_version = 0;
236 _butler->drop_references ();
238 delete midi_control_ui;
240 if (click_data != default_click) {
241 delete [] click_data;
244 if (click_emphasis_data != default_click_emphasis) {
245 delete [] click_emphasis_data;
250 /* clear out any pending dead wood from RCU managed objects */
255 AudioDiskstream::free_working_buffers();
257 /* tell everyone who is still standing that we're about to die */
260 /* tell everyone to drop references and delete objects as we go */
262 DEBUG_TRACE (DEBUG::Destruction, "delete named selections\n");
263 named_selections.clear ();
265 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
266 RegionFactory::delete_all_regions ();
268 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
270 /* reset these three references to special routes before we do the usual route delete thing */
273 _master_out.reset ();
274 _monitor_out.reset ();
277 RCUWriter<RouteList> writer (routes);
278 boost::shared_ptr<RouteList> r = writer.get_copy ();
280 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
281 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
282 (*i)->drop_references ();
286 /* writer goes out of scope and updates master */
290 boost::shared_ptr<RouteList> r = routes.reader ();
292 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
293 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
294 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->path(), i->second.use_count()));
295 i->second->drop_references ();
300 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
301 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
306 Crossfade::set_buffer_size (0);
310 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
313 boost_debug_list_ptrs ();
315 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
319 Session::set_worst_io_latencies ()
321 _worst_output_latency = 0;
322 _worst_input_latency = 0;
324 if (!_engine.connected()) {
328 boost::shared_ptr<RouteList> r = routes.reader ();
330 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
331 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
332 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
337 Session::when_engine_running ()
339 string first_physical_output;
341 BootMessage (_("Set block size and sample rate"));
343 set_block_size (_engine.frames_per_cycle());
344 set_frame_rate (_engine.frame_rate());
346 BootMessage (_("Using configuration"));
348 boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
349 boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
351 Config->map_parameters (ff);
352 config.map_parameters (ft);
354 /* every time we reconnect, recompute worst case output latencies */
356 _engine.Running.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies, this));
358 if (synced_to_jack()) {
359 _engine.transport_stop ();
362 if (config.get_jack_time_master()) {
363 _engine.transport_locate (_transport_frame);
371 _click_io.reset (new ClickIO (*this, "click"));
373 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
375 /* existing state for Click */
378 if (Stateful::loading_state_version < 3000) {
379 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
381 c = _click_io->set_state (*child->children().front(), Stateful::loading_state_version);
386 _clicking = Config->get_clicking ();
390 error << _("could not setup Click I/O") << endmsg;
397 /* default state for Click: dual-mono to first 2 physical outputs */
399 for (int physport = 0; physport < 2; ++physport) {
400 string physical_output = _engine.get_nth_physical_output (DataType::AUDIO, physport);
402 if (physical_output.length()) {
403 if (_click_io->add_port (physical_output, this)) {
404 // relax, even though its an error
409 if (_click_io->n_ports () > ChanCount::ZERO) {
410 _clicking = Config->get_clicking ();
415 catch (failed_constructor& err) {
416 error << _("cannot setup Click I/O") << endmsg;
419 BootMessage (_("Compute I/O Latencies"));
421 set_worst_io_latencies ();
424 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
427 BootMessage (_("Set up standard connections"));
429 /* Create a set of Bundle objects that map
430 to the physical I/O currently available. We create both
431 mono and stereo bundles, so that the common cases of mono
432 and stereo tracks get bundles to put in their mixer strip
433 in / out menus. There may be a nicer way of achieving that;
434 it doesn't really scale that well to higher channel counts
437 /* mono output bundles */
439 for (uint32_t np = 0; np < n_physical_outputs; ++np) {
441 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
443 shared_ptr<Bundle> c (new Bundle (buf, true));
444 c->add_channel (_("mono"));
445 c->set_port (0, _engine.get_nth_physical_output (DataType::AUDIO, np));
450 /* stereo output bundles */
452 for (uint32_t np = 0; np < n_physical_outputs; np += 2) {
453 if (np + 1 < n_physical_outputs) {
455 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
456 shared_ptr<Bundle> c (new Bundle (buf, true));
457 c->add_channel (_("L"));
458 c->set_port (0, _engine.get_nth_physical_output (DataType::AUDIO, np));
459 c->add_channel (_("R"));
460 c->set_port (1, _engine.get_nth_physical_output (DataType::AUDIO, np + 1));
466 /* mono input bundles */
468 for (uint32_t np = 0; np < n_physical_inputs; ++np) {
470 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
472 shared_ptr<Bundle> c (new Bundle (buf, false));
473 c->add_channel (_("mono"));
474 c->set_port (0, _engine.get_nth_physical_input (DataType::AUDIO, np));
479 /* stereo input bundles */
481 for (uint32_t np = 0; np < n_physical_inputs; np += 2) {
482 if (np + 1 < n_physical_inputs) {
484 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
486 shared_ptr<Bundle> c (new Bundle (buf, false));
487 c->add_channel (_("L"));
488 c->set_port (0, _engine.get_nth_physical_input (DataType::AUDIO, np));
489 c->add_channel (_("R"));
490 c->set_port (1, _engine.get_nth_physical_input (DataType::AUDIO, np + 1));
496 BootMessage (_("Setup signal flow and plugins"));
500 if (_is_new && !no_auto_connect()) {
502 /* don't connect the master bus outputs if there is a monitor bus */
504 if (_master_out && Config->get_auto_connect_standard_busses() && !_monitor_out) {
506 /* if requested auto-connect the outputs to the first N physical ports.
509 uint32_t limit = _master_out->n_outputs().n_total();
511 for (uint32_t n = 0; n < limit; ++n) {
512 Port* p = _master_out->output()->nth (n);
513 string connect_to = _engine.get_nth_physical_output (DataType (p->type()), n);
515 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
516 if (_master_out->output()->connect (p, connect_to, this)) {
517 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
527 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
528 are undefined, at best.
531 /* control out listens to master bus (but ignores it
532 under some conditions)
535 uint32_t limit = _monitor_out->n_inputs().n_audio();
538 for (uint32_t n = 0; n < limit; ++n) {
539 AudioPort* p = _monitor_out->input()->ports().nth_audio_port (n);
540 AudioPort* o = _master_out->output()->ports().nth_audio_port (n);
543 string connect_to = o->name();
544 if (_monitor_out->input()->connect (p, connect_to, this)) {
545 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
553 /* if control out is not connected, connect control out to physical outs
556 if (!_monitor_out->output()->connected ()) {
558 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
560 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
563 _monitor_out->output()->connect_ports_to_bundle (b, this);
565 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
566 Config->get_monitor_bus_preferred_bundle())
572 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
573 uint32_t mod = _engine.n_physical_outputs (*t);
574 uint32_t limit = _monitor_out->n_outputs().get(*t);
576 for (uint32_t n = 0; n < limit; ++n) {
578 Port* p = _monitor_out->output()->ports().port(*t, n);
579 string connect_to = _engine.get_nth_physical_output (*t, (n % mod));
581 if (!connect_to.empty()) {
582 if (_monitor_out->output()->connect (p, connect_to, this)) {
583 error << string_compose (
584 _("cannot connect control output %1 to %2"),
597 /* catch up on send+insert cnts */
599 _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
601 /* hook us up to the engine */
603 BootMessage (_("Connect to engine"));
605 _engine.set_session (this);
609 Session::hookup_io ()
611 /* stop graph reordering notifications from
612 causing resorts, etc.
615 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
620 /* we delay creating the auditioner till now because
621 it makes its own connections to ports.
625 Auditioner* a = new Auditioner (*this);
628 throw failed_constructor();
630 a->use_new_diskstream ();
631 auditioner.reset (a);
634 catch (failed_constructor& err) {
635 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
639 /* load bundles, which we may have postponed earlier on */
640 if (_bundle_xml_node) {
641 load_bundles (*_bundle_xml_node);
642 delete _bundle_xml_node;
645 /* Tell all IO objects to connect themselves together */
647 IO::enable_connecting ();
648 MIDI::JACK_MidiPort::MakeConnections ();
650 /* Now reset all panners */
652 Delivery::reset_panners ();
654 /* Connect tracks to monitor/listen bus if there is one.
655 Note that in an existing session, the internal sends will
656 already exist, but we want the routes to notice that
657 they connect to the control out specifically.
661 boost::shared_ptr<RouteList> r = routes.reader ();
662 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
664 if ((*x)->is_monitor()) {
668 } else if ((*x)->is_master()) {
674 (*x)->listen_via (_monitor_out,
675 (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader),
681 /* Anyone who cares about input state, wake up and do something */
683 IOConnectionsComplete (); /* EMIT SIGNAL */
685 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
687 /* now handle the whole enchilada as if it was one
693 /* update the full solo state, which can't be
694 correctly determined on a per-route basis, but
695 needs the global overview that only the session
699 update_route_solo_state ();
703 Session::playlist_length_changed ()
705 update_session_range_location_marker ();
709 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
711 boost::shared_ptr<Track> track = wp.lock ();
716 boost::shared_ptr<Playlist> playlist;
718 if ((playlist = track->playlist()) != 0) {
719 playlist->LengthChanged.connect_same_thread (*this, boost::bind (&Session::playlist_length_changed, this));
722 update_session_range_location_marker ();
726 Session::record_enabling_legal () const
728 /* this used to be in here, but survey says.... we don't need to restrict it */
729 // if (record_status() == Recording) {
733 if (Config->get_all_safe()) {
740 Session::reset_input_monitor_state ()
742 if (transport_rolling()) {
744 boost::shared_ptr<RouteList> rl = routes.reader ();
745 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
746 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
747 if (tr && tr->record_enabled ()) {
748 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
749 tr->monitor_input (Config->get_monitoring_model() == HardwareMonitoring && !config.get_auto_input());
755 boost::shared_ptr<RouteList> rl = routes.reader ();
756 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
757 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
758 if (tr && tr->record_enabled ()) {
759 //cerr << "switching to input = " << !Config->get_auto_input() << __FILE__ << __LINE__ << endl << endl;
760 tr->monitor_input (Config->get_monitoring_model() == HardwareMonitoring);
767 Session::auto_punch_start_changed (Location* location)
769 replace_event (SessionEvent::PunchIn, location->start());
771 if (get_record_enabled() && config.get_punch_in()) {
772 /* capture start has been changed, so save new pending state */
773 save_state ("", true);
778 Session::auto_punch_end_changed (Location* location)
780 nframes_t when_to_stop = location->end();
781 // when_to_stop += _worst_output_latency + _worst_input_latency;
782 replace_event (SessionEvent::PunchOut, when_to_stop);
786 Session::auto_punch_changed (Location* location)
788 nframes_t when_to_stop = location->end();
790 replace_event (SessionEvent::PunchIn, location->start());
791 //when_to_stop += _worst_output_latency + _worst_input_latency;
792 replace_event (SessionEvent::PunchOut, when_to_stop);
796 Session::auto_loop_changed (Location* location)
798 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
800 if (transport_rolling() && play_loop) {
803 // if (_transport_frame > location->end()) {
805 if (_transport_frame < location->start() || _transport_frame > location->end()) {
806 // relocate to beginning of loop
807 clear_events (SessionEvent::LocateRoll);
809 request_locate (location->start(), true);
812 else if (Config->get_seamless_loop() && !loop_changing) {
814 // schedule a locate-roll to refill the diskstreams at the
816 loop_changing = true;
818 if (location->end() > last_loopend) {
819 clear_events (SessionEvent::LocateRoll);
820 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
827 last_loopend = location->end();
831 Session::set_auto_punch_location (Location* location)
835 if ((existing = _locations.auto_punch_location()) != 0 && existing != location) {
836 punch_connections.drop_connections();
837 existing->set_auto_punch (false, this);
838 remove_event (existing->start(), SessionEvent::PunchIn);
839 clear_events (SessionEvent::PunchOut);
840 auto_punch_location_changed (0);
849 if (location->end() <= location->start()) {
850 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
854 punch_connections.drop_connections ();
856 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
857 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
858 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
860 location->set_auto_punch (true, this);
862 auto_punch_changed (location);
864 auto_punch_location_changed (location);
868 Session::set_auto_loop_location (Location* location)
872 if ((existing = _locations.auto_loop_location()) != 0 && existing != location) {
873 loop_connections.drop_connections ();
874 existing->set_auto_loop (false, this);
875 remove_event (existing->end(), SessionEvent::AutoLoop);
876 auto_loop_location_changed (0);
885 if (location->end() <= location->start()) {
886 error << _("Session: you can't use a mark for auto loop") << endmsg;
890 last_loopend = location->end();
892 loop_connections.drop_connections ();
894 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
895 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
896 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
898 location->set_auto_loop (true, this);
900 /* take care of our stuff first */
902 auto_loop_changed (location);
904 /* now tell everyone else */
906 auto_loop_location_changed (location);
910 Session::locations_added (Location *)
916 Session::locations_changed ()
918 _locations.apply (*this, &Session::handle_locations_changed);
922 Session::handle_locations_changed (Locations::LocationList& locations)
924 Locations::LocationList::iterator i;
926 bool set_loop = false;
927 bool set_punch = false;
929 for (i = locations.begin(); i != locations.end(); ++i) {
933 if (location->is_auto_punch()) {
934 set_auto_punch_location (location);
937 if (location->is_auto_loop()) {
938 set_auto_loop_location (location);
942 if (location->is_session_range()) {
943 _session_range_location = location;
948 set_auto_loop_location (0);
951 set_auto_punch_location (0);
958 Session::enable_record ()
960 /* XXX really atomic compare+swap here */
961 if (g_atomic_int_get (&_record_status) != Recording) {
962 g_atomic_int_set (&_record_status, Recording);
963 _last_record_location = _transport_frame;
964 deliver_mmc(MIDI::MachineControl::cmdRecordStrobe, _last_record_location);
966 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
968 boost::shared_ptr<RouteList> rl = routes.reader ();
969 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
970 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
971 if (tr && tr->record_enabled ()) {
972 tr->monitor_input (true);
977 RecordStateChanged ();
982 Session::disable_record (bool rt_context, bool force)
986 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
988 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
989 g_atomic_int_set (&_record_status, Disabled);
991 if (rs == Recording) {
992 g_atomic_int_set (&_record_status, Enabled);
996 // FIXME: timestamp correct? [DR]
997 // FIXME FIXME FIXME: rt_context? this must be called in the process thread.
998 // does this /need/ to be sent in all cases?
1000 deliver_mmc (MIDI::MachineControl::cmdRecordExit, _transport_frame);
1003 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1005 boost::shared_ptr<RouteList> rl = routes.reader ();
1006 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1007 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1008 if (tr && tr->record_enabled ()) {
1009 tr->monitor_input (false);
1014 RecordStateChanged (); /* emit signal */
1017 remove_pending_capture_state ();
1023 Session::step_back_from_record ()
1025 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1027 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1028 boost::shared_ptr<RouteList> rl = routes.reader ();
1029 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1030 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1031 if (tr && tr->record_enabled ()) {
1032 //cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl;
1033 tr->monitor_input (false);
1041 Session::maybe_enable_record ()
1043 g_atomic_int_set (&_record_status, Enabled);
1045 /* this function is currently called from somewhere other than an RT thread.
1046 this save_state() call therefore doesn't impact anything.
1049 save_state ("", true);
1051 if (_transport_speed) {
1052 if (!config.get_punch_in()) {
1056 deliver_mmc (MIDI::MachineControl::cmdRecordPause, _transport_frame);
1057 RecordStateChanged (); /* EMIT SIGNAL */
1064 Session::audible_frame () const
1070 /* the first of these two possible settings for "offset"
1071 mean that the audible frame is stationary until
1072 audio emerges from the latency compensation
1075 the second means that the audible frame is stationary
1076 until audio would emerge from a physical port
1077 in the absence of any plugin latency compensation
1080 offset = _worst_output_latency;
1082 if (offset > current_block_size) {
1083 offset -= current_block_size;
1085 /* XXX is this correct? if we have no external
1086 physical connections and everything is internal
1087 then surely this is zero? still, how
1088 likely is that anyway?
1090 offset = current_block_size;
1093 if (synced_to_jack()) {
1094 tf = _engine.transport_frame();
1096 tf = _transport_frame;
1101 if (!non_realtime_work_pending()) {
1105 /* Check to see if we have passed the first guaranteed
1106 audible frame past our last start position. if not,
1107 return that last start point because in terms
1108 of audible frames, we have not moved yet.
1110 `Start position' in this context means the time we last
1111 either started or changed transport direction.
1114 if (_transport_speed > 0.0f) {
1116 if (!play_loop || !have_looped) {
1117 if (tf < _last_roll_or_reversal_location + offset) {
1118 return _last_roll_or_reversal_location;
1126 } else if (_transport_speed < 0.0f) {
1128 /* XXX wot? no backward looping? */
1130 if (tf > _last_roll_or_reversal_location - offset) {
1131 return _last_roll_or_reversal_location;
1143 Session::set_frame_rate (nframes_t frames_per_second)
1145 /** \fn void Session::set_frame_size(nframes_t)
1146 the AudioEngine object that calls this guarantees
1147 that it will not be called while we are also in
1148 ::process(). Its fine to do things that block
1152 _base_frame_rate = frames_per_second;
1156 Automatable::set_automation_interval ((jack_nframes_t) ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1160 // XXX we need some equivalent to this, somehow
1161 // SndFileSource::setup_standard_crossfades (frames_per_second);
1165 /* XXX need to reset/reinstantiate all LADSPA plugins */
1169 Session::set_block_size (nframes_t nframes)
1171 /* the AudioEngine guarantees
1172 that it will not be called while we are also in
1173 ::process(). It is therefore fine to do things that block
1178 current_block_size = nframes;
1182 boost::shared_ptr<RouteList> r = routes.reader ();
1184 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1185 (*i)->set_block_size (nframes);
1188 boost::shared_ptr<RouteList> rl = routes.reader ();
1189 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1190 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1192 tr->set_block_size (nframes);
1196 set_worst_io_latencies ();
1201 Session::set_default_fade (float /*steepness*/, float /*fade_msecs*/)
1204 nframes_t fade_frames;
1206 /* Don't allow fade of less 1 frame */
1208 if (fade_msecs < (1000.0 * (1.0/_current_frame_rate))) {
1215 fade_frames = (nframes_t) floor (fade_msecs * _current_frame_rate * 0.001);
1219 default_fade_msecs = fade_msecs;
1220 default_fade_steepness = steepness;
1223 // jlc, WTF is this!
1224 Glib::RWLock::ReaderLock lm (route_lock);
1225 AudioRegion::set_default_fade (steepness, fade_frames);
1230 /* XXX have to do this at some point */
1231 /* foreach region using default fade, reset, then
1232 refill_all_diskstream_buffers ();
1237 struct RouteSorter {
1238 bool operator() (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> r2) {
1239 if (r2->feeds (r1)) {
1241 } else if (r1->feeds (r2)) {
1244 if (r1->not_fed ()) {
1245 if (r2->not_fed ()) {
1246 /* no ardour-based connections inbound to either route. just use signal order */
1247 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1249 /* r2 has connections, r1 does not; run r1 early */
1253 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1260 trace_terminal (shared_ptr<Route> r1, shared_ptr<Route> rbase)
1262 shared_ptr<Route> r2;
1264 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1265 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1269 /* make a copy of the existing list of routes that feed r1 */
1271 Route::FedBy existing (r1->fed_by());
1273 /* for each route that feeds r1, recurse, marking it as feeding
1277 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1278 if (!(r2 = i->r.lock ())) {
1279 /* (*i) went away, ignore it */
1283 /* r2 is a route that feeds r1 which somehow feeds base. mark
1284 base as being fed by r2
1287 rbase->add_fed_by (r2, i->sends_only);
1291 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1295 if (r1->feeds (r2) && r2->feeds (r1)) {
1299 /* now recurse, so that we can mark base as being fed by
1300 all routes that feed r2
1303 trace_terminal (r2, rbase);
1310 Session::resort_routes ()
1312 /* don't do anything here with signals emitted
1313 by Routes while we are being destroyed.
1316 if (_state_of_the_state & Deletion) {
1323 RCUWriter<RouteList> writer (routes);
1324 shared_ptr<RouteList> r = writer.get_copy ();
1325 resort_routes_using (r);
1326 /* writer goes out of scope and forces update */
1329 //route_graph->dump(1);
1332 boost::shared_ptr<RouteList> rl = routes.reader ();
1333 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1334 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1336 const Route::FedBy& fb ((*i)->fed_by());
1338 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1339 boost::shared_ptr<Route> sf = f->r.lock();
1341 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1349 Session::resort_routes_using (shared_ptr<RouteList> r)
1351 RouteList::iterator i, j;
1353 for (i = r->begin(); i != r->end(); ++i) {
1355 (*i)->clear_fed_by ();
1357 for (j = r->begin(); j != r->end(); ++j) {
1359 /* although routes can feed themselves, it will
1360 cause an endless recursive descent if we
1361 detect it. so don't bother checking for
1369 bool via_sends_only;
1371 if ((*j)->direct_feeds (*i, &via_sends_only)) {
1372 (*i)->add_fed_by (*j, via_sends_only);
1377 for (i = r->begin(); i != r->end(); ++i) {
1378 trace_terminal (*i, *i);
1384 route_graph->rechain( r );
1387 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1388 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1389 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1390 (*i)->name(), (*i)->order_key ("signal")));
1396 /** Find the route name starting with \a base with the lowest \a id.
1398 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1399 * The available route name with the lowest ID will be used, and \a id
1400 * will be set to the ID.
1402 * \return false if a route name could not be found, and \a track_name
1403 * and \a id do not reflect a free route name.
1406 Session::find_route_name (const char* base, uint32_t& id, char* name, size_t name_len)
1409 snprintf (name, name_len, "%s %" PRIu32, base, id);
1411 if (route_by_name (name) == 0) {
1417 } while (id < (UINT_MAX-1));
1423 Session::count_existing_route_channels (ChanCount& in, ChanCount& out)
1425 in = ChanCount::ZERO;
1426 out = ChanCount::ZERO;
1427 shared_ptr<RouteList> r = routes.reader ();
1428 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1429 if (!(*i)->is_hidden()) {
1430 in += (*i)->n_inputs();
1431 out += (*i)->n_outputs();
1436 list<boost::shared_ptr<MidiTrack> >
1437 Session::new_midi_track (TrackMode mode, RouteGroup* route_group, uint32_t how_many)
1439 char track_name[32];
1440 uint32_t track_id = 0;
1441 ChanCount existing_inputs;
1442 ChanCount existing_outputs;
1444 RouteList new_routes;
1445 list<boost::shared_ptr<MidiTrack> > ret;
1446 uint32_t control_id;
1448 count_existing_route_channels (existing_inputs, existing_outputs);
1450 control_id = ntracks() + nbusses();
1453 if (!find_route_name ("Midi", ++track_id, track_name, sizeof(track_name))) {
1454 error << "cannot find name for new midi track" << endmsg;
1458 shared_ptr<MidiTrack> track;
1461 MidiTrack* mt = new MidiTrack (*this, track_name, Route::Flag (0), mode);
1468 mt->use_new_diskstream();
1470 boost_debug_shared_ptr_mark_interesting (mt, "Track");
1471 track = boost::shared_ptr<MidiTrack>(mt);
1473 if (track->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1474 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1479 if (track->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1480 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1484 auto_connect_route (track, existing_inputs, existing_outputs);
1486 track->non_realtime_input_change();
1488 route_group->add (track);
1491 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1492 track->set_remote_control_id (control_id);
1494 new_routes.push_back (track);
1495 ret.push_back (track);
1498 catch (failed_constructor &err) {
1499 error << _("Session: could not create new midi track.") << endmsg;
1503 catch (AudioEngine::PortRegistrationFailure& pfe) {
1505 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;
1513 if (!new_routes.empty()) {
1514 add_routes (new_routes, false);
1515 save_state (_current_snapshot_name);
1522 Session::auto_connect_route (boost::shared_ptr<Route> route,
1523 ChanCount& existing_inputs, ChanCount& existing_outputs)
1525 /* If both inputs and outputs are auto-connected to physical ports,
1526 use the max of input and output offsets to ensure auto-connected
1527 port numbers always match up (e.g. the first audio input and the
1528 first audio output of the route will have the same physical
1529 port number). Otherwise just use the lowest input or output
1532 const bool in_out_physical =
1533 (Config->get_input_auto_connect() & AutoConnectPhysical)
1534 && (Config->get_output_auto_connect() & AutoConnectPhysical);
1536 const ChanCount in_offset = in_out_physical
1537 ? ChanCount::max(existing_inputs, existing_outputs)
1540 const ChanCount out_offset = in_out_physical
1541 ? ChanCount::max(existing_inputs, existing_outputs)
1544 static string empty_string;
1545 string& port = empty_string;
1547 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1548 vector<string> physinputs;
1549 vector<string> physoutputs;
1551 _engine.get_physical_outputs (*t, physoutputs);
1552 _engine.get_physical_inputs (*t, physinputs);
1554 if (!physinputs.empty()) {
1555 uint32_t nphysical_in = physinputs.size();
1556 for (uint32_t i = 0; i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1557 port = empty_string;
1559 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1560 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1563 if (!port.empty() && route->input()->connect (
1564 route->input()->ports().port(*t, i), port, this)) {
1570 if (!physoutputs.empty()) {
1571 uint32_t nphysical_out = physoutputs.size();
1572 for (uint32_t i = 0; i < route->n_outputs().get(*t); ++i) {
1573 port = empty_string;
1575 if (Config->get_output_auto_connect() & AutoConnectPhysical) {
1576 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1577 } else if (Config->get_output_auto_connect() & AutoConnectMaster) {
1578 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1579 port = _master_out->input()->ports().port(*t,
1580 i % _master_out->input()->n_ports().get(*t))->name();
1584 if (!port.empty() && route->output()->connect (
1585 route->output()->ports().port(*t, i), port, this)) {
1592 existing_inputs += route->n_inputs();
1593 existing_outputs += route->n_outputs();
1596 list< boost::shared_ptr<AudioTrack> >
1597 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group, uint32_t how_many)
1599 char track_name[32];
1600 uint32_t track_id = 0;
1601 ChanCount existing_inputs;
1602 ChanCount existing_outputs;
1604 RouteList new_routes;
1605 list<boost::shared_ptr<AudioTrack> > ret;
1606 uint32_t control_id;
1608 count_existing_route_channels (existing_inputs, existing_outputs);
1610 control_id = ntracks() + nbusses() + 1;
1613 if (!find_route_name ("Audio", ++track_id, track_name, sizeof(track_name))) {
1614 error << "cannot find name for new audio track" << endmsg;
1618 shared_ptr<AudioTrack> track;
1621 AudioTrack* at = new AudioTrack (*this, track_name, Route::Flag (0), mode);
1628 at->use_new_diskstream();
1630 boost_debug_shared_ptr_mark_interesting (at, "Track");
1631 track = boost::shared_ptr<AudioTrack>(at);
1633 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1634 error << string_compose (
1635 _("cannot configure %1 in/%2 out configuration for new audio track"),
1636 input_channels, output_channels)
1641 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1642 error << string_compose (
1643 _("cannot configure %1 in/%2 out configuration for new audio track"),
1644 input_channels, output_channels)
1649 auto_connect_route (track, existing_inputs, existing_outputs);
1652 route_group->add (track);
1655 track->non_realtime_input_change();
1657 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1658 track->set_remote_control_id (control_id);
1661 new_routes.push_back (track);
1662 ret.push_back (track);
1665 catch (failed_constructor &err) {
1666 error << _("Session: could not create new audio track.") << endmsg;
1670 catch (AudioEngine::PortRegistrationFailure& pfe) {
1672 error << pfe.what() << endmsg;
1680 if (!new_routes.empty()) {
1681 add_routes (new_routes, true);
1688 Session::set_remote_control_ids ()
1690 RemoteModel m = Config->get_remote_model();
1691 bool emit_signal = false;
1693 shared_ptr<RouteList> r = routes.reader ();
1695 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1696 if (MixerOrdered == m) {
1697 long order = (*i)->order_key(N_("signal"));
1698 (*i)->set_remote_control_id (order+1, false);
1700 } else if (EditorOrdered == m) {
1701 long order = (*i)->order_key(N_("editor"));
1702 (*i)->set_remote_control_id (order+1, false);
1704 } else if (UserOrdered == m) {
1705 //do nothing ... only changes to remote id's are initiated by user
1710 Route::RemoteControlIDChange();
1716 Session::new_audio_route (bool aux, int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many)
1719 uint32_t bus_id = 0;
1720 ChanCount existing_inputs;
1721 ChanCount existing_outputs;
1724 uint32_t control_id;
1726 count_existing_route_channels (existing_inputs, existing_outputs);
1728 control_id = ntracks() + nbusses() + 1;
1731 if (!find_route_name ("Bus", ++bus_id, bus_name, sizeof(bus_name))) {
1732 error << "cannot find name for new audio bus" << endmsg;
1737 Route* rt = new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO);
1744 boost_debug_shared_ptr_mark_interesting (rt, "Route");
1745 shared_ptr<Route> bus (rt);
1747 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1748 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1749 input_channels, output_channels)
1755 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1756 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1757 input_channels, output_channels)
1762 auto_connect_route (bus, existing_inputs, existing_outputs);
1765 route_group->add (bus);
1767 bus->set_remote_control_id (control_id);
1771 bus->add_internal_return ();
1774 ret.push_back (bus);
1778 catch (failed_constructor &err) {
1779 error << _("Session: could not create new audio route.") << endmsg;
1783 catch (AudioEngine::PortRegistrationFailure& pfe) {
1784 error << pfe.what() << endmsg;
1794 add_routes (ret, true);
1802 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
1806 uint32_t control_id;
1808 uint32_t number = 0;
1810 if (!tree.read (template_path.c_str())) {
1814 XMLNode* node = tree.root();
1816 control_id = ntracks() + nbusses() + 1;
1820 XMLNode node_copy (*node); // make a copy so we can change the name if we need to
1822 std::string node_name = IO::name_from_state (*node_copy.children().front());
1824 /* generate a new name by adding a number to the end of the template name */
1825 if (!find_route_name (node_name.c_str(), ++number, name, sizeof(name))) {
1826 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
1830 /* set IO children to use the new name */
1831 XMLNodeList const & children = node_copy.children ();
1832 for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
1833 if ((*i)->name() == IO::state_node_name) {
1834 IO::set_name_in_state (**i, name);
1838 Track::zero_diskstream_id_in_xml (node_copy);
1841 shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
1844 error << _("Session: cannot create track/bus from template description") << endmsg;
1848 if (boost::dynamic_pointer_cast<Track>(route)) {
1849 /* force input/output change signals so that the new diskstream
1850 picks up the configuration of the route. During session
1851 loading this normally happens in a different way.
1853 route->input()->changed (IOChange (ConfigurationChanged|ConnectionsChanged), this);
1854 route->output()->changed (IOChange (ConfigurationChanged|ConnectionsChanged), this);
1857 route->set_remote_control_id (control_id);
1860 ret.push_back (route);
1863 catch (failed_constructor &err) {
1864 error << _("Session: could not create new route from template") << endmsg;
1868 catch (AudioEngine::PortRegistrationFailure& pfe) {
1869 error << pfe.what() << endmsg;
1878 add_routes (ret, true);
1885 Session::add_routes (RouteList& new_routes, bool save)
1888 RCUWriter<RouteList> writer (routes);
1889 shared_ptr<RouteList> r = writer.get_copy ();
1890 r->insert (r->end(), new_routes.begin(), new_routes.end());
1893 /* if there is no control out and we're not in the middle of loading,
1894 resort the graph here. if there is a control out, we will resort
1895 toward the end of this method. if we are in the middle of loading,
1896 we will resort when done.
1899 if (!_monitor_out && IO::connecting_legal) {
1900 resort_routes_using (r);
1904 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
1906 boost::weak_ptr<Route> wpr (*x);
1907 boost::shared_ptr<Route> r (*x);
1909 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
1910 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
1911 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
1912 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
1913 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
1914 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
1915 r->route_group_changed.connect_same_thread (*this, boost::bind (&Session::route_group_changed, this));
1917 if (r->is_master()) {
1921 if (r->is_monitor()) {
1925 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
1927 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
1928 track_playlist_changed (boost::weak_ptr<Track> (tr));
1929 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
1933 if (_monitor_out && IO::connecting_legal) {
1935 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
1936 if ((*x)->is_monitor()) {
1938 } else if ((*x)->is_master()) {
1941 (*x)->listen_via (_monitor_out,
1942 (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader),
1953 save_state (_current_snapshot_name);
1956 RouteAdded (new_routes); /* EMIT SIGNAL */
1957 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
1961 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
1963 boost::shared_ptr<RouteList> r = routes.reader ();
1964 boost::shared_ptr<Send> s;
1968 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1969 if (boost::dynamic_pointer_cast<Track>(*i)) {
1970 if ((s = (*i)->internal_send_for (dest)) != 0) {
1971 s->amp()->gain_control()->set_value (0.0);
1978 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
1980 boost::shared_ptr<RouteList> r = routes.reader ();
1981 boost::shared_ptr<Send> s;
1985 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1986 if (boost::dynamic_pointer_cast<Track>(*i)) {
1987 if ((s = (*i)->internal_send_for (dest)) != 0) {
1988 s->amp()->gain_control()->set_value (1.0);
1995 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
1997 boost::shared_ptr<RouteList> r = routes.reader ();
1998 boost::shared_ptr<Send> s;
2002 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2003 if (boost::dynamic_pointer_cast<Track>(*i)) {
2004 if ((s = (*i)->internal_send_for (dest)) != 0) {
2005 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2012 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p)
2014 boost::shared_ptr<RouteList> r = routes.reader ();
2015 boost::shared_ptr<RouteList> t (new RouteList);
2017 /* only send tracks */
2019 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2020 if (boost::dynamic_pointer_cast<Track>(*i)) {
2025 add_internal_sends (dest, p, t);
2029 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2031 if (dest->is_monitor() || dest->is_master()) {
2035 if (!dest->internal_return()) {
2036 dest->add_internal_return();
2039 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2041 if ((*i)->is_monitor() || (*i)->is_master() || (*i) == dest) {
2045 (*i)->listen_via (dest, p, true, true);
2052 Session::remove_route (shared_ptr<Route> route)
2055 RCUWriter<RouteList> writer (routes);
2056 shared_ptr<RouteList> rs = writer.get_copy ();
2060 /* deleting the master out seems like a dumb
2061 idea, but its more of a UI policy issue
2065 if (route == _master_out) {
2066 _master_out = shared_ptr<Route> ();
2069 if (route == _monitor_out) {
2071 /* cancel control outs for all routes */
2073 for (RouteList::iterator r = rs->begin(); r != rs->end(); ++r) {
2074 (*r)->drop_listen (_monitor_out);
2077 _monitor_out.reset ();
2080 /* writer goes out of scope, forces route list update */
2083 update_route_solo_state ();
2084 update_session_range_location_marker ();
2086 // We need to disconnect the route's inputs and outputs
2088 route->input()->disconnect (0);
2089 route->output()->disconnect (0);
2091 /* if the route had internal sends sending to it, remove them */
2092 if (route->internal_return()) {
2094 boost::shared_ptr<RouteList> r = routes.reader ();
2095 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2096 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2098 (*i)->remove_processor (s);
2103 update_latency_compensation (false, false);
2106 /* get rid of it from the dead wood collection in the route list manager */
2108 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2112 /* try to cause everyone to drop their references */
2114 route->drop_references ();
2116 sync_order_keys (N_("session"));
2118 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2120 /* save the new state of the world */
2122 if (save_state (_current_snapshot_name)) {
2123 save_history (_current_snapshot_name);
2128 Session::route_mute_changed (void* /*src*/)
2134 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2136 boost::shared_ptr<Route> route = wpr.lock();
2138 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2142 if (route->listening()) {
2144 if (Config->get_exclusive_solo()) {
2145 /* new listen: disable all other listen */
2146 shared_ptr<RouteList> r = routes.reader ();
2147 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2148 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2151 (*i)->set_listen (false, this);
2157 } else if (_listen_cnt > 0) {
2163 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2165 boost::shared_ptr<Route> route = wpr.lock ();
2168 /* should not happen */
2169 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2173 bool send_changed = false;
2175 if (route->solo_isolated()) {
2176 if (_solo_isolated_cnt == 0) {
2177 send_changed = true;
2179 _solo_isolated_cnt++;
2180 } else if (_solo_isolated_cnt > 0) {
2181 _solo_isolated_cnt--;
2182 if (_solo_isolated_cnt == 0) {
2183 send_changed = true;
2188 IsolatedChanged (); /* EMIT SIGNAL */
2193 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2195 if (!self_solo_change) {
2196 // session doesn't care about changes to soloed-by-others
2200 if (solo_update_disabled) {
2205 boost::shared_ptr<Route> route = wpr.lock ();
2208 /* should not happen */
2209 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2213 shared_ptr<RouteList> r = routes.reader ();
2216 if (route->self_soloed()) {
2222 if (delta == 1 && Config->get_exclusive_solo()) {
2223 /* new solo: disable all other solos */
2224 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2225 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2228 (*i)->set_solo (false, this);
2232 solo_update_disabled = true;
2234 RouteList uninvolved;
2236 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2237 bool via_sends_only;
2238 bool in_signal_flow;
2240 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2244 in_signal_flow = false;
2246 if ((*i)->feeds (route, &via_sends_only)) {
2247 if (!via_sends_only) {
2248 if (!route->soloed_by_others_upstream()) {
2249 (*i)->mod_solo_by_others_downstream (delta);
2251 in_signal_flow = true;
2255 if (route->feeds (*i, &via_sends_only)) {
2256 (*i)->mod_solo_by_others_upstream (delta);
2257 in_signal_flow = true;
2260 if (!in_signal_flow) {
2261 uninvolved.push_back (*i);
2265 solo_update_disabled = false;
2266 update_route_solo_state (r);
2268 /* now notify that the mute state of the routes not involved in the signal
2269 pathway of the just-solo-changed route may have altered.
2272 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2273 (*i)->mute_changed (this);
2276 SoloChanged (); /* EMIT SIGNAL */
2281 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2283 /* now figure out if anything that matters is soloed (or is "listening")*/
2285 bool something_soloed = false;
2286 uint32_t listeners = 0;
2287 uint32_t isolated = 0;
2290 r = routes.reader();
2293 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2294 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2295 something_soloed = true;
2298 if (!(*i)->is_hidden() && (*i)->listening()) {
2299 if (Config->get_solo_control_is_listen_control()) {
2302 (*i)->set_listen (false, this);
2306 if ((*i)->solo_isolated()) {
2311 if (something_soloed != _non_soloed_outs_muted) {
2312 _non_soloed_outs_muted = something_soloed;
2313 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2316 _listen_cnt = listeners;
2318 if (isolated != _solo_isolated_cnt) {
2319 _solo_isolated_cnt = isolated;
2320 IsolatedChanged (); /* EMIT SIGNAL */
2324 boost::shared_ptr<RouteList>
2325 Session::get_routes_with_internal_returns() const
2327 shared_ptr<RouteList> r = routes.reader ();
2328 boost::shared_ptr<RouteList> rl (new RouteList);
2330 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2331 if ((*i)->internal_return ()) {
2339 Session::io_name_is_legal (const std::string& name)
2341 shared_ptr<RouteList> r = routes.reader ();
2343 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2344 if ((*i)->name() == name) {
2348 if ((*i)->has_io_processor_named (name)) {
2357 Session::route_by_name (string name)
2359 shared_ptr<RouteList> r = routes.reader ();
2361 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2362 if ((*i)->name() == name) {
2367 return shared_ptr<Route> ((Route*) 0);
2371 Session::route_by_id (PBD::ID id)
2373 shared_ptr<RouteList> r = routes.reader ();
2375 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2376 if ((*i)->id() == id) {
2381 return shared_ptr<Route> ((Route*) 0);
2385 Session::route_by_remote_id (uint32_t id)
2387 shared_ptr<RouteList> r = routes.reader ();
2389 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2390 if ((*i)->remote_control_id() == id) {
2395 return shared_ptr<Route> ((Route*) 0);
2398 /** If either end of the session range location marker lies inside the current
2399 * session extent, move it to the corresponding session extent.
2402 Session::update_session_range_location_marker ()
2404 if (_state_of_the_state & Loading) {
2408 pair<nframes_t, nframes_t> const ext = get_extent ();
2410 if (_session_range_location == 0) {
2411 /* we don't have a session range yet; use this one (provided it is valid) */
2412 if (ext.first != max_frames) {
2413 add_session_range_location (ext.first, ext.second);
2416 /* update the existing session range */
2417 if (ext.first < _session_range_location->start()) {
2418 _session_range_location->set_start (ext.first);
2422 if (ext.second > _session_range_location->end()) {
2423 _session_range_location->set_end (ext.second);
2430 /** @return Extent of the session's contents; if the session is empty, the first value of
2431 * the pair will equal max_frames.
2433 pair<nframes_t, nframes_t>
2434 Session::get_extent () const
2436 pair<nframes_t, nframes_t> ext (max_frames, 0);
2438 boost::shared_ptr<RouteList> rl = routes.reader ();
2439 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2440 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2441 if (!tr || tr->destructive()) {
2442 // ignore tape tracks when getting extents
2446 pair<nframes_t, nframes_t> e = tr->playlist()->get_extent ();
2447 if (e.first < ext.first) {
2448 ext.first = e.first;
2450 if (e.second > ext.second) {
2451 ext.second = e.second;
2458 /* Region management */
2460 boost::shared_ptr<Region>
2461 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2463 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2464 RegionFactory::RegionMap::const_iterator i;
2465 boost::shared_ptr<Region> region;
2467 Glib::Mutex::Lock lm (region_lock);
2469 for (i = regions.begin(); i != regions.end(); ++i) {
2473 if (region->whole_file()) {
2475 if (child->source_equivalent (region)) {
2481 return boost::shared_ptr<Region> ();
2485 Session::destroy_region (boost::shared_ptr<Region> region)
2487 vector<boost::shared_ptr<Source> > srcs;
2490 if (region->playlist()) {
2491 region->playlist()->destroy_region (region);
2494 for (uint32_t n = 0; n < region->n_channels(); ++n) {
2495 srcs.push_back (region->source (n));
2499 region->drop_references ();
2501 for (vector<boost::shared_ptr<Source> >::iterator i = srcs.begin(); i != srcs.end(); ++i) {
2503 (*i)->mark_for_remove ();
2504 (*i)->drop_references ();
2506 cerr << "source was not used by any playlist\n";
2513 Session::destroy_regions (list<boost::shared_ptr<Region> > regions)
2515 for (list<boost::shared_ptr<Region> >::iterator i = regions.begin(); i != regions.end(); ++i) {
2516 destroy_region (*i);
2522 Session::remove_last_capture ()
2524 list<boost::shared_ptr<Region> > r;
2526 boost::shared_ptr<RouteList> rl = routes.reader ();
2527 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2528 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2533 list<boost::shared_ptr<Region> >& l = tr->last_capture_regions();
2536 r.insert (r.end(), l.begin(), l.end());
2541 destroy_regions (r);
2543 save_state (_current_snapshot_name);
2548 /* Source Management */
2551 Session::add_source (boost::shared_ptr<Source> source)
2553 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2554 pair<SourceMap::iterator,bool> result;
2556 entry.first = source->id();
2557 entry.second = source;
2560 Glib::Mutex::Lock lm (source_lock);
2561 result = sources.insert (entry);
2564 if (result.second) {
2568 boost::shared_ptr<AudioFileSource> afs;
2570 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2571 if (Config->get_auto_analyse_audio()) {
2572 Analyser::queue_source_for_analysis (source, false);
2578 Session::remove_source (boost::weak_ptr<Source> src)
2580 SourceMap::iterator i;
2581 boost::shared_ptr<Source> source = src.lock();
2588 Glib::Mutex::Lock lm (source_lock);
2590 if ((i = sources.find (source->id())) != sources.end()) {
2595 if (!_state_of_the_state & InCleanup) {
2597 /* save state so we don't end up with a session file
2598 referring to non-existent sources.
2601 save_state (_current_snapshot_name);
2605 boost::shared_ptr<Source>
2606 Session::source_by_id (const PBD::ID& id)
2608 Glib::Mutex::Lock lm (source_lock);
2609 SourceMap::iterator i;
2610 boost::shared_ptr<Source> source;
2612 if ((i = sources.find (id)) != sources.end()) {
2619 boost::shared_ptr<Source>
2620 Session::source_by_path_and_channel (const Glib::ustring& path, uint16_t chn)
2622 Glib::Mutex::Lock lm (source_lock);
2624 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2625 cerr << "comparing " << path << " with " << i->second->name() << endl;
2626 boost::shared_ptr<AudioFileSource> afs
2627 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
2629 if (afs && afs->path() == path && chn == afs->channel()) {
2633 return boost::shared_ptr<Source>();
2638 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
2641 string old_basename = PBD::basename_nosuffix (oldname);
2642 string new_legalized = legalize_for_path (newname);
2644 /* note: we know (or assume) the old path is already valid */
2648 /* destructive file sources have a name of the form:
2650 /path/to/Tnnnn-NAME(%[LR])?.wav
2652 the task here is to replace NAME with the new name.
2655 /* find last slash */
2659 string::size_type slash;
2660 string::size_type dash;
2662 if ((slash = path.find_last_of ('/')) == string::npos) {
2666 dir = path.substr (0, slash+1);
2668 /* '-' is not a legal character for the NAME part of the path */
2670 if ((dash = path.find_last_of ('-')) == string::npos) {
2674 prefix = path.substr (slash+1, dash-(slash+1));
2679 path += new_legalized;
2680 path += ".wav"; /* XXX gag me with a spoon */
2684 /* non-destructive file sources have a name of the form:
2686 /path/to/NAME-nnnnn(%[LR])?.ext
2688 the task here is to replace NAME with the new name.
2693 string::size_type slash;
2694 string::size_type dash;
2695 string::size_type postfix;
2697 /* find last slash */
2699 if ((slash = path.find_last_of ('/')) == string::npos) {
2703 dir = path.substr (0, slash+1);
2705 /* '-' is not a legal character for the NAME part of the path */
2707 if ((dash = path.find_last_of ('-')) == string::npos) {
2711 suffix = path.substr (dash+1);
2713 // Suffix is now everything after the dash. Now we need to eliminate
2714 // the nnnnn part, which is done by either finding a '%' or a '.'
2716 postfix = suffix.find_last_of ("%");
2717 if (postfix == string::npos) {
2718 postfix = suffix.find_last_of ('.');
2721 if (postfix != string::npos) {
2722 suffix = suffix.substr (postfix);
2724 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
2728 const uint32_t limit = 10000;
2729 char buf[PATH_MAX+1];
2731 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
2733 snprintf (buf, sizeof(buf), "%s%s-%u%s", dir.c_str(), newname.c_str(), cnt, suffix.c_str());
2735 if (access (buf, F_OK) != 0) {
2743 error << "FATAL ERROR! Could not find a " << endl;
2751 /** Return the full path (in some session directory) for a new within-session source.
2752 * \a name must be a session-unique name that does not contain slashes
2753 * (e.g. as returned by new_*_source_name)
2756 Session::new_source_path_from_name (DataType type, const string& name)
2758 assert(name.find("/") == string::npos);
2760 SessionDirectory sdir(get_best_session_directory_for_new_source());
2763 if (type == DataType::AUDIO) {
2764 p = sdir.sound_path();
2765 } else if (type == DataType::MIDI) {
2766 p = sdir.midi_path();
2768 error << "Unknown source type, unable to create file path" << endmsg;
2773 return p.to_string();
2777 Session::peak_path (Glib::ustring base) const
2779 sys::path peakfile_path(_session_dir->peak_path());
2780 peakfile_path /= basename_nosuffix (base) + peakfile_suffix;
2781 return peakfile_path.to_string();
2784 /** Return a unique name based on \a base for a new internal audio source */
2786 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
2790 char buf[PATH_MAX+1];
2791 const uint32_t limit = 10000;
2795 legalized = legalize_for_path (base);
2797 // Find a "version" of the base name that doesn't exist in any of the possible directories.
2798 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
2800 vector<space_and_path>::iterator i;
2801 uint32_t existing = 0;
2803 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2805 SessionDirectory sdir((*i).path);
2807 spath = sdir.sound_path().to_string();
2812 snprintf (buf, sizeof(buf), "%s/T%04d-%s.wav",
2813 spath.c_str(), cnt, legalized.c_str());
2814 } else if (nchan == 2) {
2816 snprintf (buf, sizeof(buf), "%s/T%04d-%s%%L.wav",
2817 spath.c_str(), cnt, legalized.c_str());
2819 snprintf (buf, sizeof(buf), "%s/T%04d-%s%%R.wav",
2820 spath.c_str(), cnt, legalized.c_str());
2822 } else if (nchan < 26) {
2823 snprintf (buf, sizeof(buf), "%s/T%04d-%s%%%c.wav",
2824 spath.c_str(), cnt, legalized.c_str(), 'a' + chan);
2826 snprintf (buf, sizeof(buf), "%s/T%04d-%s.wav",
2827 spath.c_str(), cnt, legalized.c_str());
2836 snprintf (buf, sizeof(buf), "%s-%u.wav", spath.c_str(), cnt);
2837 } else if (nchan == 2) {
2839 snprintf (buf, sizeof(buf), "%s-%u%%L.wav", spath.c_str(), cnt);
2841 snprintf (buf, sizeof(buf), "%s-%u%%R.wav", spath.c_str(), cnt);
2843 } else if (nchan < 26) {
2844 snprintf (buf, sizeof(buf), "%s-%u%%%c.wav", spath.c_str(), cnt, 'a' + chan);
2846 snprintf (buf, sizeof(buf), "%s-%u.wav", spath.c_str(), cnt);
2850 if (sys::exists(buf)) {
2856 if (existing == 0) {
2861 error << string_compose(
2862 _("There are already %1 recordings for %2, which I consider too many."),
2863 limit, base) << endmsg;
2865 throw failed_constructor();
2869 return Glib::path_get_basename(buf);
2872 /** Create a new within-session audio source */
2873 boost::shared_ptr<AudioFileSource>
2874 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
2876 const string name = new_audio_source_name (n, n_chans, chan, destructive);
2877 const string path = new_source_path_from_name(DataType::AUDIO, name);
2879 return boost::dynamic_pointer_cast<AudioFileSource> (
2880 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
2883 /** Return a unique name based on \a base for a new internal MIDI source */
2885 Session::new_midi_source_name (const string& base)
2888 char buf[PATH_MAX+1];
2889 const uint32_t limit = 10000;
2893 legalized = legalize_for_path (base);
2895 // Find a "version" of the file name that doesn't exist in any of the possible directories.
2896 for (cnt = 1; cnt <= limit; ++cnt) {
2898 vector<space_and_path>::iterator i;
2899 uint32_t existing = 0;
2901 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2903 SessionDirectory sdir((*i).path);
2905 sys::path p = sdir.midi_path();
2908 snprintf (buf, sizeof(buf), "%s-%u.mid", p.to_string().c_str(), cnt);
2910 if (sys::exists (buf)) {
2915 if (existing == 0) {
2920 error << string_compose(
2921 _("There are already %1 recordings for %2, which I consider too many."),
2922 limit, base) << endmsg;
2924 throw failed_constructor();
2928 return Glib::path_get_basename(buf);
2932 /** Create a new within-session MIDI source */
2933 boost::shared_ptr<MidiSource>
2934 Session::create_midi_source_for_session (string const & n)
2936 const string name = new_midi_source_name (n);
2937 const string path = new_source_path_from_name (DataType::MIDI, name);
2939 return boost::dynamic_pointer_cast<SMFSource> (
2940 SourceFactory::createWritable (
2941 DataType::MIDI, *this, path, false, frame_rate()));
2946 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
2948 if (playlist->hidden()) {
2952 playlists->add (playlist);
2955 playlist->release();
2962 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
2964 if (_state_of_the_state & Deletion) {
2968 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
2974 playlists->remove (playlist);
2980 Session::set_audition (boost::shared_ptr<Region> r)
2982 pending_audition_region = r;
2983 add_post_transport_work (PostTransportAudition);
2984 _butler->schedule_transport_work ();
2988 Session::audition_playlist ()
2990 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
2991 ev->region.reset ();
2996 Session::non_realtime_set_audition ()
2998 if (!pending_audition_region) {
2999 auditioner->audition_current_playlist ();
3001 auditioner->audition_region (pending_audition_region);
3002 pending_audition_region.reset ();
3004 AuditionActive (true); /* EMIT SIGNAL */
3008 Session::audition_region (boost::shared_ptr<Region> r)
3010 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3016 Session::cancel_audition ()
3018 if (auditioner->auditioning()) {
3019 auditioner->cancel_audition ();
3020 AuditionActive (false); /* EMIT SIGNAL */
3025 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3027 if (a->is_monitor()) {
3030 if (b->is_monitor()) {
3033 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3037 Session::remove_empty_sounds ()
3039 vector<string> audio_filenames;
3041 get_files_in_directory (_session_dir->sound_path(), audio_filenames);
3043 Glib::Mutex::Lock lm (source_lock);
3045 TapeFileMatcher tape_file_matcher;
3047 remove_if (audio_filenames.begin(), audio_filenames.end(),
3048 boost::bind (&TapeFileMatcher::matches, &tape_file_matcher, _1));
3050 for (vector<string>::iterator i = audio_filenames.begin(); i != audio_filenames.end(); ++i) {
3052 sys::path audio_file_path (_session_dir->sound_path());
3054 audio_file_path /= *i;
3056 if (AudioFileSource::is_empty (*this, audio_file_path.to_string())) {
3060 sys::remove (audio_file_path);
3061 const string peakfile = peak_path (audio_file_path.to_string());
3062 sys::remove (peakfile);
3064 catch (const sys::filesystem_error& err)
3066 error << err.what() << endmsg;
3073 Session::is_auditioning () const
3075 /* can be called before we have an auditioner object */
3077 return auditioner->auditioning();
3084 Session::graph_reordered ()
3086 /* don't do this stuff if we are setting up connections
3087 from a set_state() call or creating new tracks. Ditto for deletion.
3090 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3094 /* every track/bus asked for this to be handled but it was deferred because
3095 we were connecting. do it now.
3098 request_input_change_handling ();
3102 /* force all diskstreams to update their capture offset values to
3103 reflect any changes in latencies within the graph.
3106 boost::shared_ptr<RouteList> rl = routes.reader ();
3107 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3108 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3110 tr->set_capture_offset ();
3116 Session::available_capture_duration ()
3118 float sample_bytes_on_disk = 4.0; // keep gcc happy
3120 switch (config.get_native_file_data_format()) {
3122 sample_bytes_on_disk = 4.0;
3126 sample_bytes_on_disk = 3.0;
3130 sample_bytes_on_disk = 2.0;
3134 /* impossible, but keep some gcc versions happy */
3135 fatal << string_compose (_("programming error: %1"),
3136 X_("illegal native file data format"))
3141 double scale = 4096.0 / sample_bytes_on_disk;
3143 if (_total_free_4k_blocks * scale > (double) max_frames) {
3147 return (nframes_t) floor (_total_free_4k_blocks * scale);
3151 Session::add_bundle (shared_ptr<Bundle> bundle)
3154 RCUWriter<BundleList> writer (_bundles);
3155 boost::shared_ptr<BundleList> b = writer.get_copy ();
3156 b->push_back (bundle);
3159 BundleAdded (bundle); /* EMIT SIGNAL */
3165 Session::remove_bundle (shared_ptr<Bundle> bundle)
3167 bool removed = false;
3170 RCUWriter<BundleList> writer (_bundles);
3171 boost::shared_ptr<BundleList> b = writer.get_copy ();
3172 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3174 if (i != b->end()) {
3181 BundleRemoved (bundle); /* EMIT SIGNAL */
3188 Session::bundle_by_name (string name) const
3190 boost::shared_ptr<BundleList> b = _bundles.reader ();
3192 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3193 if ((*i)->name() == name) {
3198 return boost::shared_ptr<Bundle> ();
3202 Session::tempo_map_changed (const PropertyChange&)
3206 playlists->update_after_tempo_map_change ();
3211 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3212 * the given count with the current block size.
3215 Session::ensure_buffers (ChanCount howmany)
3217 BufferManager::ensure_buffers (howmany);
3221 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3223 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3224 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3229 Session::next_insert_id ()
3231 /* this doesn't really loop forever. just think about it */
3234 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3235 if (!insert_bitset[n]) {
3236 insert_bitset[n] = true;
3242 /* none available, so resize and try again */
3244 insert_bitset.resize (insert_bitset.size() + 16, false);
3249 Session::next_send_id ()
3251 /* this doesn't really loop forever. just think about it */
3254 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3255 if (!send_bitset[n]) {
3256 send_bitset[n] = true;
3262 /* none available, so resize and try again */
3264 send_bitset.resize (send_bitset.size() + 16, false);
3269 Session::next_return_id ()
3271 /* this doesn't really loop forever. just think about it */
3274 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3275 if (!return_bitset[n]) {
3276 return_bitset[n] = true;
3282 /* none available, so resize and try again */
3284 return_bitset.resize (return_bitset.size() + 16, false);
3289 Session::mark_send_id (uint32_t id)
3291 if (id >= send_bitset.size()) {
3292 send_bitset.resize (id+16, false);
3294 if (send_bitset[id]) {
3295 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3297 send_bitset[id] = true;
3301 Session::mark_return_id (uint32_t id)
3303 if (id >= return_bitset.size()) {
3304 return_bitset.resize (id+16, false);
3306 if (return_bitset[id]) {
3307 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3309 return_bitset[id] = true;
3313 Session::mark_insert_id (uint32_t id)
3315 if (id >= insert_bitset.size()) {
3316 insert_bitset.resize (id+16, false);
3318 if (insert_bitset[id]) {
3319 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3321 insert_bitset[id] = true;
3325 Session::unmark_send_id (uint32_t id)
3327 if (id < send_bitset.size()) {
3328 send_bitset[id] = false;
3333 Session::unmark_return_id (uint32_t id)
3335 if (id < return_bitset.size()) {
3336 return_bitset[id] = false;
3341 Session::unmark_insert_id (uint32_t id)
3343 if (id < insert_bitset.size()) {
3344 insert_bitset[id] = false;
3349 /* Named Selection management */
3351 boost::shared_ptr<NamedSelection>
3352 Session::named_selection_by_name (string name)
3354 Glib::Mutex::Lock lm (named_selection_lock);
3355 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3356 if ((*i)->name == name) {
3360 return boost::shared_ptr<NamedSelection>();
3364 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3367 Glib::Mutex::Lock lm (named_selection_lock);
3368 named_selections.insert (named_selections.begin(), named_selection);
3373 NamedSelectionAdded (); /* EMIT SIGNAL */
3377 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3379 bool removed = false;
3382 Glib::Mutex::Lock lm (named_selection_lock);
3384 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3386 if (i != named_selections.end()) {
3387 named_selections.erase (i);
3394 NamedSelectionRemoved (); /* EMIT SIGNAL */
3399 Session::reset_native_file_format ()
3401 boost::shared_ptr<RouteList> rl = routes.reader ();
3402 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3403 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3405 tr->reset_write_sources (false);
3411 Session::route_name_unique (string n) const
3413 shared_ptr<RouteList> r = routes.reader ();
3415 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3416 if ((*i)->name() == n) {
3425 Session::route_name_internal (string n) const
3427 if (auditioner && auditioner->name() == n) {
3431 if (_click_io && _click_io->name() == n) {
3439 Session::freeze_all (InterThreadInfo& itt)
3441 shared_ptr<RouteList> r = routes.reader ();
3443 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3445 boost::shared_ptr<Track> t;
3447 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3448 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3458 boost::shared_ptr<Region>
3459 Session::write_one_track (AudioTrack& track, nframes_t start, nframes_t end,
3460 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3461 InterThreadInfo& itt, bool enable_processing)
3463 boost::shared_ptr<Region> result;
3464 boost::shared_ptr<Playlist> playlist;
3465 boost::shared_ptr<AudioFileSource> fsource;
3467 char buf[PATH_MAX+1];
3468 ChanCount nchans(track.n_channels());
3470 nframes_t this_chunk;
3473 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3474 const string sound_dir = sdir.sound_path().to_string();
3475 nframes_t len = end - start;
3478 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3479 end, start) << endmsg;
3483 const nframes_t chunk_size = (256 * 1024)/4;
3485 // block all process callback handling
3487 block_processing ();
3489 /* call tree *MUST* hold route_lock */
3491 if ((playlist = track.playlist()) == 0) {
3495 /* external redirects will be a problem */
3497 if (track.has_external_redirects()) {
3501 for (uint32_t chan_n=0; chan_n < nchans.n_audio(); ++chan_n) {
3503 for (x = 0; x < 99999; ++x) {
3504 snprintf (buf, sizeof(buf), "%s/%s-%d-bounce-%" PRIu32 ".wav", sound_dir.c_str(), playlist->name().c_str(), chan_n, x+1);
3505 if (access (buf, F_OK) != 0) {
3511 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3516 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3517 SourceFactory::createWritable (DataType::AUDIO, *this, buf, false, frame_rate()));
3520 catch (failed_constructor& err) {
3521 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3525 srcs.push_back (fsource);
3528 /* XXX need to flush all redirects */
3533 /* create a set of reasonably-sized buffers */
3534 buffers.ensure_buffers(DataType::AUDIO, nchans.n_audio(), chunk_size);
3535 buffers.set_count(nchans);
3537 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3538 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3540 afs->prepare_for_peakfile_writes ();
3543 while (to_do && !itt.cancel) {
3545 this_chunk = min (to_do, chunk_size);
3547 if (track.export_stuff (buffers, start, this_chunk, enable_processing)) {
3552 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
3553 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3556 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
3562 start += this_chunk;
3563 to_do -= this_chunk;
3565 itt.progress = (float) (1.0 - ((double) to_do / len));
3574 xnow = localtime (&now);
3576 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3577 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3580 afs->update_header (position, *xnow, now);
3581 afs->flush_header ();
3585 /* construct a region to represent the bounced material */
3589 plist.add (Properties::start, 0);
3590 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
3591 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
3593 result = RegionFactory::create (srcs, plist);
3599 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3600 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3603 afs->mark_for_remove ();
3606 (*src)->drop_references ();
3610 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3611 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3614 afs->done_with_peakfile_writes ();
3618 unblock_processing ();
3624 Session::gain_automation_buffer() const
3626 return ProcessThread::gain_automation_buffer ();
3630 Session::pan_automation_buffer() const
3632 return ProcessThread::pan_automation_buffer ();
3636 Session::get_silent_buffers (ChanCount count)
3638 return ProcessThread::get_silent_buffers (count);
3640 assert(_silent_buffers->available() >= count);
3641 _silent_buffers->set_count(count);
3643 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3644 for (size_t i= 0; i < count.get(*t); ++i) {
3645 _silent_buffers->get(*t, i).clear();
3649 return *_silent_buffers;
3654 Session::get_scratch_buffers (ChanCount count)
3656 return ProcessThread::get_scratch_buffers (count);
3658 if (count != ChanCount::ZERO) {
3659 assert(_scratch_buffers->available() >= count);
3660 _scratch_buffers->set_count(count);
3662 _scratch_buffers->set_count (_scratch_buffers->available());
3665 return *_scratch_buffers;
3670 Session::get_mix_buffers (ChanCount count)
3672 return ProcessThread::get_mix_buffers (count);
3674 assert(_mix_buffers->available() >= count);
3675 _mix_buffers->set_count(count);
3676 return *_mix_buffers;
3681 Session::ntracks () const
3684 shared_ptr<RouteList> r = routes.reader ();
3686 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3687 if (boost::dynamic_pointer_cast<Track> (*i)) {
3696 Session::nbusses () const
3699 shared_ptr<RouteList> r = routes.reader ();
3701 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3702 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
3711 Session::add_automation_list(AutomationList *al)
3713 automation_lists[al->id()] = al;
3717 Session::sync_order_keys (std::string const & base)
3719 if (deletion_in_progress()) {
3723 if (!Config->get_sync_all_route_ordering()) {
3724 /* leave order keys as they are */
3728 boost::shared_ptr<RouteList> r = routes.reader ();
3730 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3731 (*i)->sync_order_keys (base);
3734 Route::SyncOrderKeys (base); // EMIT SIGNAL
3736 /* this might not do anything */
3738 set_remote_control_ids ();
3741 /** @return true if there is at least one record-enabled track, otherwise false */
3743 Session::have_rec_enabled_track () const
3745 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
3748 /** Update the state of our rec-enabled tracks flag */
3750 Session::update_have_rec_enabled_track ()
3752 boost::shared_ptr<RouteList> rl = routes.reader ();
3753 RouteList::iterator i = rl->begin();
3754 while (i != rl->end ()) {
3756 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3757 if (tr && tr->record_enabled ()) {
3764 int const old = g_atomic_int_get (&_have_rec_enabled_track);
3766 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
3768 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
3769 RecordStateChanged (); /* EMIT SIGNAL */
3774 Session::listen_position_changed ()
3778 switch (Config->get_listen_position()) {
3779 case AfterFaderListen:
3783 case PreFaderListen:
3788 boost::shared_ptr<RouteList> r = routes.reader ();
3790 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3791 (*i)->put_monitor_send_at (p);
3796 Session::solo_control_mode_changed ()
3798 /* cancel all solo or all listen when solo control mode changes */
3801 set_solo (get_routes(), false);
3802 } else if (listening()) {
3803 set_listen (get_routes(), false);
3808 Session::route_group_changed ()
3810 RouteGroupChanged (); /* EMIT SIGNAL */
3814 Session::get_available_sync_options () const
3816 vector<SyncSource> ret;
3818 ret.push_back (JACK);
3821 ret.push_back (MTC);
3824 if (midi_clock_port()) {
3825 ret.push_back (MIDIClock);
3831 boost::shared_ptr<RouteList>
3832 Session::get_routes_with_regions_at (nframes64_t const p) const
3834 shared_ptr<RouteList> r = routes.reader ();
3835 shared_ptr<RouteList> rl (new RouteList);
3837 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3838 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3843 boost::shared_ptr<Playlist> pl = tr->playlist ();
3848 if (pl->has_region_at (p)) {
3857 Session::goto_end ()
3859 if (_session_range_location) {
3860 request_locate (_session_range_location->end(), false);
3862 request_locate (0, false);
3867 Session::goto_start ()
3869 if (_session_range_location) {
3870 request_locate (_session_range_location->start(), false);
3872 request_locate (0, false);
3877 Session::set_session_start (nframes_t start)
3879 if (_session_range_location) {
3880 _session_range_location->set_start (start);
3882 add_session_range_location (start, start);
3887 Session::set_session_end (nframes_t end)
3889 if (_session_range_location) {
3890 _session_range_location->set_end (end);
3892 add_session_range_location (end, end);
3897 Session::current_start_frame () const
3899 return _session_range_location ? _session_range_location->start() : 0;
3903 Session::current_end_frame () const
3905 return _session_range_location ? _session_range_location->end() : 0;
3909 Session::add_session_range_location (nframes_t start, nframes_t end)
3911 _session_range_location = new Location (start, end, _("session"), Location::IsSessionRange);
3912 _locations.add (_session_range_location);