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)
2054 if (((route == _master_out) || (route == _monitor_out)) && !Config->get_allow_special_bus_removal()) {
2059 RCUWriter<RouteList> writer (routes);
2060 shared_ptr<RouteList> rs = writer.get_copy ();
2064 /* deleting the master out seems like a dumb
2065 idea, but its more of a UI policy issue
2069 if (route == _master_out) {
2070 _master_out = shared_ptr<Route> ();
2073 if (route == _monitor_out) {
2075 /* cancel control outs for all routes */
2077 for (RouteList::iterator r = rs->begin(); r != rs->end(); ++r) {
2078 (*r)->drop_listen (_monitor_out);
2081 _monitor_out.reset ();
2084 /* writer goes out of scope, forces route list update */
2087 update_route_solo_state ();
2088 update_session_range_location_marker ();
2090 // We need to disconnect the route's inputs and outputs
2092 route->input()->disconnect (0);
2093 route->output()->disconnect (0);
2095 /* if the route had internal sends sending to it, remove them */
2096 if (route->internal_return()) {
2098 boost::shared_ptr<RouteList> r = routes.reader ();
2099 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2100 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2102 (*i)->remove_processor (s);
2107 update_latency_compensation (false, false);
2110 /* get rid of it from the dead wood collection in the route list manager */
2112 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2116 /* try to cause everyone to drop their references */
2118 route->drop_references ();
2120 sync_order_keys (N_("session"));
2122 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2124 /* save the new state of the world */
2126 if (save_state (_current_snapshot_name)) {
2127 save_history (_current_snapshot_name);
2132 Session::route_mute_changed (void* /*src*/)
2138 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2140 boost::shared_ptr<Route> route = wpr.lock();
2142 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2146 if (route->listening()) {
2148 if (Config->get_exclusive_solo()) {
2149 /* new listen: disable all other listen */
2150 shared_ptr<RouteList> r = routes.reader ();
2151 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2152 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2155 (*i)->set_listen (false, this);
2161 } else if (_listen_cnt > 0) {
2167 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2169 boost::shared_ptr<Route> route = wpr.lock ();
2172 /* should not happen */
2173 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2177 bool send_changed = false;
2179 if (route->solo_isolated()) {
2180 if (_solo_isolated_cnt == 0) {
2181 send_changed = true;
2183 _solo_isolated_cnt++;
2184 } else if (_solo_isolated_cnt > 0) {
2185 _solo_isolated_cnt--;
2186 if (_solo_isolated_cnt == 0) {
2187 send_changed = true;
2192 IsolatedChanged (); /* EMIT SIGNAL */
2197 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2199 if (!self_solo_change) {
2200 // session doesn't care about changes to soloed-by-others
2204 if (solo_update_disabled) {
2209 boost::shared_ptr<Route> route = wpr.lock ();
2212 /* should not happen */
2213 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2217 shared_ptr<RouteList> r = routes.reader ();
2220 if (route->self_soloed()) {
2226 if (delta == 1 && Config->get_exclusive_solo()) {
2227 /* new solo: disable all other solos */
2228 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2229 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2232 (*i)->set_solo (false, this);
2236 solo_update_disabled = true;
2238 RouteList uninvolved;
2240 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2241 bool via_sends_only;
2242 bool in_signal_flow;
2244 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2248 in_signal_flow = false;
2250 if ((*i)->feeds (route, &via_sends_only)) {
2251 if (!via_sends_only) {
2252 if (!route->soloed_by_others_upstream()) {
2253 (*i)->mod_solo_by_others_downstream (delta);
2255 in_signal_flow = true;
2259 if (route->feeds (*i, &via_sends_only)) {
2260 (*i)->mod_solo_by_others_upstream (delta);
2261 in_signal_flow = true;
2264 if (!in_signal_flow) {
2265 uninvolved.push_back (*i);
2269 solo_update_disabled = false;
2270 update_route_solo_state (r);
2272 /* now notify that the mute state of the routes not involved in the signal
2273 pathway of the just-solo-changed route may have altered.
2276 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2277 (*i)->mute_changed (this);
2280 SoloChanged (); /* EMIT SIGNAL */
2285 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2287 /* now figure out if anything that matters is soloed (or is "listening")*/
2289 bool something_soloed = false;
2290 uint32_t listeners = 0;
2291 uint32_t isolated = 0;
2294 r = routes.reader();
2297 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2298 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2299 something_soloed = true;
2302 if (!(*i)->is_hidden() && (*i)->listening()) {
2303 if (Config->get_solo_control_is_listen_control()) {
2306 (*i)->set_listen (false, this);
2310 if ((*i)->solo_isolated()) {
2315 if (something_soloed != _non_soloed_outs_muted) {
2316 _non_soloed_outs_muted = something_soloed;
2317 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2320 _listen_cnt = listeners;
2322 if (isolated != _solo_isolated_cnt) {
2323 _solo_isolated_cnt = isolated;
2324 IsolatedChanged (); /* EMIT SIGNAL */
2328 boost::shared_ptr<RouteList>
2329 Session::get_routes_with_internal_returns() const
2331 shared_ptr<RouteList> r = routes.reader ();
2332 boost::shared_ptr<RouteList> rl (new RouteList);
2334 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2335 if ((*i)->internal_return ()) {
2343 Session::io_name_is_legal (const std::string& name)
2345 shared_ptr<RouteList> r = routes.reader ();
2347 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2348 if ((*i)->name() == name) {
2352 if ((*i)->has_io_processor_named (name)) {
2361 Session::route_by_name (string name)
2363 shared_ptr<RouteList> r = routes.reader ();
2365 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2366 if ((*i)->name() == name) {
2371 return shared_ptr<Route> ((Route*) 0);
2375 Session::route_by_id (PBD::ID id)
2377 shared_ptr<RouteList> r = routes.reader ();
2379 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2380 if ((*i)->id() == id) {
2385 return shared_ptr<Route> ((Route*) 0);
2389 Session::route_by_remote_id (uint32_t id)
2391 shared_ptr<RouteList> r = routes.reader ();
2393 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2394 if ((*i)->remote_control_id() == id) {
2399 return shared_ptr<Route> ((Route*) 0);
2402 /** If either end of the session range location marker lies inside the current
2403 * session extent, move it to the corresponding session extent.
2406 Session::update_session_range_location_marker ()
2408 if (_state_of_the_state & Loading) {
2412 pair<nframes_t, nframes_t> const ext = get_extent ();
2414 if (_session_range_location == 0) {
2415 /* we don't have a session range yet; use this one (provided it is valid) */
2416 if (ext.first != max_frames) {
2417 add_session_range_location (ext.first, ext.second);
2420 /* update the existing session range */
2421 if (ext.first < _session_range_location->start()) {
2422 _session_range_location->set_start (ext.first);
2426 if (ext.second > _session_range_location->end()) {
2427 _session_range_location->set_end (ext.second);
2434 /** @return Extent of the session's contents; if the session is empty, the first value of
2435 * the pair will equal max_frames.
2437 pair<nframes_t, nframes_t>
2438 Session::get_extent () const
2440 pair<nframes_t, nframes_t> ext (max_frames, 0);
2442 boost::shared_ptr<RouteList> rl = routes.reader ();
2443 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2444 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2445 if (!tr || tr->destructive()) {
2446 // ignore tape tracks when getting extents
2450 pair<nframes_t, nframes_t> e = tr->playlist()->get_extent ();
2451 if (e.first < ext.first) {
2452 ext.first = e.first;
2454 if (e.second > ext.second) {
2455 ext.second = e.second;
2462 /* Region management */
2464 boost::shared_ptr<Region>
2465 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2467 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2468 RegionFactory::RegionMap::const_iterator i;
2469 boost::shared_ptr<Region> region;
2471 Glib::Mutex::Lock lm (region_lock);
2473 for (i = regions.begin(); i != regions.end(); ++i) {
2477 if (region->whole_file()) {
2479 if (child->source_equivalent (region)) {
2485 return boost::shared_ptr<Region> ();
2489 Session::destroy_region (boost::shared_ptr<Region> region)
2491 vector<boost::shared_ptr<Source> > srcs;
2494 if (region->playlist()) {
2495 region->playlist()->destroy_region (region);
2498 for (uint32_t n = 0; n < region->n_channels(); ++n) {
2499 srcs.push_back (region->source (n));
2503 region->drop_references ();
2505 for (vector<boost::shared_ptr<Source> >::iterator i = srcs.begin(); i != srcs.end(); ++i) {
2507 (*i)->mark_for_remove ();
2508 (*i)->drop_references ();
2510 cerr << "source was not used by any playlist\n";
2517 Session::destroy_regions (list<boost::shared_ptr<Region> > regions)
2519 for (list<boost::shared_ptr<Region> >::iterator i = regions.begin(); i != regions.end(); ++i) {
2520 destroy_region (*i);
2526 Session::remove_last_capture ()
2528 list<boost::shared_ptr<Region> > r;
2530 boost::shared_ptr<RouteList> rl = routes.reader ();
2531 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2532 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2537 list<boost::shared_ptr<Region> >& l = tr->last_capture_regions();
2540 r.insert (r.end(), l.begin(), l.end());
2545 destroy_regions (r);
2547 save_state (_current_snapshot_name);
2552 /* Source Management */
2555 Session::add_source (boost::shared_ptr<Source> source)
2557 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2558 pair<SourceMap::iterator,bool> result;
2560 entry.first = source->id();
2561 entry.second = source;
2564 Glib::Mutex::Lock lm (source_lock);
2565 result = sources.insert (entry);
2568 if (result.second) {
2572 boost::shared_ptr<AudioFileSource> afs;
2574 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2575 if (Config->get_auto_analyse_audio()) {
2576 Analyser::queue_source_for_analysis (source, false);
2582 Session::remove_source (boost::weak_ptr<Source> src)
2584 SourceMap::iterator i;
2585 boost::shared_ptr<Source> source = src.lock();
2592 Glib::Mutex::Lock lm (source_lock);
2594 if ((i = sources.find (source->id())) != sources.end()) {
2599 if (!_state_of_the_state & InCleanup) {
2601 /* save state so we don't end up with a session file
2602 referring to non-existent sources.
2605 save_state (_current_snapshot_name);
2609 boost::shared_ptr<Source>
2610 Session::source_by_id (const PBD::ID& id)
2612 Glib::Mutex::Lock lm (source_lock);
2613 SourceMap::iterator i;
2614 boost::shared_ptr<Source> source;
2616 if ((i = sources.find (id)) != sources.end()) {
2623 boost::shared_ptr<Source>
2624 Session::source_by_path_and_channel (const Glib::ustring& path, uint16_t chn)
2626 Glib::Mutex::Lock lm (source_lock);
2628 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2629 cerr << "comparing " << path << " with " << i->second->name() << endl;
2630 boost::shared_ptr<AudioFileSource> afs
2631 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
2633 if (afs && afs->path() == path && chn == afs->channel()) {
2637 return boost::shared_ptr<Source>();
2642 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
2645 string old_basename = PBD::basename_nosuffix (oldname);
2646 string new_legalized = legalize_for_path (newname);
2648 /* note: we know (or assume) the old path is already valid */
2652 /* destructive file sources have a name of the form:
2654 /path/to/Tnnnn-NAME(%[LR])?.wav
2656 the task here is to replace NAME with the new name.
2659 /* find last slash */
2663 string::size_type slash;
2664 string::size_type dash;
2666 if ((slash = path.find_last_of ('/')) == string::npos) {
2670 dir = path.substr (0, slash+1);
2672 /* '-' is not a legal character for the NAME part of the path */
2674 if ((dash = path.find_last_of ('-')) == string::npos) {
2678 prefix = path.substr (slash+1, dash-(slash+1));
2683 path += new_legalized;
2684 path += ".wav"; /* XXX gag me with a spoon */
2688 /* non-destructive file sources have a name of the form:
2690 /path/to/NAME-nnnnn(%[LR])?.ext
2692 the task here is to replace NAME with the new name.
2697 string::size_type slash;
2698 string::size_type dash;
2699 string::size_type postfix;
2701 /* find last slash */
2703 if ((slash = path.find_last_of ('/')) == string::npos) {
2707 dir = path.substr (0, slash+1);
2709 /* '-' is not a legal character for the NAME part of the path */
2711 if ((dash = path.find_last_of ('-')) == string::npos) {
2715 suffix = path.substr (dash+1);
2717 // Suffix is now everything after the dash. Now we need to eliminate
2718 // the nnnnn part, which is done by either finding a '%' or a '.'
2720 postfix = suffix.find_last_of ("%");
2721 if (postfix == string::npos) {
2722 postfix = suffix.find_last_of ('.');
2725 if (postfix != string::npos) {
2726 suffix = suffix.substr (postfix);
2728 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
2732 const uint32_t limit = 10000;
2733 char buf[PATH_MAX+1];
2735 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
2737 snprintf (buf, sizeof(buf), "%s%s-%u%s", dir.c_str(), newname.c_str(), cnt, suffix.c_str());
2739 if (access (buf, F_OK) != 0) {
2747 error << "FATAL ERROR! Could not find a " << endl;
2755 /** Return the full path (in some session directory) for a new within-session source.
2756 * \a name must be a session-unique name that does not contain slashes
2757 * (e.g. as returned by new_*_source_name)
2760 Session::new_source_path_from_name (DataType type, const string& name)
2762 assert(name.find("/") == string::npos);
2764 SessionDirectory sdir(get_best_session_directory_for_new_source());
2767 if (type == DataType::AUDIO) {
2768 p = sdir.sound_path();
2769 } else if (type == DataType::MIDI) {
2770 p = sdir.midi_path();
2772 error << "Unknown source type, unable to create file path" << endmsg;
2777 return p.to_string();
2781 Session::peak_path (Glib::ustring base) const
2783 sys::path peakfile_path(_session_dir->peak_path());
2784 peakfile_path /= basename_nosuffix (base) + peakfile_suffix;
2785 return peakfile_path.to_string();
2788 /** Return a unique name based on \a base for a new internal audio source */
2790 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
2794 char buf[PATH_MAX+1];
2795 const uint32_t limit = 10000;
2799 legalized = legalize_for_path (base);
2801 // Find a "version" of the base name that doesn't exist in any of the possible directories.
2802 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
2804 vector<space_and_path>::iterator i;
2805 uint32_t existing = 0;
2807 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2809 SessionDirectory sdir((*i).path);
2811 spath = sdir.sound_path().to_string();
2816 snprintf (buf, sizeof(buf), "%s/T%04d-%s.wav",
2817 spath.c_str(), cnt, legalized.c_str());
2818 } else if (nchan == 2) {
2820 snprintf (buf, sizeof(buf), "%s/T%04d-%s%%L.wav",
2821 spath.c_str(), cnt, legalized.c_str());
2823 snprintf (buf, sizeof(buf), "%s/T%04d-%s%%R.wav",
2824 spath.c_str(), cnt, legalized.c_str());
2826 } else if (nchan < 26) {
2827 snprintf (buf, sizeof(buf), "%s/T%04d-%s%%%c.wav",
2828 spath.c_str(), cnt, legalized.c_str(), 'a' + chan);
2830 snprintf (buf, sizeof(buf), "%s/T%04d-%s.wav",
2831 spath.c_str(), cnt, legalized.c_str());
2840 snprintf (buf, sizeof(buf), "%s-%u.wav", spath.c_str(), cnt);
2841 } else if (nchan == 2) {
2843 snprintf (buf, sizeof(buf), "%s-%u%%L.wav", spath.c_str(), cnt);
2845 snprintf (buf, sizeof(buf), "%s-%u%%R.wav", spath.c_str(), cnt);
2847 } else if (nchan < 26) {
2848 snprintf (buf, sizeof(buf), "%s-%u%%%c.wav", spath.c_str(), cnt, 'a' + chan);
2850 snprintf (buf, sizeof(buf), "%s-%u.wav", spath.c_str(), cnt);
2854 if (sys::exists(buf)) {
2860 if (existing == 0) {
2865 error << string_compose(
2866 _("There are already %1 recordings for %2, which I consider too many."),
2867 limit, base) << endmsg;
2869 throw failed_constructor();
2873 return Glib::path_get_basename(buf);
2876 /** Create a new within-session audio source */
2877 boost::shared_ptr<AudioFileSource>
2878 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
2880 const string name = new_audio_source_name (n, n_chans, chan, destructive);
2881 const string path = new_source_path_from_name(DataType::AUDIO, name);
2883 return boost::dynamic_pointer_cast<AudioFileSource> (
2884 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
2887 /** Return a unique name based on \a base for a new internal MIDI source */
2889 Session::new_midi_source_name (const string& base)
2892 char buf[PATH_MAX+1];
2893 const uint32_t limit = 10000;
2897 legalized = legalize_for_path (base);
2899 // Find a "version" of the file name that doesn't exist in any of the possible directories.
2900 for (cnt = 1; cnt <= limit; ++cnt) {
2902 vector<space_and_path>::iterator i;
2903 uint32_t existing = 0;
2905 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2907 SessionDirectory sdir((*i).path);
2909 sys::path p = sdir.midi_path();
2912 snprintf (buf, sizeof(buf), "%s-%u.mid", p.to_string().c_str(), cnt);
2914 if (sys::exists (buf)) {
2919 if (existing == 0) {
2924 error << string_compose(
2925 _("There are already %1 recordings for %2, which I consider too many."),
2926 limit, base) << endmsg;
2928 throw failed_constructor();
2932 return Glib::path_get_basename(buf);
2936 /** Create a new within-session MIDI source */
2937 boost::shared_ptr<MidiSource>
2938 Session::create_midi_source_for_session (string const & n)
2940 const string name = new_midi_source_name (n);
2941 const string path = new_source_path_from_name (DataType::MIDI, name);
2943 return boost::dynamic_pointer_cast<SMFSource> (
2944 SourceFactory::createWritable (
2945 DataType::MIDI, *this, path, false, frame_rate()));
2950 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
2952 if (playlist->hidden()) {
2956 playlists->add (playlist);
2959 playlist->release();
2966 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
2968 if (_state_of_the_state & Deletion) {
2972 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
2978 playlists->remove (playlist);
2984 Session::set_audition (boost::shared_ptr<Region> r)
2986 pending_audition_region = r;
2987 add_post_transport_work (PostTransportAudition);
2988 _butler->schedule_transport_work ();
2992 Session::audition_playlist ()
2994 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
2995 ev->region.reset ();
3000 Session::non_realtime_set_audition ()
3002 if (!pending_audition_region) {
3003 auditioner->audition_current_playlist ();
3005 auditioner->audition_region (pending_audition_region);
3006 pending_audition_region.reset ();
3008 AuditionActive (true); /* EMIT SIGNAL */
3012 Session::audition_region (boost::shared_ptr<Region> r)
3014 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3020 Session::cancel_audition ()
3022 if (auditioner->auditioning()) {
3023 auditioner->cancel_audition ();
3024 AuditionActive (false); /* EMIT SIGNAL */
3029 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3031 if (a->is_monitor()) {
3034 if (b->is_monitor()) {
3037 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3041 Session::remove_empty_sounds ()
3043 vector<string> audio_filenames;
3045 get_files_in_directory (_session_dir->sound_path(), audio_filenames);
3047 Glib::Mutex::Lock lm (source_lock);
3049 TapeFileMatcher tape_file_matcher;
3051 remove_if (audio_filenames.begin(), audio_filenames.end(),
3052 boost::bind (&TapeFileMatcher::matches, &tape_file_matcher, _1));
3054 for (vector<string>::iterator i = audio_filenames.begin(); i != audio_filenames.end(); ++i) {
3056 sys::path audio_file_path (_session_dir->sound_path());
3058 audio_file_path /= *i;
3060 if (AudioFileSource::is_empty (*this, audio_file_path.to_string())) {
3064 sys::remove (audio_file_path);
3065 const string peakfile = peak_path (audio_file_path.to_string());
3066 sys::remove (peakfile);
3068 catch (const sys::filesystem_error& err)
3070 error << err.what() << endmsg;
3077 Session::is_auditioning () const
3079 /* can be called before we have an auditioner object */
3081 return auditioner->auditioning();
3088 Session::graph_reordered ()
3090 /* don't do this stuff if we are setting up connections
3091 from a set_state() call or creating new tracks. Ditto for deletion.
3094 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3098 /* every track/bus asked for this to be handled but it was deferred because
3099 we were connecting. do it now.
3102 request_input_change_handling ();
3106 /* force all diskstreams to update their capture offset values to
3107 reflect any changes in latencies within the graph.
3110 boost::shared_ptr<RouteList> rl = routes.reader ();
3111 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3112 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3114 tr->set_capture_offset ();
3120 Session::available_capture_duration ()
3122 float sample_bytes_on_disk = 4.0; // keep gcc happy
3124 switch (config.get_native_file_data_format()) {
3126 sample_bytes_on_disk = 4.0;
3130 sample_bytes_on_disk = 3.0;
3134 sample_bytes_on_disk = 2.0;
3138 /* impossible, but keep some gcc versions happy */
3139 fatal << string_compose (_("programming error: %1"),
3140 X_("illegal native file data format"))
3145 double scale = 4096.0 / sample_bytes_on_disk;
3147 if (_total_free_4k_blocks * scale > (double) max_frames) {
3151 return (nframes_t) floor (_total_free_4k_blocks * scale);
3155 Session::add_bundle (shared_ptr<Bundle> bundle)
3158 RCUWriter<BundleList> writer (_bundles);
3159 boost::shared_ptr<BundleList> b = writer.get_copy ();
3160 b->push_back (bundle);
3163 BundleAdded (bundle); /* EMIT SIGNAL */
3169 Session::remove_bundle (shared_ptr<Bundle> bundle)
3171 bool removed = false;
3174 RCUWriter<BundleList> writer (_bundles);
3175 boost::shared_ptr<BundleList> b = writer.get_copy ();
3176 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3178 if (i != b->end()) {
3185 BundleRemoved (bundle); /* EMIT SIGNAL */
3192 Session::bundle_by_name (string name) const
3194 boost::shared_ptr<BundleList> b = _bundles.reader ();
3196 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3197 if ((*i)->name() == name) {
3202 return boost::shared_ptr<Bundle> ();
3206 Session::tempo_map_changed (const PropertyChange&)
3210 playlists->update_after_tempo_map_change ();
3215 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3216 * the given count with the current block size.
3219 Session::ensure_buffers (ChanCount howmany)
3221 BufferManager::ensure_buffers (howmany);
3225 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3227 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3228 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3233 Session::next_insert_id ()
3235 /* this doesn't really loop forever. just think about it */
3238 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3239 if (!insert_bitset[n]) {
3240 insert_bitset[n] = true;
3246 /* none available, so resize and try again */
3248 insert_bitset.resize (insert_bitset.size() + 16, false);
3253 Session::next_send_id ()
3255 /* this doesn't really loop forever. just think about it */
3258 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3259 if (!send_bitset[n]) {
3260 send_bitset[n] = true;
3266 /* none available, so resize and try again */
3268 send_bitset.resize (send_bitset.size() + 16, false);
3273 Session::next_return_id ()
3275 /* this doesn't really loop forever. just think about it */
3278 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3279 if (!return_bitset[n]) {
3280 return_bitset[n] = true;
3286 /* none available, so resize and try again */
3288 return_bitset.resize (return_bitset.size() + 16, false);
3293 Session::mark_send_id (uint32_t id)
3295 if (id >= send_bitset.size()) {
3296 send_bitset.resize (id+16, false);
3298 if (send_bitset[id]) {
3299 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3301 send_bitset[id] = true;
3305 Session::mark_return_id (uint32_t id)
3307 if (id >= return_bitset.size()) {
3308 return_bitset.resize (id+16, false);
3310 if (return_bitset[id]) {
3311 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3313 return_bitset[id] = true;
3317 Session::mark_insert_id (uint32_t id)
3319 if (id >= insert_bitset.size()) {
3320 insert_bitset.resize (id+16, false);
3322 if (insert_bitset[id]) {
3323 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3325 insert_bitset[id] = true;
3329 Session::unmark_send_id (uint32_t id)
3331 if (id < send_bitset.size()) {
3332 send_bitset[id] = false;
3337 Session::unmark_return_id (uint32_t id)
3339 if (id < return_bitset.size()) {
3340 return_bitset[id] = false;
3345 Session::unmark_insert_id (uint32_t id)
3347 if (id < insert_bitset.size()) {
3348 insert_bitset[id] = false;
3353 /* Named Selection management */
3355 boost::shared_ptr<NamedSelection>
3356 Session::named_selection_by_name (string name)
3358 Glib::Mutex::Lock lm (named_selection_lock);
3359 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3360 if ((*i)->name == name) {
3364 return boost::shared_ptr<NamedSelection>();
3368 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3371 Glib::Mutex::Lock lm (named_selection_lock);
3372 named_selections.insert (named_selections.begin(), named_selection);
3377 NamedSelectionAdded (); /* EMIT SIGNAL */
3381 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3383 bool removed = false;
3386 Glib::Mutex::Lock lm (named_selection_lock);
3388 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3390 if (i != named_selections.end()) {
3391 named_selections.erase (i);
3398 NamedSelectionRemoved (); /* EMIT SIGNAL */
3403 Session::reset_native_file_format ()
3405 boost::shared_ptr<RouteList> rl = routes.reader ();
3406 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3407 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3409 tr->reset_write_sources (false);
3415 Session::route_name_unique (string n) const
3417 shared_ptr<RouteList> r = routes.reader ();
3419 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3420 if ((*i)->name() == n) {
3429 Session::route_name_internal (string n) const
3431 if (auditioner && auditioner->name() == n) {
3435 if (_click_io && _click_io->name() == n) {
3443 Session::freeze_all (InterThreadInfo& itt)
3445 shared_ptr<RouteList> r = routes.reader ();
3447 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3449 boost::shared_ptr<Track> t;
3451 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3452 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3462 boost::shared_ptr<Region>
3463 Session::write_one_track (AudioTrack& track, nframes_t start, nframes_t end,
3464 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3465 InterThreadInfo& itt, bool enable_processing)
3467 boost::shared_ptr<Region> result;
3468 boost::shared_ptr<Playlist> playlist;
3469 boost::shared_ptr<AudioFileSource> fsource;
3471 char buf[PATH_MAX+1];
3472 ChanCount nchans(track.n_channels());
3474 nframes_t this_chunk;
3477 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3478 const string sound_dir = sdir.sound_path().to_string();
3479 nframes_t len = end - start;
3482 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3483 end, start) << endmsg;
3487 const nframes_t chunk_size = (256 * 1024)/4;
3489 // block all process callback handling
3491 block_processing ();
3493 /* call tree *MUST* hold route_lock */
3495 if ((playlist = track.playlist()) == 0) {
3499 /* external redirects will be a problem */
3501 if (track.has_external_redirects()) {
3505 for (uint32_t chan_n=0; chan_n < nchans.n_audio(); ++chan_n) {
3507 for (x = 0; x < 99999; ++x) {
3508 snprintf (buf, sizeof(buf), "%s/%s-%d-bounce-%" PRIu32 ".wav", sound_dir.c_str(), playlist->name().c_str(), chan_n, x+1);
3509 if (access (buf, F_OK) != 0) {
3515 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3520 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3521 SourceFactory::createWritable (DataType::AUDIO, *this, buf, false, frame_rate()));
3524 catch (failed_constructor& err) {
3525 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3529 srcs.push_back (fsource);
3532 /* XXX need to flush all redirects */
3537 /* create a set of reasonably-sized buffers */
3538 buffers.ensure_buffers(DataType::AUDIO, nchans.n_audio(), chunk_size);
3539 buffers.set_count(nchans);
3541 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3542 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3544 afs->prepare_for_peakfile_writes ();
3547 while (to_do && !itt.cancel) {
3549 this_chunk = min (to_do, chunk_size);
3551 if (track.export_stuff (buffers, start, this_chunk, enable_processing)) {
3556 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
3557 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3560 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
3566 start += this_chunk;
3567 to_do -= this_chunk;
3569 itt.progress = (float) (1.0 - ((double) to_do / len));
3578 xnow = localtime (&now);
3580 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3581 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3584 afs->update_header (position, *xnow, now);
3585 afs->flush_header ();
3589 /* construct a region to represent the bounced material */
3593 plist.add (Properties::start, 0);
3594 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
3595 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
3597 result = RegionFactory::create (srcs, plist);
3603 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3604 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3607 afs->mark_for_remove ();
3610 (*src)->drop_references ();
3614 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3615 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3618 afs->done_with_peakfile_writes ();
3622 unblock_processing ();
3628 Session::gain_automation_buffer() const
3630 return ProcessThread::gain_automation_buffer ();
3634 Session::pan_automation_buffer() const
3636 return ProcessThread::pan_automation_buffer ();
3640 Session::get_silent_buffers (ChanCount count)
3642 return ProcessThread::get_silent_buffers (count);
3644 assert(_silent_buffers->available() >= count);
3645 _silent_buffers->set_count(count);
3647 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3648 for (size_t i= 0; i < count.get(*t); ++i) {
3649 _silent_buffers->get(*t, i).clear();
3653 return *_silent_buffers;
3658 Session::get_scratch_buffers (ChanCount count)
3660 return ProcessThread::get_scratch_buffers (count);
3662 if (count != ChanCount::ZERO) {
3663 assert(_scratch_buffers->available() >= count);
3664 _scratch_buffers->set_count(count);
3666 _scratch_buffers->set_count (_scratch_buffers->available());
3669 return *_scratch_buffers;
3674 Session::get_mix_buffers (ChanCount count)
3676 return ProcessThread::get_mix_buffers (count);
3678 assert(_mix_buffers->available() >= count);
3679 _mix_buffers->set_count(count);
3680 return *_mix_buffers;
3685 Session::ntracks () const
3688 shared_ptr<RouteList> r = routes.reader ();
3690 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3691 if (boost::dynamic_pointer_cast<Track> (*i)) {
3700 Session::nbusses () const
3703 shared_ptr<RouteList> r = routes.reader ();
3705 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3706 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
3715 Session::add_automation_list(AutomationList *al)
3717 automation_lists[al->id()] = al;
3721 Session::sync_order_keys (std::string const & base)
3723 if (deletion_in_progress()) {
3727 if (!Config->get_sync_all_route_ordering()) {
3728 /* leave order keys as they are */
3732 boost::shared_ptr<RouteList> r = routes.reader ();
3734 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3735 (*i)->sync_order_keys (base);
3738 Route::SyncOrderKeys (base); // EMIT SIGNAL
3740 /* this might not do anything */
3742 set_remote_control_ids ();
3745 /** @return true if there is at least one record-enabled track, otherwise false */
3747 Session::have_rec_enabled_track () const
3749 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
3752 /** Update the state of our rec-enabled tracks flag */
3754 Session::update_have_rec_enabled_track ()
3756 boost::shared_ptr<RouteList> rl = routes.reader ();
3757 RouteList::iterator i = rl->begin();
3758 while (i != rl->end ()) {
3760 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3761 if (tr && tr->record_enabled ()) {
3768 int const old = g_atomic_int_get (&_have_rec_enabled_track);
3770 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
3772 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
3773 RecordStateChanged (); /* EMIT SIGNAL */
3778 Session::listen_position_changed ()
3782 switch (Config->get_listen_position()) {
3783 case AfterFaderListen:
3787 case PreFaderListen:
3792 boost::shared_ptr<RouteList> r = routes.reader ();
3794 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3795 (*i)->put_monitor_send_at (p);
3800 Session::solo_control_mode_changed ()
3802 /* cancel all solo or all listen when solo control mode changes */
3805 set_solo (get_routes(), false);
3806 } else if (listening()) {
3807 set_listen (get_routes(), false);
3812 Session::route_group_changed ()
3814 RouteGroupChanged (); /* EMIT SIGNAL */
3818 Session::get_available_sync_options () const
3820 vector<SyncSource> ret;
3822 ret.push_back (JACK);
3825 ret.push_back (MTC);
3828 if (midi_clock_port()) {
3829 ret.push_back (MIDIClock);
3835 boost::shared_ptr<RouteList>
3836 Session::get_routes_with_regions_at (nframes64_t const p) const
3838 shared_ptr<RouteList> r = routes.reader ();
3839 shared_ptr<RouteList> rl (new RouteList);
3841 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3842 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3847 boost::shared_ptr<Playlist> pl = tr->playlist ();
3852 if (pl->has_region_at (p)) {
3861 Session::goto_end ()
3863 if (_session_range_location) {
3864 request_locate (_session_range_location->end(), false);
3866 request_locate (0, false);
3871 Session::goto_start ()
3873 if (_session_range_location) {
3874 request_locate (_session_range_location->start(), false);
3876 request_locate (0, false);
3881 Session::set_session_start (nframes_t start)
3883 if (_session_range_location) {
3884 _session_range_location->set_start (start);
3886 add_session_range_location (start, start);
3891 Session::set_session_end (nframes_t end)
3893 if (_session_range_location) {
3894 _session_range_location->set_end (end);
3896 add_session_range_location (end, end);
3901 Session::current_start_frame () const
3903 return _session_range_location ? _session_range_location->start() : 0;
3907 Session::current_end_frame () const
3909 return _session_range_location ? _session_range_location->end() : 0;
3913 Session::add_session_range_location (nframes_t start, nframes_t end)
3915 _session_range_location = new Location (start, end, _("session"), Location::IsSessionRange);
3916 _locations.add (_session_range_location);