2 Copyright (C) 1999-2010 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #define __STDC_LIMIT_MACROS
28 #include <cstdio> /* sprintf(3) ... grrr */
34 #include <glibmm/thread.h>
35 #include <glibmm/miscutils.h>
36 #include <glibmm/fileutils.h>
38 #include "pbd/error.h"
39 #include "pbd/boost_debug.h"
40 #include "pbd/pathscanner.h"
41 #include "pbd/stl_delete.h"
42 #include "pbd/basename.h"
43 #include "pbd/stacktrace.h"
44 #include "pbd/file_utils.h"
45 #include "pbd/convert.h"
47 #include "ardour/amp.h"
48 #include "ardour/analyser.h"
49 #include "ardour/audio_buffer.h"
50 #include "ardour/audio_diskstream.h"
51 #include "ardour/audio_port.h"
52 #include "ardour/audio_track.h"
53 #include "ardour/audioengine.h"
54 #include "ardour/audiofilesource.h"
55 #include "ardour/audioplaylist.h"
56 #include "ardour/audioregion.h"
57 #include "ardour/auditioner.h"
58 #include "ardour/buffer_manager.h"
59 #include "ardour/buffer_set.h"
60 #include "ardour/bundle.h"
61 #include "ardour/butler.h"
62 #include "ardour/click.h"
63 #include "ardour/configuration.h"
64 #include "ardour/crossfade.h"
65 #include "ardour/cycle_timer.h"
66 #include "ardour/data_type.h"
67 #include "ardour/debug.h"
68 #include "ardour/filename_extensions.h"
69 #include "ardour/internal_send.h"
70 #include "ardour/io_processor.h"
71 #include "ardour/midi_diskstream.h"
72 #include "ardour/midi_playlist.h"
73 #include "ardour/midi_region.h"
74 #include "ardour/midi_track.h"
75 #include "ardour/midi_ui.h"
76 #include "ardour/named_selection.h"
77 #include "ardour/process_thread.h"
78 #include "ardour/playlist.h"
79 #include "ardour/plugin_insert.h"
80 #include "ardour/port_insert.h"
81 #include "ardour/processor.h"
82 #include "ardour/rc_configuration.h"
83 #include "ardour/recent_sessions.h"
84 #include "ardour/region_factory.h"
85 #include "ardour/return.h"
86 #include "ardour/route_group.h"
87 #include "ardour/send.h"
88 #include "ardour/session.h"
89 #include "ardour/session_directory.h"
90 #include "ardour/session_directory.h"
91 #include "ardour/session_metadata.h"
92 #include "ardour/session_playlists.h"
93 #include "ardour/slave.h"
94 #include "ardour/smf_source.h"
95 #include "ardour/source_factory.h"
96 #include "ardour/tape_file_matcher.h"
97 #include "ardour/tempo.h"
98 #include "ardour/utils.h"
99 #include "ardour/graph.h"
101 #include "midi++/port.h"
102 #include "midi++/mmc.h"
103 #include "midi++/manager.h"
108 using namespace ARDOUR;
110 using boost::shared_ptr;
111 using boost::weak_ptr;
113 bool Session::_disable_all_loaded_plugins = false;
115 PBD::Signal1<void,std::string> Session::Dialog;
116 PBD::Signal0<int> Session::AskAboutPendingState;
117 PBD::Signal2<int,nframes_t,nframes_t> Session::AskAboutSampleRateMismatch;
118 PBD::Signal0<void> Session::SendFeedback;
120 PBD::Signal0<void> Session::TimecodeOffsetChanged;
121 PBD::Signal0<void> Session::StartTimeChanged;
122 PBD::Signal0<void> Session::EndTimeChanged;
123 PBD::Signal0<void> Session::AutoBindingOn;
124 PBD::Signal0<void> Session::AutoBindingOff;
125 PBD::Signal2<void,std::string, std::string> Session::Exported;
126 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
128 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
129 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
131 Session::Session (AudioEngine &eng,
132 const string& fullpath,
133 const string& snapshot_name,
134 BusProfile* bus_profile,
138 _target_transport_speed (0.0),
139 _requested_return_frame (-1),
140 _session_dir (new SessionDirectory(fullpath)),
142 _butler (new Butler (*this)),
143 _post_transport_work (0),
144 _send_timecode_update (false),
145 route_graph (new Graph(*this)),
146 routes (new RouteList),
147 _total_free_4k_blocks (0),
148 _bundles (new BundleList),
149 _bundle_xml_node (0),
152 click_emphasis_data (0),
154 _metadata (new SessionMetadata()),
155 _have_rec_enabled_track (false)
158 playlists.reset (new SessionPlaylists);
160 interpolation.add_channel_to (0, 0);
162 if (!eng.connected()) {
163 throw failed_constructor();
166 n_physical_outputs = _engine.n_physical_outputs(DataType::AUDIO);
167 n_physical_inputs = _engine.n_physical_inputs(DataType::AUDIO);
169 first_stage_init (fullpath, snapshot_name);
171 _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
174 if (create (mix_template, bus_profile)) {
176 throw failed_constructor ();
180 if (second_stage_init ()) {
182 throw failed_constructor ();
185 store_recent_sessions(_name, _path);
187 bool was_dirty = dirty();
189 _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
191 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
192 config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
195 DirtyChanged (); /* EMIT SIGNAL */
209 vector<void*> debug_pointers;
211 /* if we got to here, leaving pending capture state around
215 remove_pending_capture_state ();
217 _state_of_the_state = StateOfTheState (CannotSave|Deletion);
219 _engine.remove_session ();
221 /* clear history so that no references to objects are held any more */
225 /* clear state tree so that no references to objects are held any more */
229 /* reset dynamic state version back to default */
231 Stateful::loading_state_version = 0;
233 _butler->drop_references ();
235 delete midi_control_ui;
237 if (click_data != default_click) {
238 delete [] click_data;
241 if (click_emphasis_data != default_click_emphasis) {
242 delete [] click_emphasis_data;
247 /* clear out any pending dead wood from RCU managed objects */
252 AudioDiskstream::free_working_buffers();
254 /* tell everyone who is still standing that we're about to die */
257 /* tell everyone to drop references and delete objects as we go */
259 DEBUG_TRACE (DEBUG::Destruction, "delete named selections\n");
260 named_selections.clear ();
262 DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
263 RegionFactory::delete_all_regions ();
265 DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
267 /* reset these three references to special routes before we do the usual route delete thing */
270 _master_out.reset ();
271 _monitor_out.reset ();
274 RCUWriter<RouteList> writer (routes);
275 boost::shared_ptr<RouteList> r = writer.get_copy ();
277 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
278 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
279 (*i)->drop_references ();
283 /* writer goes out of scope and updates master */
287 boost::shared_ptr<RouteList> r = routes.reader ();
289 DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
290 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
291 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->path(), i->second.use_count()));
292 i->second->drop_references ();
297 DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
298 for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
303 Crossfade::set_buffer_size (0);
305 /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
308 boost_debug_list_ptrs ();
310 DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
314 Session::set_worst_io_latencies ()
316 _worst_output_latency = 0;
317 _worst_input_latency = 0;
319 if (!_engine.connected()) {
323 boost::shared_ptr<RouteList> r = routes.reader ();
325 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
326 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
327 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
332 Session::when_engine_running ()
334 string first_physical_output;
336 BootMessage (_("Set block size and sample rate"));
338 set_block_size (_engine.frames_per_cycle());
339 set_frame_rate (_engine.frame_rate());
341 BootMessage (_("Using configuration"));
343 boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
344 boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
346 Config->map_parameters (ff);
347 config.map_parameters (ft);
349 /* every time we reconnect, recompute worst case output latencies */
351 _engine.Running.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies, this));
353 if (synced_to_jack()) {
354 _engine.transport_stop ();
357 if (config.get_jack_time_master()) {
358 _engine.transport_locate (_transport_frame);
366 _click_io.reset (new ClickIO (*this, "click"));
368 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
370 /* existing state for Click */
373 if (Stateful::loading_state_version < 3000) {
374 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
376 c = _click_io->set_state (*child->children().front(), Stateful::loading_state_version);
381 _clicking = Config->get_clicking ();
385 error << _("could not setup Click I/O") << endmsg;
392 /* default state for Click: dual-mono to first 2 physical outputs */
394 for (int physport = 0; physport < 2; ++physport) {
395 string physical_output = _engine.get_nth_physical_output (DataType::AUDIO, physport);
397 if (physical_output.length()) {
398 if (_click_io->add_port (physical_output, this)) {
399 // relax, even though its an error
404 if (_click_io->n_ports () > ChanCount::ZERO) {
405 _clicking = Config->get_clicking ();
410 catch (failed_constructor& err) {
411 error << _("cannot setup Click I/O") << endmsg;
414 BootMessage (_("Compute I/O Latencies"));
416 set_worst_io_latencies ();
419 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
422 BootMessage (_("Set up standard connections"));
424 /* Create a set of Bundle objects that map
425 to the physical I/O currently available. We create both
426 mono and stereo bundles, so that the common cases of mono
427 and stereo tracks get bundles to put in their mixer strip
428 in / out menus. There may be a nicer way of achieving that;
429 it doesn't really scale that well to higher channel counts
432 /* mono output bundles */
434 for (uint32_t np = 0; np < n_physical_outputs; ++np) {
436 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
438 shared_ptr<Bundle> c (new Bundle (buf, true));
439 c->add_channel (_("mono"), DataType::AUDIO);
440 c->set_port (0, _engine.get_nth_physical_output (DataType::AUDIO, np));
445 /* stereo output bundles */
447 for (uint32_t np = 0; np < n_physical_outputs; np += 2) {
448 if (np + 1 < n_physical_outputs) {
450 snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
451 shared_ptr<Bundle> c (new Bundle (buf, true));
452 c->add_channel (_("L"), DataType::AUDIO);
453 c->set_port (0, _engine.get_nth_physical_output (DataType::AUDIO, np));
454 c->add_channel (_("R"), DataType::AUDIO);
455 c->set_port (1, _engine.get_nth_physical_output (DataType::AUDIO, np + 1));
461 /* mono input bundles */
463 for (uint32_t np = 0; np < n_physical_inputs; ++np) {
465 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
467 shared_ptr<Bundle> c (new Bundle (buf, false));
468 c->add_channel (_("mono"), DataType::AUDIO);
469 c->set_port (0, _engine.get_nth_physical_input (DataType::AUDIO, np));
474 /* stereo input bundles */
476 for (uint32_t np = 0; np < n_physical_inputs; np += 2) {
477 if (np + 1 < n_physical_inputs) {
479 snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
481 shared_ptr<Bundle> c (new Bundle (buf, false));
482 c->add_channel (_("L"), DataType::AUDIO);
483 c->set_port (0, _engine.get_nth_physical_input (DataType::AUDIO, np));
484 c->add_channel (_("R"), DataType::AUDIO);
485 c->set_port (1, _engine.get_nth_physical_input (DataType::AUDIO, np + 1));
491 BootMessage (_("Setup signal flow and plugins"));
495 if (_is_new && !no_auto_connect()) {
497 /* don't connect the master bus outputs if there is a monitor bus */
499 if (_master_out && Config->get_auto_connect_standard_busses() && !_monitor_out) {
501 /* if requested auto-connect the outputs to the first N physical ports.
504 uint32_t limit = _master_out->n_outputs().n_total();
506 for (uint32_t n = 0; n < limit; ++n) {
507 Port* p = _master_out->output()->nth (n);
508 string connect_to = _engine.get_nth_physical_output (DataType (p->type()), n);
510 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
511 if (_master_out->output()->connect (p, connect_to, this)) {
512 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
522 /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
523 are undefined, at best.
526 /* control out listens to master bus (but ignores it
527 under some conditions)
530 uint32_t limit = _monitor_out->n_inputs().n_audio();
533 for (uint32_t n = 0; n < limit; ++n) {
534 AudioPort* p = _monitor_out->input()->ports().nth_audio_port (n);
535 AudioPort* o = _master_out->output()->ports().nth_audio_port (n);
538 string connect_to = o->name();
539 if (_monitor_out->input()->connect (p, connect_to, this)) {
540 error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
548 /* if control out is not connected, connect control out to physical outs
551 if (!_monitor_out->output()->connected ()) {
553 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
555 boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
558 _monitor_out->output()->connect_ports_to_bundle (b, this);
560 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
561 Config->get_monitor_bus_preferred_bundle())
567 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
568 uint32_t mod = _engine.n_physical_outputs (*t);
569 uint32_t limit = _monitor_out->n_outputs().get(*t);
571 for (uint32_t n = 0; n < limit; ++n) {
573 Port* p = _monitor_out->output()->ports().port(*t, n);
574 string connect_to = _engine.get_nth_physical_output (*t, (n % mod));
576 if (!connect_to.empty()) {
577 if (_monitor_out->output()->connect (p, connect_to, this)) {
578 error << string_compose (
579 _("cannot connect control output %1 to %2"),
592 /* catch up on send+insert cnts */
594 _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
596 /* hook us up to the engine */
598 BootMessage (_("Connect to engine"));
600 _engine.set_session (this);
604 Session::hookup_io ()
606 /* stop graph reordering notifications from
607 causing resorts, etc.
610 _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
615 /* we delay creating the auditioner till now because
616 it makes its own connections to ports.
620 Auditioner* a = new Auditioner (*this);
623 throw failed_constructor();
625 a->use_new_diskstream ();
626 auditioner.reset (a);
629 catch (failed_constructor& err) {
630 warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
634 /* load bundles, which we may have postponed earlier on */
635 if (_bundle_xml_node) {
636 load_bundles (*_bundle_xml_node);
637 delete _bundle_xml_node;
640 /* Tell all IO objects to connect themselves together */
642 IO::enable_connecting ();
643 MIDI::Port::MakeConnections ();
645 /* Now reset all panners */
647 Delivery::reset_panners ();
649 /* Connect tracks to monitor/listen bus if there is one.
650 Note that in an existing session, the internal sends will
651 already exist, but we want the routes to notice that
652 they connect to the control out specifically.
656 boost::shared_ptr<RouteList> r = routes.reader ();
657 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
659 if ((*x)->is_monitor()) {
663 } else if ((*x)->is_master()) {
669 (*x)->listen_via (_monitor_out,
670 (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader),
676 /* Anyone who cares about input state, wake up and do something */
678 IOConnectionsComplete (); /* EMIT SIGNAL */
680 _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
682 /* now handle the whole enchilada as if it was one
688 /* update the full solo state, which can't be
689 correctly determined on a per-route basis, but
690 needs the global overview that only the session
694 update_route_solo_state ();
698 Session::playlist_length_changed ()
700 update_session_range_location_marker ();
704 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
706 boost::shared_ptr<Track> track = wp.lock ();
711 boost::shared_ptr<Playlist> playlist;
713 if ((playlist = track->playlist()) != 0) {
714 playlist->LengthChanged.connect_same_thread (*this, boost::bind (&Session::playlist_length_changed, this));
717 update_session_range_location_marker ();
721 Session::record_enabling_legal () const
723 /* this used to be in here, but survey says.... we don't need to restrict it */
724 // if (record_status() == Recording) {
728 if (Config->get_all_safe()) {
735 Session::reset_input_monitor_state ()
737 if (transport_rolling()) {
739 boost::shared_ptr<RouteList> rl = routes.reader ();
740 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
741 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
742 if (tr && tr->record_enabled ()) {
743 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
744 tr->monitor_input (Config->get_monitoring_model() == HardwareMonitoring && !config.get_auto_input());
750 boost::shared_ptr<RouteList> rl = routes.reader ();
751 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
752 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
753 if (tr && tr->record_enabled ()) {
754 //cerr << "switching to input = " << !Config->get_auto_input() << __FILE__ << __LINE__ << endl << endl;
755 tr->monitor_input (Config->get_monitoring_model() == HardwareMonitoring);
762 Session::auto_punch_start_changed (Location* location)
764 replace_event (SessionEvent::PunchIn, location->start());
766 if (get_record_enabled() && config.get_punch_in()) {
767 /* capture start has been changed, so save new pending state */
768 save_state ("", true);
773 Session::auto_punch_end_changed (Location* location)
775 nframes_t when_to_stop = location->end();
776 // when_to_stop += _worst_output_latency + _worst_input_latency;
777 replace_event (SessionEvent::PunchOut, when_to_stop);
781 Session::auto_punch_changed (Location* location)
783 nframes_t when_to_stop = location->end();
785 replace_event (SessionEvent::PunchIn, location->start());
786 //when_to_stop += _worst_output_latency + _worst_input_latency;
787 replace_event (SessionEvent::PunchOut, when_to_stop);
791 Session::auto_loop_changed (Location* location)
793 replace_event (SessionEvent::AutoLoop, location->end(), location->start());
795 if (transport_rolling() && play_loop) {
798 // if (_transport_frame > location->end()) {
800 if (_transport_frame < location->start() || _transport_frame > location->end()) {
801 // relocate to beginning of loop
802 clear_events (SessionEvent::LocateRoll);
804 request_locate (location->start(), true);
807 else if (Config->get_seamless_loop() && !loop_changing) {
809 // schedule a locate-roll to refill the diskstreams at the
811 loop_changing = true;
813 if (location->end() > last_loopend) {
814 clear_events (SessionEvent::LocateRoll);
815 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
822 last_loopend = location->end();
826 Session::set_auto_punch_location (Location* location)
830 if ((existing = _locations.auto_punch_location()) != 0 && existing != location) {
831 punch_connections.drop_connections();
832 existing->set_auto_punch (false, this);
833 remove_event (existing->start(), SessionEvent::PunchIn);
834 clear_events (SessionEvent::PunchOut);
835 auto_punch_location_changed (0);
844 if (location->end() <= location->start()) {
845 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
849 punch_connections.drop_connections ();
851 location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
852 location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
853 location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
855 location->set_auto_punch (true, this);
857 auto_punch_changed (location);
859 auto_punch_location_changed (location);
863 Session::set_auto_loop_location (Location* location)
867 if ((existing = _locations.auto_loop_location()) != 0 && existing != location) {
868 loop_connections.drop_connections ();
869 existing->set_auto_loop (false, this);
870 remove_event (existing->end(), SessionEvent::AutoLoop);
871 auto_loop_location_changed (0);
880 if (location->end() <= location->start()) {
881 error << _("Session: you can't use a mark for auto loop") << endmsg;
885 last_loopend = location->end();
887 loop_connections.drop_connections ();
889 location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
890 location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
891 location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
893 location->set_auto_loop (true, this);
895 /* take care of our stuff first */
897 auto_loop_changed (location);
899 /* now tell everyone else */
901 auto_loop_location_changed (location);
905 Session::locations_added (Location *)
911 Session::locations_changed ()
913 _locations.apply (*this, &Session::handle_locations_changed);
917 Session::handle_locations_changed (Locations::LocationList& locations)
919 Locations::LocationList::iterator i;
921 bool set_loop = false;
922 bool set_punch = false;
924 for (i = locations.begin(); i != locations.end(); ++i) {
928 if (location->is_auto_punch()) {
929 set_auto_punch_location (location);
932 if (location->is_auto_loop()) {
933 set_auto_loop_location (location);
937 if (location->is_session_range()) {
938 _session_range_location = location;
943 set_auto_loop_location (0);
946 set_auto_punch_location (0);
953 Session::enable_record ()
956 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
958 if (rs == Recording) {
962 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
964 _last_record_location = _transport_frame;
965 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
967 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
969 boost::shared_ptr<RouteList> rl = routes.reader ();
970 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
971 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
972 if (tr && tr->record_enabled ()) {
973 tr->monitor_input (true);
978 RecordStateChanged ();
985 Session::disable_record (bool rt_context, bool force)
989 if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
991 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
992 g_atomic_int_set (&_record_status, Disabled);
993 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
995 if (rs == Recording) {
996 g_atomic_int_set (&_record_status, Enabled);
1000 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1002 boost::shared_ptr<RouteList> rl = routes.reader ();
1003 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1004 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1005 if (tr && tr->record_enabled ()) {
1006 tr->monitor_input (false);
1011 RecordStateChanged (); /* emit signal */
1014 remove_pending_capture_state ();
1020 Session::step_back_from_record ()
1022 if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1024 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1025 boost::shared_ptr<RouteList> rl = routes.reader ();
1026 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1027 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1028 if (tr && tr->record_enabled ()) {
1029 //cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl;
1030 tr->monitor_input (false);
1038 Session::maybe_enable_record ()
1040 g_atomic_int_set (&_record_status, Enabled);
1042 /* this function is currently called from somewhere other than an RT thread.
1043 this save_state() call therefore doesn't impact anything.
1046 save_state ("", true);
1048 if (_transport_speed) {
1049 if (!config.get_punch_in()) {
1053 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1054 RecordStateChanged (); /* EMIT SIGNAL */
1061 Session::audible_frame () const
1067 /* the first of these two possible settings for "offset"
1068 mean that the audible frame is stationary until
1069 audio emerges from the latency compensation
1072 the second means that the audible frame is stationary
1073 until audio would emerge from a physical port
1074 in the absence of any plugin latency compensation
1077 offset = _worst_output_latency;
1079 if (offset > current_block_size) {
1080 offset -= current_block_size;
1082 /* XXX is this correct? if we have no external
1083 physical connections and everything is internal
1084 then surely this is zero? still, how
1085 likely is that anyway?
1087 offset = current_block_size;
1090 if (synced_to_jack()) {
1091 tf = _engine.transport_frame();
1093 tf = _transport_frame;
1098 if (!non_realtime_work_pending()) {
1102 /* Check to see if we have passed the first guaranteed
1103 audible frame past our last start position. if not,
1104 return that last start point because in terms
1105 of audible frames, we have not moved yet.
1107 `Start position' in this context means the time we last
1108 either started or changed transport direction.
1111 if (_transport_speed > 0.0f) {
1113 if (!play_loop || !have_looped) {
1114 if (tf < _last_roll_or_reversal_location + offset) {
1115 return _last_roll_or_reversal_location;
1123 } else if (_transport_speed < 0.0f) {
1125 /* XXX wot? no backward looping? */
1127 if (tf > _last_roll_or_reversal_location - offset) {
1128 return _last_roll_or_reversal_location;
1140 Session::set_frame_rate (nframes_t frames_per_second)
1142 /** \fn void Session::set_frame_size(nframes_t)
1143 the AudioEngine object that calls this guarantees
1144 that it will not be called while we are also in
1145 ::process(). Its fine to do things that block
1149 _base_frame_rate = frames_per_second;
1153 Automatable::set_automation_interval ((jack_nframes_t) ceil ((double) frames_per_second * (0.001 * Config->get_automation_interval())));
1157 // XXX we need some equivalent to this, somehow
1158 // SndFileSource::setup_standard_crossfades (frames_per_second);
1162 /* XXX need to reset/reinstantiate all LADSPA plugins */
1166 Session::set_block_size (nframes_t nframes)
1168 /* the AudioEngine guarantees
1169 that it will not be called while we are also in
1170 ::process(). It is therefore fine to do things that block
1175 current_block_size = nframes;
1179 boost::shared_ptr<RouteList> r = routes.reader ();
1181 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1182 (*i)->set_block_size (nframes);
1185 boost::shared_ptr<RouteList> rl = routes.reader ();
1186 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1187 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1189 tr->set_block_size (nframes);
1193 set_worst_io_latencies ();
1198 Session::set_default_fade (float /*steepness*/, float /*fade_msecs*/)
1201 nframes_t fade_frames;
1203 /* Don't allow fade of less 1 frame */
1205 if (fade_msecs < (1000.0 * (1.0/_current_frame_rate))) {
1212 fade_frames = (nframes_t) floor (fade_msecs * _current_frame_rate * 0.001);
1216 default_fade_msecs = fade_msecs;
1217 default_fade_steepness = steepness;
1220 // jlc, WTF is this!
1221 Glib::RWLock::ReaderLock lm (route_lock);
1222 AudioRegion::set_default_fade (steepness, fade_frames);
1227 /* XXX have to do this at some point */
1228 /* foreach region using default fade, reset, then
1229 refill_all_diskstream_buffers ();
1234 struct RouteSorter {
1235 bool operator() (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> r2) {
1236 if (r2->feeds (r1)) {
1238 } else if (r1->feeds (r2)) {
1241 if (r1->not_fed ()) {
1242 if (r2->not_fed ()) {
1243 /* no ardour-based connections inbound to either route. just use signal order */
1244 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1246 /* r2 has connections, r1 does not; run r1 early */
1250 return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1257 trace_terminal (shared_ptr<Route> r1, shared_ptr<Route> rbase)
1259 shared_ptr<Route> r2;
1261 if (r1->feeds (rbase) && rbase->feeds (r1)) {
1262 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1266 /* make a copy of the existing list of routes that feed r1 */
1268 Route::FedBy existing (r1->fed_by());
1270 /* for each route that feeds r1, recurse, marking it as feeding
1274 for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1275 if (!(r2 = i->r.lock ())) {
1276 /* (*i) went away, ignore it */
1280 /* r2 is a route that feeds r1 which somehow feeds base. mark
1281 base as being fed by r2
1284 rbase->add_fed_by (r2, i->sends_only);
1288 /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1292 if (r1->feeds (r2) && r2->feeds (r1)) {
1296 /* now recurse, so that we can mark base as being fed by
1297 all routes that feed r2
1300 trace_terminal (r2, rbase);
1307 Session::resort_routes ()
1309 /* don't do anything here with signals emitted
1310 by Routes while we are being destroyed.
1313 if (_state_of_the_state & Deletion) {
1318 RCUWriter<RouteList> writer (routes);
1319 shared_ptr<RouteList> r = writer.get_copy ();
1320 resort_routes_using (r);
1321 /* writer goes out of scope and forces update */
1324 //route_graph->dump(1);
1327 boost::shared_ptr<RouteList> rl = routes.reader ();
1328 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1329 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1331 const Route::FedBy& fb ((*i)->fed_by());
1333 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1334 boost::shared_ptr<Route> sf = f->r.lock();
1336 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1344 Session::resort_routes_using (shared_ptr<RouteList> r)
1346 RouteList::iterator i, j;
1348 for (i = r->begin(); i != r->end(); ++i) {
1350 (*i)->clear_fed_by ();
1352 for (j = r->begin(); j != r->end(); ++j) {
1354 /* although routes can feed themselves, it will
1355 cause an endless recursive descent if we
1356 detect it. so don't bother checking for
1364 bool via_sends_only;
1366 if ((*j)->direct_feeds (*i, &via_sends_only)) {
1367 (*i)->add_fed_by (*j, via_sends_only);
1372 for (i = r->begin(); i != r->end(); ++i) {
1373 trace_terminal (*i, *i);
1379 route_graph->rechain (r);
1382 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1383 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1384 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1385 (*i)->name(), (*i)->order_key ("signal")));
1391 /** Find the route name starting with \a base with the lowest \a id.
1393 * Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1394 * The available route name with the lowest ID will be used, and \a id
1395 * will be set to the ID.
1397 * \return false if a route name could not be found, and \a track_name
1398 * and \a id do not reflect a free route name.
1401 Session::find_route_name (const char* base, uint32_t& id, char* name, size_t name_len)
1404 snprintf (name, name_len, "%s %" PRIu32, base, id);
1406 if (route_by_name (name) == 0) {
1412 } while (id < (UINT_MAX-1));
1418 Session::count_existing_route_channels (ChanCount& in, ChanCount& out)
1420 in = ChanCount::ZERO;
1421 out = ChanCount::ZERO;
1422 shared_ptr<RouteList> r = routes.reader ();
1423 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1424 if (!(*i)->is_hidden()) {
1425 in += (*i)->n_inputs();
1426 out += (*i)->n_outputs();
1431 list<boost::shared_ptr<MidiTrack> >
1432 Session::new_midi_track (TrackMode mode, RouteGroup* route_group, uint32_t how_many)
1434 char track_name[32];
1435 uint32_t track_id = 0;
1436 ChanCount existing_inputs;
1437 ChanCount existing_outputs;
1439 RouteList new_routes;
1440 list<boost::shared_ptr<MidiTrack> > ret;
1441 uint32_t control_id;
1443 count_existing_route_channels (existing_inputs, existing_outputs);
1445 control_id = ntracks() + nbusses();
1448 if (!find_route_name ("Midi", ++track_id, track_name, sizeof(track_name))) {
1449 error << "cannot find name for new midi track" << endmsg;
1453 shared_ptr<MidiTrack> track;
1456 MidiTrack* mt = new MidiTrack (*this, track_name, Route::Flag (0), mode);
1463 mt->use_new_diskstream();
1465 boost_debug_shared_ptr_mark_interesting (mt, "Track");
1466 track = boost::shared_ptr<MidiTrack>(mt);
1468 if (track->input()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1469 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1474 if (track->output()->ensure_io (ChanCount(DataType::MIDI, 1), false, this)) {
1475 error << "cannot configure 1 in/1 out configuration for new midi track" << endmsg;
1479 auto_connect_route (track, existing_inputs, existing_outputs);
1481 track->non_realtime_input_change();
1484 route_group->add (track);
1487 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1488 track->set_remote_control_id (control_id);
1490 new_routes.push_back (track);
1491 ret.push_back (track);
1494 catch (failed_constructor &err) {
1495 error << _("Session: could not create new midi track.") << endmsg;
1499 catch (AudioEngine::PortRegistrationFailure& pfe) {
1501 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;
1509 if (!new_routes.empty()) {
1510 add_routes (new_routes, false);
1511 save_state (_current_snapshot_name);
1518 Session::auto_connect_route (boost::shared_ptr<Route> route,
1519 ChanCount& existing_inputs, ChanCount& existing_outputs)
1521 /* If both inputs and outputs are auto-connected to physical ports,
1522 use the max of input and output offsets to ensure auto-connected
1523 port numbers always match up (e.g. the first audio input and the
1524 first audio output of the route will have the same physical
1525 port number). Otherwise just use the lowest input or output
1528 const bool in_out_physical =
1529 (Config->get_input_auto_connect() & AutoConnectPhysical)
1530 && (Config->get_output_auto_connect() & AutoConnectPhysical);
1532 const ChanCount in_offset = in_out_physical
1533 ? ChanCount::max(existing_inputs, existing_outputs)
1536 const ChanCount out_offset = in_out_physical
1537 ? ChanCount::max(existing_inputs, existing_outputs)
1540 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1541 vector<string> physinputs;
1542 vector<string> physoutputs;
1544 _engine.get_physical_outputs (*t, physoutputs);
1545 _engine.get_physical_inputs (*t, physinputs);
1547 if (!physinputs.empty()) {
1548 uint32_t nphysical_in = physinputs.size();
1549 for (uint32_t i = 0; i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1552 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1553 port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1556 if (!port.empty() && route->input()->connect (
1557 route->input()->ports().port(*t, i), port, this)) {
1563 if (!physoutputs.empty()) {
1564 uint32_t nphysical_out = physoutputs.size();
1565 for (uint32_t i = 0; i < route->n_outputs().get(*t); ++i) {
1568 if (Config->get_output_auto_connect() & AutoConnectPhysical) {
1569 port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1570 } else if (Config->get_output_auto_connect() & AutoConnectMaster) {
1571 if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1572 port = _master_out->input()->ports().port(*t,
1573 i % _master_out->input()->n_ports().get(*t))->name();
1577 if (!port.empty() && route->output()->connect (
1578 route->output()->ports().port(*t, i), port, this)) {
1585 existing_inputs += route->n_inputs();
1586 existing_outputs += route->n_outputs();
1589 list< boost::shared_ptr<AudioTrack> >
1590 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group, uint32_t how_many)
1592 char track_name[32];
1593 uint32_t track_id = 0;
1594 ChanCount existing_inputs;
1595 ChanCount existing_outputs;
1597 RouteList new_routes;
1598 list<boost::shared_ptr<AudioTrack> > ret;
1599 uint32_t control_id;
1601 count_existing_route_channels (existing_inputs, existing_outputs);
1603 control_id = ntracks() + nbusses() + 1;
1606 if (!find_route_name ("Audio", ++track_id, track_name, sizeof(track_name))) {
1607 error << "cannot find name for new audio track" << endmsg;
1611 shared_ptr<AudioTrack> track;
1614 AudioTrack* at = new AudioTrack (*this, track_name, Route::Flag (0), mode);
1621 at->use_new_diskstream();
1623 boost_debug_shared_ptr_mark_interesting (at, "Track");
1624 track = boost::shared_ptr<AudioTrack>(at);
1626 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1627 error << string_compose (
1628 _("cannot configure %1 in/%2 out configuration for new audio track"),
1629 input_channels, output_channels)
1634 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1635 error << string_compose (
1636 _("cannot configure %1 in/%2 out configuration for new audio track"),
1637 input_channels, output_channels)
1642 auto_connect_route (track, existing_inputs, existing_outputs);
1645 route_group->add (track);
1648 track->non_realtime_input_change();
1650 track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1651 track->set_remote_control_id (control_id);
1654 new_routes.push_back (track);
1655 ret.push_back (track);
1658 catch (failed_constructor &err) {
1659 error << _("Session: could not create new audio track.") << endmsg;
1663 catch (AudioEngine::PortRegistrationFailure& pfe) {
1665 error << pfe.what() << endmsg;
1673 if (!new_routes.empty()) {
1674 add_routes (new_routes, true);
1681 Session::set_remote_control_ids ()
1683 RemoteModel m = Config->get_remote_model();
1684 bool emit_signal = false;
1686 shared_ptr<RouteList> r = routes.reader ();
1688 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1689 if (MixerOrdered == m) {
1690 long order = (*i)->order_key(N_("signal"));
1691 (*i)->set_remote_control_id (order+1, false);
1693 } else if (EditorOrdered == m) {
1694 long order = (*i)->order_key(N_("editor"));
1695 (*i)->set_remote_control_id (order+1, false);
1697 } else if (UserOrdered == m) {
1698 //do nothing ... only changes to remote id's are initiated by user
1703 Route::RemoteControlIDChange();
1709 Session::new_audio_route (bool aux, int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many)
1712 uint32_t bus_id = 0;
1713 ChanCount existing_inputs;
1714 ChanCount existing_outputs;
1717 uint32_t control_id;
1719 count_existing_route_channels (existing_inputs, existing_outputs);
1721 control_id = ntracks() + nbusses() + 1;
1724 if (!find_route_name ("Bus", ++bus_id, bus_name, sizeof(bus_name))) {
1725 error << "cannot find name for new audio bus" << endmsg;
1730 Route* rt = new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO);
1737 boost_debug_shared_ptr_mark_interesting (rt, "Route");
1738 shared_ptr<Route> bus (rt);
1740 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1741 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1742 input_channels, output_channels)
1748 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1749 error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1750 input_channels, output_channels)
1755 auto_connect_route (bus, existing_inputs, existing_outputs);
1758 route_group->add (bus);
1760 bus->set_remote_control_id (control_id);
1764 bus->add_internal_return ();
1767 ret.push_back (bus);
1771 catch (failed_constructor &err) {
1772 error << _("Session: could not create new audio route.") << endmsg;
1776 catch (AudioEngine::PortRegistrationFailure& pfe) {
1777 error << pfe.what() << endmsg;
1787 add_routes (ret, true);
1795 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
1799 uint32_t control_id;
1801 uint32_t number = 0;
1803 if (!tree.read (template_path.c_str())) {
1807 XMLNode* node = tree.root();
1809 control_id = ntracks() + nbusses() + 1;
1813 XMLNode node_copy (*node); // make a copy so we can change the name if we need to
1815 std::string node_name = IO::name_from_state (*node_copy.children().front());
1817 /* generate a new name by adding a number to the end of the template name */
1818 if (!find_route_name (node_name.c_str(), ++number, name, sizeof(name))) {
1819 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
1823 /* set IO children to use the new name */
1824 XMLNodeList const & children = node_copy.children ();
1825 for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
1826 if ((*i)->name() == IO::state_node_name) {
1827 IO::set_name_in_state (**i, name);
1831 Track::zero_diskstream_id_in_xml (node_copy);
1834 shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
1837 error << _("Session: cannot create track/bus from template description") << endmsg;
1841 if (boost::dynamic_pointer_cast<Track>(route)) {
1842 /* force input/output change signals so that the new diskstream
1843 picks up the configuration of the route. During session
1844 loading this normally happens in a different way.
1846 route->input()->changed (IOChange (ConfigurationChanged|ConnectionsChanged), this);
1847 route->output()->changed (IOChange (ConfigurationChanged|ConnectionsChanged), this);
1850 route->set_remote_control_id (control_id);
1853 ret.push_back (route);
1856 catch (failed_constructor &err) {
1857 error << _("Session: could not create new route from template") << endmsg;
1861 catch (AudioEngine::PortRegistrationFailure& pfe) {
1862 error << pfe.what() << endmsg;
1871 add_routes (ret, true);
1878 Session::add_routes (RouteList& new_routes, bool save)
1881 RCUWriter<RouteList> writer (routes);
1882 shared_ptr<RouteList> r = writer.get_copy ();
1883 r->insert (r->end(), new_routes.begin(), new_routes.end());
1886 /* if there is no control out and we're not in the middle of loading,
1887 resort the graph here. if there is a control out, we will resort
1888 toward the end of this method. if we are in the middle of loading,
1889 we will resort when done.
1892 if (!_monitor_out && IO::connecting_legal) {
1893 resort_routes_using (r);
1897 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
1899 boost::weak_ptr<Route> wpr (*x);
1900 boost::shared_ptr<Route> r (*x);
1902 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
1903 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
1904 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
1905 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
1906 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
1907 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
1909 if (r->is_master()) {
1913 if (r->is_monitor()) {
1917 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
1919 tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
1920 track_playlist_changed (boost::weak_ptr<Track> (tr));
1921 tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
1925 if (_monitor_out && IO::connecting_legal) {
1927 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
1928 if ((*x)->is_monitor()) {
1930 } else if ((*x)->is_master()) {
1933 (*x)->listen_via (_monitor_out,
1934 (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader),
1945 save_state (_current_snapshot_name);
1948 RouteAdded (new_routes); /* EMIT SIGNAL */
1949 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
1953 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
1955 boost::shared_ptr<RouteList> r = routes.reader ();
1956 boost::shared_ptr<Send> s;
1960 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1961 if (boost::dynamic_pointer_cast<Track>(*i)) {
1962 if ((s = (*i)->internal_send_for (dest)) != 0) {
1963 s->amp()->gain_control()->set_value (0.0);
1970 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
1972 boost::shared_ptr<RouteList> r = routes.reader ();
1973 boost::shared_ptr<Send> s;
1977 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1978 if (boost::dynamic_pointer_cast<Track>(*i)) {
1979 if ((s = (*i)->internal_send_for (dest)) != 0) {
1980 s->amp()->gain_control()->set_value (1.0);
1987 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
1989 boost::shared_ptr<RouteList> r = routes.reader ();
1990 boost::shared_ptr<Send> s;
1994 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1995 if (boost::dynamic_pointer_cast<Track>(*i)) {
1996 if ((s = (*i)->internal_send_for (dest)) != 0) {
1997 s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2004 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p)
2006 boost::shared_ptr<RouteList> r = routes.reader ();
2007 boost::shared_ptr<RouteList> t (new RouteList);
2009 /* only send tracks */
2011 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2012 if (boost::dynamic_pointer_cast<Track>(*i)) {
2017 add_internal_sends (dest, p, t);
2021 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2023 if (dest->is_monitor() || dest->is_master()) {
2027 if (!dest->internal_return()) {
2028 dest->add_internal_return();
2031 for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2033 if ((*i)->is_monitor() || (*i)->is_master() || (*i) == dest) {
2037 (*i)->listen_via (dest, p, true, true);
2044 Session::remove_route (shared_ptr<Route> route)
2046 if (((route == _master_out) || (route == _monitor_out)) && !Config->get_allow_special_bus_removal()) {
2051 RCUWriter<RouteList> writer (routes);
2052 shared_ptr<RouteList> rs = writer.get_copy ();
2056 /* deleting the master out seems like a dumb
2057 idea, but its more of a UI policy issue
2061 if (route == _master_out) {
2062 _master_out = shared_ptr<Route> ();
2065 if (route == _monitor_out) {
2067 /* cancel control outs for all routes */
2069 for (RouteList::iterator r = rs->begin(); r != rs->end(); ++r) {
2070 (*r)->drop_listen (_monitor_out);
2073 _monitor_out.reset ();
2076 /* writer goes out of scope, forces route list update */
2079 update_route_solo_state ();
2080 update_session_range_location_marker ();
2082 // We need to disconnect the route's inputs and outputs
2084 route->input()->disconnect (0);
2085 route->output()->disconnect (0);
2087 /* if the route had internal sends sending to it, remove them */
2088 if (route->internal_return()) {
2090 boost::shared_ptr<RouteList> r = routes.reader ();
2091 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2092 boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2094 (*i)->remove_processor (s);
2099 update_latency_compensation (false, false);
2102 /* flush references out of the graph
2105 route_graph->clear_other_chain ();
2107 /* get rid of it from the dead wood collection in the route list manager */
2109 /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2113 /* try to cause everyone to drop their references */
2115 route->drop_references ();
2117 sync_order_keys (N_("session"));
2119 Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2121 /* save the new state of the world */
2123 if (save_state (_current_snapshot_name)) {
2124 save_history (_current_snapshot_name);
2129 Session::route_mute_changed (void* /*src*/)
2135 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2137 boost::shared_ptr<Route> route = wpr.lock();
2139 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2143 if (route->listening()) {
2145 if (Config->get_exclusive_solo()) {
2146 /* new listen: disable all other listen */
2147 shared_ptr<RouteList> r = routes.reader ();
2148 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2149 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2152 (*i)->set_listen (false, this);
2158 } else if (_listen_cnt > 0) {
2164 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2166 boost::shared_ptr<Route> route = wpr.lock ();
2169 /* should not happen */
2170 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2174 bool send_changed = false;
2176 if (route->solo_isolated()) {
2177 if (_solo_isolated_cnt == 0) {
2178 send_changed = true;
2180 _solo_isolated_cnt++;
2181 } else if (_solo_isolated_cnt > 0) {
2182 _solo_isolated_cnt--;
2183 if (_solo_isolated_cnt == 0) {
2184 send_changed = true;
2189 IsolatedChanged (); /* EMIT SIGNAL */
2194 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2196 if (!self_solo_change) {
2197 // session doesn't care about changes to soloed-by-others
2201 if (solo_update_disabled) {
2206 boost::shared_ptr<Route> route = wpr.lock ();
2209 /* should not happen */
2210 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2214 shared_ptr<RouteList> r = routes.reader ();
2217 if (route->self_soloed()) {
2223 if (delta == 1 && Config->get_exclusive_solo()) {
2224 /* new solo: disable all other solos */
2225 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2226 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2229 (*i)->set_solo (false, this);
2233 solo_update_disabled = true;
2235 RouteList uninvolved;
2237 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2238 bool via_sends_only;
2239 bool in_signal_flow;
2241 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2245 in_signal_flow = false;
2247 if ((*i)->feeds (route, &via_sends_only)) {
2248 if (!via_sends_only) {
2249 if (!route->soloed_by_others_upstream()) {
2250 (*i)->mod_solo_by_others_downstream (delta);
2252 in_signal_flow = true;
2256 if (route->feeds (*i, &via_sends_only)) {
2257 (*i)->mod_solo_by_others_upstream (delta);
2258 in_signal_flow = true;
2261 if (!in_signal_flow) {
2262 uninvolved.push_back (*i);
2266 solo_update_disabled = false;
2267 update_route_solo_state (r);
2269 /* now notify that the mute state of the routes not involved in the signal
2270 pathway of the just-solo-changed route may have altered.
2273 for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2274 (*i)->mute_changed (this);
2277 SoloChanged (); /* EMIT SIGNAL */
2282 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2284 /* now figure out if anything that matters is soloed (or is "listening")*/
2286 bool something_soloed = false;
2287 uint32_t listeners = 0;
2288 uint32_t isolated = 0;
2291 r = routes.reader();
2294 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2295 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2296 something_soloed = true;
2299 if (!(*i)->is_hidden() && (*i)->listening()) {
2300 if (Config->get_solo_control_is_listen_control()) {
2303 (*i)->set_listen (false, this);
2307 if ((*i)->solo_isolated()) {
2312 if (something_soloed != _non_soloed_outs_muted) {
2313 _non_soloed_outs_muted = something_soloed;
2314 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2317 _listen_cnt = listeners;
2319 if (isolated != _solo_isolated_cnt) {
2320 _solo_isolated_cnt = isolated;
2321 IsolatedChanged (); /* EMIT SIGNAL */
2325 boost::shared_ptr<RouteList>
2326 Session::get_routes_with_internal_returns() const
2328 shared_ptr<RouteList> r = routes.reader ();
2329 boost::shared_ptr<RouteList> rl (new RouteList);
2331 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2332 if ((*i)->internal_return ()) {
2340 Session::io_name_is_legal (const std::string& name)
2342 shared_ptr<RouteList> r = routes.reader ();
2344 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2345 if ((*i)->name() == name) {
2349 if ((*i)->has_io_processor_named (name)) {
2358 Session::route_by_name (string name)
2360 shared_ptr<RouteList> r = routes.reader ();
2362 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2363 if ((*i)->name() == name) {
2368 return shared_ptr<Route> ((Route*) 0);
2372 Session::route_by_id (PBD::ID id)
2374 shared_ptr<RouteList> r = routes.reader ();
2376 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2377 if ((*i)->id() == id) {
2382 return shared_ptr<Route> ((Route*) 0);
2386 Session::route_by_remote_id (uint32_t id)
2388 shared_ptr<RouteList> r = routes.reader ();
2390 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2391 if ((*i)->remote_control_id() == id) {
2396 return shared_ptr<Route> ((Route*) 0);
2399 /** If either end of the session range location marker lies inside the current
2400 * session extent, move it to the corresponding session extent.
2403 Session::update_session_range_location_marker ()
2405 if (_state_of_the_state & Loading) {
2409 pair<nframes_t, nframes_t> const ext = get_extent ();
2411 if (_session_range_location == 0) {
2412 /* we don't have a session range yet; use this one (provided it is valid) */
2413 if (ext.first != max_frames) {
2414 add_session_range_location (ext.first, ext.second);
2417 /* update the existing session range */
2418 if (ext.first < _session_range_location->start()) {
2419 _session_range_location->set_start (ext.first);
2423 if (ext.second > _session_range_location->end()) {
2424 _session_range_location->set_end (ext.second);
2431 /** @return Extent of the session's contents; if the session is empty, the first value of
2432 * the pair will equal max_frames.
2434 pair<nframes_t, nframes_t>
2435 Session::get_extent () const
2437 pair<nframes_t, nframes_t> ext (max_frames, 0);
2439 boost::shared_ptr<RouteList> rl = routes.reader ();
2440 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2441 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2442 if (!tr || tr->destructive()) {
2443 // ignore tape tracks when getting extents
2447 pair<nframes_t, nframes_t> e = tr->playlist()->get_extent ();
2448 if (e.first < ext.first) {
2449 ext.first = e.first;
2451 if (e.second > ext.second) {
2452 ext.second = e.second;
2459 /* Region management */
2461 boost::shared_ptr<Region>
2462 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2464 const RegionFactory::RegionMap& regions (RegionFactory::regions());
2465 RegionFactory::RegionMap::const_iterator i;
2466 boost::shared_ptr<Region> region;
2468 Glib::Mutex::Lock lm (region_lock);
2470 for (i = regions.begin(); i != regions.end(); ++i) {
2474 if (region->whole_file()) {
2476 if (child->source_equivalent (region)) {
2482 return boost::shared_ptr<Region> ();
2486 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2488 set<boost::shared_ptr<Region> > relevant_regions;
2490 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2491 RegionFactory::get_regions_using_source (*s, relevant_regions);
2494 cerr << "There are " << relevant_regions.size() << " using " << srcs.size() << " sources" << endl;
2496 for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2497 set<boost::shared_ptr<Region> >::iterator tmp;
2502 cerr << "Cleanup " << (*r)->name() << " UC = " << (*r).use_count() << endl;
2504 playlists->destroy_region (*r);
2505 RegionFactory::map_remove (*r);
2507 (*r)->drop_sources ();
2508 (*r)->drop_references ();
2510 cerr << "\tdone UC = " << (*r).use_count() << endl;
2512 relevant_regions.erase (r);
2517 for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2520 Glib::Mutex::Lock ls (source_lock);
2521 /* remove from the main source list */
2522 sources.erase ((*s)->id());
2525 (*s)->mark_for_remove ();
2526 (*s)->drop_references ();
2535 Session::remove_last_capture ()
2537 list<boost::shared_ptr<Source> > srcs;
2539 boost::shared_ptr<RouteList> rl = routes.reader ();
2540 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
2541 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
2546 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
2549 srcs.insert (srcs.end(), l.begin(), l.end());
2554 destroy_sources (srcs);
2556 save_state (_current_snapshot_name);
2561 /* Source Management */
2564 Session::add_source (boost::shared_ptr<Source> source)
2566 pair<SourceMap::key_type, SourceMap::mapped_type> entry;
2567 pair<SourceMap::iterator,bool> result;
2569 entry.first = source->id();
2570 entry.second = source;
2573 Glib::Mutex::Lock lm (source_lock);
2574 result = sources.insert (entry);
2577 if (result.second) {
2579 /* yay, new source */
2583 boost::shared_ptr<AudioFileSource> afs;
2585 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
2586 if (Config->get_auto_analyse_audio()) {
2587 Analyser::queue_source_for_analysis (source, false);
2594 Session::remove_source (boost::weak_ptr<Source> src)
2596 SourceMap::iterator i;
2597 boost::shared_ptr<Source> source = src.lock();
2604 Glib::Mutex::Lock lm (source_lock);
2606 if ((i = sources.find (source->id())) != sources.end()) {
2611 if (!_state_of_the_state & InCleanup) {
2613 /* save state so we don't end up with a session file
2614 referring to non-existent sources.
2617 save_state (_current_snapshot_name);
2621 boost::shared_ptr<Source>
2622 Session::source_by_id (const PBD::ID& id)
2624 Glib::Mutex::Lock lm (source_lock);
2625 SourceMap::iterator i;
2626 boost::shared_ptr<Source> source;
2628 if ((i = sources.find (id)) != sources.end()) {
2635 boost::shared_ptr<Source>
2636 Session::source_by_path_and_channel (const Glib::ustring& path, uint16_t chn)
2638 Glib::Mutex::Lock lm (source_lock);
2640 for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
2641 cerr << "comparing " << path << " with " << i->second->name() << endl;
2642 boost::shared_ptr<AudioFileSource> afs
2643 = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
2645 if (afs && afs->path() == path && chn == afs->channel()) {
2649 return boost::shared_ptr<Source>();
2654 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
2657 string old_basename = PBD::basename_nosuffix (oldname);
2658 string new_legalized = legalize_for_path (newname);
2660 /* note: we know (or assume) the old path is already valid */
2664 /* destructive file sources have a name of the form:
2666 /path/to/Tnnnn-NAME(%[LR])?.wav
2668 the task here is to replace NAME with the new name.
2671 /* find last slash */
2675 string::size_type slash;
2676 string::size_type dash;
2678 if ((slash = path.find_last_of ('/')) == string::npos) {
2682 dir = path.substr (0, slash+1);
2684 /* '-' is not a legal character for the NAME part of the path */
2686 if ((dash = path.find_last_of ('-')) == string::npos) {
2690 prefix = path.substr (slash+1, dash-(slash+1));
2695 path += new_legalized;
2696 path += ".wav"; /* XXX gag me with a spoon */
2700 /* non-destructive file sources have a name of the form:
2702 /path/to/NAME-nnnnn(%[LR])?.ext
2704 the task here is to replace NAME with the new name.
2709 string::size_type slash;
2710 string::size_type dash;
2711 string::size_type postfix;
2713 /* find last slash */
2715 if ((slash = path.find_last_of ('/')) == string::npos) {
2719 dir = path.substr (0, slash+1);
2721 /* '-' is not a legal character for the NAME part of the path */
2723 if ((dash = path.find_last_of ('-')) == string::npos) {
2727 suffix = path.substr (dash+1);
2729 // Suffix is now everything after the dash. Now we need to eliminate
2730 // the nnnnn part, which is done by either finding a '%' or a '.'
2732 postfix = suffix.find_last_of ("%");
2733 if (postfix == string::npos) {
2734 postfix = suffix.find_last_of ('.');
2737 if (postfix != string::npos) {
2738 suffix = suffix.substr (postfix);
2740 error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
2744 const uint32_t limit = 10000;
2745 char buf[PATH_MAX+1];
2747 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
2749 snprintf (buf, sizeof(buf), "%s%s-%u%s", dir.c_str(), newname.c_str(), cnt, suffix.c_str());
2751 if (access (buf, F_OK) != 0) {
2759 error << "FATAL ERROR! Could not find a " << endl;
2767 /** Return the full path (in some session directory) for a new within-session source.
2768 * \a name must be a session-unique name that does not contain slashes
2769 * (e.g. as returned by new_*_source_name)
2772 Session::new_source_path_from_name (DataType type, const string& name)
2774 assert(name.find("/") == string::npos);
2776 SessionDirectory sdir(get_best_session_directory_for_new_source());
2779 if (type == DataType::AUDIO) {
2780 p = sdir.sound_path();
2781 } else if (type == DataType::MIDI) {
2782 p = sdir.midi_path();
2784 error << "Unknown source type, unable to create file path" << endmsg;
2789 return p.to_string();
2793 Session::peak_path (Glib::ustring base) const
2795 sys::path peakfile_path(_session_dir->peak_path());
2796 peakfile_path /= basename_nosuffix (base) + peakfile_suffix;
2797 return peakfile_path.to_string();
2800 /** Return a unique name based on \a base for a new internal audio source */
2802 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
2806 char buf[PATH_MAX+1];
2807 const uint32_t limit = 10000;
2811 legalized = legalize_for_path (base);
2813 // Find a "version" of the base name that doesn't exist in any of the possible directories.
2814 for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
2816 vector<space_and_path>::iterator i;
2817 uint32_t existing = 0;
2819 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2821 SessionDirectory sdir((*i).path);
2823 spath = sdir.sound_path().to_string();
2828 snprintf (buf, sizeof(buf), "%s/T%04d-%s.wav",
2829 spath.c_str(), cnt, legalized.c_str());
2830 } else if (nchan == 2) {
2832 snprintf (buf, sizeof(buf), "%s/T%04d-%s%%L.wav",
2833 spath.c_str(), cnt, legalized.c_str());
2835 snprintf (buf, sizeof(buf), "%s/T%04d-%s%%R.wav",
2836 spath.c_str(), cnt, legalized.c_str());
2838 } else if (nchan < 26) {
2839 snprintf (buf, sizeof(buf), "%s/T%04d-%s%%%c.wav",
2840 spath.c_str(), cnt, legalized.c_str(), 'a' + chan);
2842 snprintf (buf, sizeof(buf), "%s/T%04d-%s.wav",
2843 spath.c_str(), cnt, legalized.c_str());
2852 snprintf (buf, sizeof(buf), "%s-%u.wav", spath.c_str(), cnt);
2853 } else if (nchan == 2) {
2855 snprintf (buf, sizeof(buf), "%s-%u%%L.wav", spath.c_str(), cnt);
2857 snprintf (buf, sizeof(buf), "%s-%u%%R.wav", spath.c_str(), cnt);
2859 } else if (nchan < 26) {
2860 snprintf (buf, sizeof(buf), "%s-%u%%%c.wav", spath.c_str(), cnt, 'a' + chan);
2862 snprintf (buf, sizeof(buf), "%s-%u.wav", spath.c_str(), cnt);
2866 if (sys::exists(buf)) {
2872 if (existing == 0) {
2877 error << string_compose(
2878 _("There are already %1 recordings for %2, which I consider too many."),
2879 limit, base) << endmsg;
2881 throw failed_constructor();
2885 return Glib::path_get_basename(buf);
2888 /** Create a new within-session audio source */
2889 boost::shared_ptr<AudioFileSource>
2890 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
2892 const string name = new_audio_source_name (n, n_chans, chan, destructive);
2893 const string path = new_source_path_from_name(DataType::AUDIO, name);
2895 return boost::dynamic_pointer_cast<AudioFileSource> (
2896 SourceFactory::createWritable (DataType::AUDIO, *this, path, destructive, frame_rate()));
2899 /** Return a unique name based on \a base for a new internal MIDI source */
2901 Session::new_midi_source_name (const string& base)
2904 char buf[PATH_MAX+1];
2905 const uint32_t limit = 10000;
2909 legalized = legalize_for_path (base);
2911 // Find a "version" of the file name that doesn't exist in any of the possible directories.
2912 for (cnt = 1; cnt <= limit; ++cnt) {
2914 vector<space_and_path>::iterator i;
2915 uint32_t existing = 0;
2917 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2919 SessionDirectory sdir((*i).path);
2921 sys::path p = sdir.midi_path();
2924 snprintf (buf, sizeof(buf), "%s-%u.mid", p.to_string().c_str(), cnt);
2926 if (sys::exists (buf)) {
2931 if (existing == 0) {
2936 error << string_compose(
2937 _("There are already %1 recordings for %2, which I consider too many."),
2938 limit, base) << endmsg;
2940 throw failed_constructor();
2944 return Glib::path_get_basename(buf);
2948 /** Create a new within-session MIDI source */
2949 boost::shared_ptr<MidiSource>
2950 Session::create_midi_source_for_session (Track* track, string const & n)
2952 /* try to use the existing write source for the track, to keep numbering sane
2956 /*MidiTrack* mt = dynamic_cast<Track*> (track);
2960 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
2963 assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
2964 return boost::dynamic_pointer_cast<MidiSource> (l.front());
2968 const string name = new_midi_source_name (n);
2969 const string path = new_source_path_from_name (DataType::MIDI, name);
2971 return boost::dynamic_pointer_cast<SMFSource> (
2972 SourceFactory::createWritable (
2973 DataType::MIDI, *this, path, false, frame_rate()));
2978 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
2980 if (playlist->hidden()) {
2984 playlists->add (playlist);
2987 playlist->release();
2994 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
2996 if (_state_of_the_state & Deletion) {
3000 boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3006 playlists->remove (playlist);
3012 Session::set_audition (boost::shared_ptr<Region> r)
3014 pending_audition_region = r;
3015 add_post_transport_work (PostTransportAudition);
3016 _butler->schedule_transport_work ();
3020 Session::audition_playlist ()
3022 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3023 ev->region.reset ();
3028 Session::non_realtime_set_audition ()
3030 if (!pending_audition_region) {
3031 auditioner->audition_current_playlist ();
3033 auditioner->audition_region (pending_audition_region);
3034 pending_audition_region.reset ();
3036 AuditionActive (true); /* EMIT SIGNAL */
3040 Session::audition_region (boost::shared_ptr<Region> r)
3042 SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3048 Session::cancel_audition ()
3050 if (auditioner->auditioning()) {
3051 auditioner->cancel_audition ();
3052 AuditionActive (false); /* EMIT SIGNAL */
3057 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3059 if (a->is_monitor()) {
3062 if (b->is_monitor()) {
3065 return a->order_key(N_("signal")) < b->order_key(N_("signal"));
3069 Session::remove_empty_sounds ()
3071 vector<string> audio_filenames;
3073 get_files_in_directory (_session_dir->sound_path(), audio_filenames);
3075 Glib::Mutex::Lock lm (source_lock);
3077 TapeFileMatcher tape_file_matcher;
3079 remove_if (audio_filenames.begin(), audio_filenames.end(),
3080 boost::bind (&TapeFileMatcher::matches, &tape_file_matcher, _1));
3082 for (vector<string>::iterator i = audio_filenames.begin(); i != audio_filenames.end(); ++i) {
3084 sys::path audio_file_path (_session_dir->sound_path());
3086 audio_file_path /= *i;
3088 if (AudioFileSource::is_empty (*this, audio_file_path.to_string())) {
3092 sys::remove (audio_file_path);
3093 const string peakfile = peak_path (audio_file_path.to_string());
3094 sys::remove (peakfile);
3096 catch (const sys::filesystem_error& err)
3098 error << err.what() << endmsg;
3105 Session::is_auditioning () const
3107 /* can be called before we have an auditioner object */
3109 return auditioner->auditioning();
3116 Session::graph_reordered ()
3118 /* don't do this stuff if we are setting up connections
3119 from a set_state() call or creating new tracks. Ditto for deletion.
3122 if (_state_of_the_state & (InitialConnecting|Deletion)) {
3126 /* every track/bus asked for this to be handled but it was deferred because
3127 we were connecting. do it now.
3130 request_input_change_handling ();
3134 /* force all diskstreams to update their capture offset values to
3135 reflect any changes in latencies within the graph.
3138 boost::shared_ptr<RouteList> rl = routes.reader ();
3139 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3140 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3142 tr->set_capture_offset ();
3148 Session::available_capture_duration ()
3150 float sample_bytes_on_disk = 4.0; // keep gcc happy
3152 switch (config.get_native_file_data_format()) {
3154 sample_bytes_on_disk = 4.0;
3158 sample_bytes_on_disk = 3.0;
3162 sample_bytes_on_disk = 2.0;
3166 /* impossible, but keep some gcc versions happy */
3167 fatal << string_compose (_("programming error: %1"),
3168 X_("illegal native file data format"))
3173 double scale = 4096.0 / sample_bytes_on_disk;
3175 if (_total_free_4k_blocks * scale > (double) max_frames) {
3179 return (nframes_t) floor (_total_free_4k_blocks * scale);
3183 Session::add_bundle (shared_ptr<Bundle> bundle)
3186 RCUWriter<BundleList> writer (_bundles);
3187 boost::shared_ptr<BundleList> b = writer.get_copy ();
3188 b->push_back (bundle);
3191 BundleAdded (bundle); /* EMIT SIGNAL */
3197 Session::remove_bundle (shared_ptr<Bundle> bundle)
3199 bool removed = false;
3202 RCUWriter<BundleList> writer (_bundles);
3203 boost::shared_ptr<BundleList> b = writer.get_copy ();
3204 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3206 if (i != b->end()) {
3213 BundleRemoved (bundle); /* EMIT SIGNAL */
3220 Session::bundle_by_name (string name) const
3222 boost::shared_ptr<BundleList> b = _bundles.reader ();
3224 for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3225 if ((*i)->name() == name) {
3230 return boost::shared_ptr<Bundle> ();
3234 Session::tempo_map_changed (const PropertyChange&)
3238 playlists->update_after_tempo_map_change ();
3243 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3244 * the given count with the current block size.
3247 Session::ensure_buffers (ChanCount howmany)
3249 BufferManager::ensure_buffers (howmany);
3253 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3255 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3256 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3261 Session::next_insert_id ()
3263 /* this doesn't really loop forever. just think about it */
3266 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3267 if (!insert_bitset[n]) {
3268 insert_bitset[n] = true;
3274 /* none available, so resize and try again */
3276 insert_bitset.resize (insert_bitset.size() + 16, false);
3281 Session::next_send_id ()
3283 /* this doesn't really loop forever. just think about it */
3286 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3287 if (!send_bitset[n]) {
3288 send_bitset[n] = true;
3294 /* none available, so resize and try again */
3296 send_bitset.resize (send_bitset.size() + 16, false);
3301 Session::next_return_id ()
3303 /* this doesn't really loop forever. just think about it */
3306 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3307 if (!return_bitset[n]) {
3308 return_bitset[n] = true;
3314 /* none available, so resize and try again */
3316 return_bitset.resize (return_bitset.size() + 16, false);
3321 Session::mark_send_id (uint32_t id)
3323 if (id >= send_bitset.size()) {
3324 send_bitset.resize (id+16, false);
3326 if (send_bitset[id]) {
3327 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3329 send_bitset[id] = true;
3333 Session::mark_return_id (uint32_t id)
3335 if (id >= return_bitset.size()) {
3336 return_bitset.resize (id+16, false);
3338 if (return_bitset[id]) {
3339 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3341 return_bitset[id] = true;
3345 Session::mark_insert_id (uint32_t id)
3347 if (id >= insert_bitset.size()) {
3348 insert_bitset.resize (id+16, false);
3350 if (insert_bitset[id]) {
3351 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3353 insert_bitset[id] = true;
3357 Session::unmark_send_id (uint32_t id)
3359 if (id < send_bitset.size()) {
3360 send_bitset[id] = false;
3365 Session::unmark_return_id (uint32_t id)
3367 if (id < return_bitset.size()) {
3368 return_bitset[id] = false;
3373 Session::unmark_insert_id (uint32_t id)
3375 if (id < insert_bitset.size()) {
3376 insert_bitset[id] = false;
3381 /* Named Selection management */
3383 boost::shared_ptr<NamedSelection>
3384 Session::named_selection_by_name (string name)
3386 Glib::Mutex::Lock lm (named_selection_lock);
3387 for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3388 if ((*i)->name == name) {
3392 return boost::shared_ptr<NamedSelection>();
3396 Session::add_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3399 Glib::Mutex::Lock lm (named_selection_lock);
3400 named_selections.insert (named_selections.begin(), named_selection);
3405 NamedSelectionAdded (); /* EMIT SIGNAL */
3409 Session::remove_named_selection (boost::shared_ptr<NamedSelection> named_selection)
3411 bool removed = false;
3414 Glib::Mutex::Lock lm (named_selection_lock);
3416 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3418 if (i != named_selections.end()) {
3419 named_selections.erase (i);
3426 NamedSelectionRemoved (); /* EMIT SIGNAL */
3431 Session::reset_native_file_format ()
3433 boost::shared_ptr<RouteList> rl = routes.reader ();
3434 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3435 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3437 tr->reset_write_sources (false);
3443 Session::route_name_unique (string n) const
3445 shared_ptr<RouteList> r = routes.reader ();
3447 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3448 if ((*i)->name() == n) {
3457 Session::route_name_internal (string n) const
3459 if (auditioner && auditioner->name() == n) {
3463 if (_click_io && _click_io->name() == n) {
3471 Session::freeze_all (InterThreadInfo& itt)
3473 shared_ptr<RouteList> r = routes.reader ();
3475 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3477 boost::shared_ptr<Track> t;
3479 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3480 /* XXX this is wrong because itt.progress will keep returning to zero at the start
3490 boost::shared_ptr<Region>
3491 Session::write_one_track (AudioTrack& track, nframes_t start, nframes_t end,
3492 bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3493 InterThreadInfo& itt, bool enable_processing)
3495 boost::shared_ptr<Region> result;
3496 boost::shared_ptr<Playlist> playlist;
3497 boost::shared_ptr<AudioFileSource> fsource;
3499 char buf[PATH_MAX+1];
3500 ChanCount nchans(track.n_channels());
3502 nframes_t this_chunk;
3505 SessionDirectory sdir(get_best_session_directory_for_new_source ());
3506 const string sound_dir = sdir.sound_path().to_string();
3507 nframes_t len = end - start;
3510 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3511 end, start) << endmsg;
3515 const nframes_t chunk_size = (256 * 1024)/4;
3517 // block all process callback handling
3519 block_processing ();
3521 /* call tree *MUST* hold route_lock */
3523 if ((playlist = track.playlist()) == 0) {
3527 /* external redirects will be a problem */
3529 if (track.has_external_redirects()) {
3533 for (uint32_t chan_n=0; chan_n < nchans.n_audio(); ++chan_n) {
3535 for (x = 0; x < 99999; ++x) {
3536 snprintf (buf, sizeof(buf), "%s/%s-%d-bounce-%" PRIu32 ".wav", sound_dir.c_str(), playlist->name().c_str(), chan_n, x+1);
3537 if (access (buf, F_OK) != 0) {
3543 error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3548 fsource = boost::dynamic_pointer_cast<AudioFileSource> (
3549 SourceFactory::createWritable (DataType::AUDIO, *this, buf, false, frame_rate()));
3552 catch (failed_constructor& err) {
3553 error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3557 srcs.push_back (fsource);
3560 /* XXX need to flush all redirects */
3565 /* create a set of reasonably-sized buffers */
3566 buffers.ensure_buffers(DataType::AUDIO, nchans.n_audio(), chunk_size);
3567 buffers.set_count(nchans);
3569 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3570 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3572 afs->prepare_for_peakfile_writes ();
3575 while (to_do && !itt.cancel) {
3577 this_chunk = min (to_do, chunk_size);
3579 if (track.export_stuff (buffers, start, this_chunk, enable_processing)) {
3584 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
3585 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3588 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
3594 start += this_chunk;
3595 to_do -= this_chunk;
3597 itt.progress = (float) (1.0 - ((double) to_do / len));
3606 xnow = localtime (&now);
3608 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3609 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3612 afs->update_header (position, *xnow, now);
3613 afs->flush_header ();
3617 /* construct a region to represent the bounced material */
3621 plist.add (Properties::start, 0);
3622 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
3623 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
3625 result = RegionFactory::create (srcs, plist);
3631 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3632 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3635 afs->mark_for_remove ();
3638 (*src)->drop_references ();
3642 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
3643 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
3646 afs->done_with_peakfile_writes ();
3650 unblock_processing ();
3656 Session::gain_automation_buffer() const
3658 return ProcessThread::gain_automation_buffer ();
3662 Session::pan_automation_buffer() const
3664 return ProcessThread::pan_automation_buffer ();
3668 Session::get_silent_buffers (ChanCount count)
3670 return ProcessThread::get_silent_buffers (count);
3672 assert(_silent_buffers->available() >= count);
3673 _silent_buffers->set_count(count);
3675 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3676 for (size_t i= 0; i < count.get(*t); ++i) {
3677 _silent_buffers->get(*t, i).clear();
3681 return *_silent_buffers;
3686 Session::get_scratch_buffers (ChanCount count)
3688 return ProcessThread::get_scratch_buffers (count);
3690 if (count != ChanCount::ZERO) {
3691 assert(_scratch_buffers->available() >= count);
3692 _scratch_buffers->set_count(count);
3694 _scratch_buffers->set_count (_scratch_buffers->available());
3697 return *_scratch_buffers;
3702 Session::get_mix_buffers (ChanCount count)
3704 return ProcessThread::get_mix_buffers (count);
3706 assert(_mix_buffers->available() >= count);
3707 _mix_buffers->set_count(count);
3708 return *_mix_buffers;
3713 Session::ntracks () const
3716 shared_ptr<RouteList> r = routes.reader ();
3718 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3719 if (boost::dynamic_pointer_cast<Track> (*i)) {
3728 Session::nbusses () const
3731 shared_ptr<RouteList> r = routes.reader ();
3733 for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3734 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
3743 Session::add_automation_list(AutomationList *al)
3745 automation_lists[al->id()] = al;
3749 Session::sync_order_keys (std::string const & base)
3751 if (deletion_in_progress()) {
3755 if (!Config->get_sync_all_route_ordering()) {
3756 /* leave order keys as they are */
3760 boost::shared_ptr<RouteList> r = routes.reader ();
3762 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3763 (*i)->sync_order_keys (base);
3766 Route::SyncOrderKeys (base); // EMIT SIGNAL
3768 /* this might not do anything */
3770 set_remote_control_ids ();
3773 /** @return true if there is at least one record-enabled track, otherwise false */
3775 Session::have_rec_enabled_track () const
3777 return g_atomic_int_get (&_have_rec_enabled_track) == 1;
3780 /** Update the state of our rec-enabled tracks flag */
3782 Session::update_have_rec_enabled_track ()
3784 boost::shared_ptr<RouteList> rl = routes.reader ();
3785 RouteList::iterator i = rl->begin();
3786 while (i != rl->end ()) {
3788 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3789 if (tr && tr->record_enabled ()) {
3796 int const old = g_atomic_int_get (&_have_rec_enabled_track);
3798 g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
3800 if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
3801 RecordStateChanged (); /* EMIT SIGNAL */
3806 Session::listen_position_changed ()
3810 switch (Config->get_listen_position()) {
3811 case AfterFaderListen:
3815 case PreFaderListen:
3820 boost::shared_ptr<RouteList> r = routes.reader ();
3822 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3823 (*i)->put_monitor_send_at (p);
3828 Session::solo_control_mode_changed ()
3830 /* cancel all solo or all listen when solo control mode changes */
3833 set_solo (get_routes(), false);
3834 } else if (listening()) {
3835 set_listen (get_routes(), false);
3839 /** Called when anything about any of our route groups changes (membership, state etc.) */
3841 Session::route_group_changed ()
3843 RouteGroupChanged (); /* EMIT SIGNAL */
3847 Session::get_available_sync_options () const
3849 vector<SyncSource> ret;
3851 ret.push_back (JACK);
3852 ret.push_back (MTC);
3853 ret.push_back (MIDIClock);
3858 boost::shared_ptr<RouteList>
3859 Session::get_routes_with_regions_at (nframes64_t const p) const
3861 shared_ptr<RouteList> r = routes.reader ();
3862 shared_ptr<RouteList> rl (new RouteList);
3864 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3865 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3870 boost::shared_ptr<Playlist> pl = tr->playlist ();
3875 if (pl->has_region_at (p)) {
3884 Session::goto_end ()
3886 if (_session_range_location) {
3887 request_locate (_session_range_location->end(), false);
3889 request_locate (0, false);
3894 Session::goto_start ()
3896 if (_session_range_location) {
3897 request_locate (_session_range_location->start(), false);
3899 request_locate (0, false);
3904 Session::set_session_start (nframes_t start)
3906 if (_session_range_location) {
3907 _session_range_location->set_start (start);
3909 add_session_range_location (start, start);
3914 Session::set_session_end (nframes_t end)
3916 if (_session_range_location) {
3917 _session_range_location->set_end (end);
3919 add_session_range_location (end, end);
3924 Session::current_start_frame () const
3926 return _session_range_location ? _session_range_location->start() : 0;
3930 Session::current_end_frame () const
3932 return _session_range_location ? _session_range_location->end() : 0;
3936 Session::add_session_range_location (nframes_t start, nframes_t end)
3938 _session_range_location = new Location (start, end, _("session"), Location::IsSessionRange);
3939 _locations.add (_session_range_location);