2 Copyright (C) 2006 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.
18 #include "pbd/error.h"
20 #include "ardour/amp.h"
21 #include "ardour/debug.h"
22 #include "ardour/delivery.h"
23 #include "ardour/diskstream.h"
24 #include "ardour/event_type_map.h"
25 #include "ardour/io_processor.h"
26 #include "ardour/meter.h"
27 #include "ardour/monitor_control.h"
28 #include "ardour/playlist.h"
29 #include "ardour/port.h"
30 #include "ardour/processor.h"
31 #include "ardour/profile.h"
32 #include "ardour/record_enable_control.h"
33 #include "ardour/record_safe_control.h"
34 #include "ardour/route_group_specialized.h"
35 #include "ardour/session.h"
36 #include "ardour/session_playlists.h"
37 #include "ardour/track.h"
38 #include "ardour/utils.h"
43 using namespace ARDOUR;
46 Track::Track (Session& sess, string name, PresentationInfo::Flag flag, TrackMode mode, DataType default_type)
47 : Route (sess, name, flag, default_type)
48 , _saved_meter_point (_meter_point)
51 _freeze_record.state = NoFreeze;
57 DEBUG_TRACE (DEBUG::Destruction, string_compose ("track %1 destructor\n", _name));
67 boost::shared_ptr<Route> rp (shared_from_this());
68 boost::shared_ptr<Track> rt = boost::dynamic_pointer_cast<Track> (rp);
70 _record_enable_control.reset (new RecordEnableControl (_session, EventTypeMap::instance().to_symbol (RecEnableAutomation), *this));
71 add_control (_record_enable_control);
73 _record_safe_control.reset (new RecordSafeControl (_session, EventTypeMap::instance().to_symbol (RecSafeAutomation), *this));
74 add_control (_record_safe_control);
76 _monitoring_control.reset (new MonitorControl (_session, EventTypeMap::instance().to_symbol (MonitoringAutomation), *this));
77 add_control (_monitoring_control);
79 _session.config.ParameterChanged.connect_same_thread (*this, boost::bind (&Track::parameter_changed, this, _1));
81 _monitoring_control->Changed.connect_same_thread (*this, boost::bind (&Track::monitoring_changed, this, _1, _2));
82 _record_safe_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_safe_changed, this, _1, _2));
83 _record_enable_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_enable_changed, this, _1, _2));
89 Track::use_new_diskstream ()
91 boost::shared_ptr<Diskstream> ds = create_diskstream ();
93 ds->do_refill_with_alloc ();
94 ds->set_block_size (_session.get_block_size ());
95 ds->playlist()->set_orig_track_id (id());
107 Track::state (bool full)
109 XMLNode& root (Route::state (full));
111 root.add_child_nocopy (_monitoring_control->get_state ());
112 root.add_child_nocopy (_record_safe_control->get_state ());
113 root.add_child_nocopy (_record_enable_control->get_state ());
115 root.add_property (X_("saved-meter-point"), enum_2_string (_saved_meter_point));
116 root.add_child_nocopy (_diskstream->get_state ());
122 Track::set_state (const XMLNode& node, int version)
124 if (Route::set_state (node, version)) {
130 if (version >= 3000) {
131 if ((child = find_named_node (node, X_("Diskstream"))) != 0) {
132 boost::shared_ptr<Diskstream> ds = diskstream_factory (*child);
133 ds->do_refill_with_alloc ();
139 _diskstream->playlist()->set_orig_track_id (id());
142 /* set rec-enable control *AFTER* setting up diskstream, because it may
143 want to operate on the diskstream as it sets its own state
146 XMLNodeList nlist = node.children();
147 for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
150 XMLProperty const * prop;
152 if (child->name() == Controllable::xml_node_name) {
153 if ((prop = child->property ("name")) == 0) {
157 if (prop->value() == _record_enable_control->name()) {
158 _record_enable_control->set_state (*child, version);
159 } else if (prop->value() == _record_safe_control->name()) {
160 _record_safe_control->set_state (*child, version);
161 } else if (prop->value() == _monitoring_control->name()) {
162 _monitoring_control->set_state (*child, version);
167 XMLProperty const * prop;
169 if ((prop = node.property (X_("saved-meter-point"))) != 0) {
170 _saved_meter_point = MeterPoint (string_2_enum (prop->value(), _saved_meter_point));
172 _saved_meter_point = _meter_point;
179 Track::get_template ()
181 return state (false);
184 Track::FreezeRecord::~FreezeRecord ()
186 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
192 Track::freeze_state() const
194 return _freeze_record.state;
200 bool will_record = true;
201 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
210 Track::prep_record_enabled (bool yn)
212 if (yn && _record_safe_control->get_value()) {
216 if (!can_be_record_enabled()) {
220 /* keep track of the meter point as it was before we rec-enabled */
221 if (!_diskstream->record_enabled()) {
222 _saved_meter_point = _meter_point;
228 will_follow = _diskstream->prep_record_enable ();
230 will_follow = _diskstream->prep_record_disable ();
235 if (_meter_point != MeterCustom) {
236 set_meter_point (MeterInput);
239 set_meter_point (_saved_meter_point);
247 Track::record_enable_changed (bool, Controllable::GroupControlDisposition)
249 _diskstream->set_record_enabled (_record_enable_control->get_value());
253 Track::record_safe_changed (bool, Controllable::GroupControlDisposition)
255 _diskstream->set_record_safe (_record_safe_control->get_value());
259 Track::can_be_record_safe ()
261 return !_record_enable_control->get_value() && _diskstream && _session.writable() && (_freeze_record.state != Frozen);
265 Track::can_be_record_enabled ()
267 return !_record_safe_control->get_value() && _diskstream && !_diskstream->record_safe() && _session.writable() && (_freeze_record.state != Frozen);
271 Track::parameter_changed (string const & p)
273 if (p == "track-name-number") {
274 resync_track_name ();
276 else if (p == "track-name-take") {
277 resync_track_name ();
279 else if (p == "take-name") {
280 if (_session.config.get_track_name_take()) {
281 resync_track_name ();
287 Track::resync_track_name ()
293 Track::set_name (const string& str)
297 if (_record_enable_control->get_value() && _session.actively_recording()) {
298 /* this messes things up if done while recording */
302 string diskstream_name = "";
303 if (_session.config.get_track_name_take () && !_session.config.get_take_name ().empty()) {
304 // Note: any text is fine, legalize_for_path() fixes this later
305 diskstream_name += _session.config.get_take_name ();
306 diskstream_name += "_";
308 const int64_t tracknumber = track_number();
309 if (tracknumber > 0 && _session.config.get_track_name_number()) {
310 char num[64], fmt[10];
311 snprintf(fmt, sizeof(fmt), "%%0%d" PRId64, _session.track_number_decimals());
312 snprintf(num, sizeof(num), fmt, tracknumber);
313 diskstream_name += num;
314 diskstream_name += "_";
316 diskstream_name += str;
318 if (diskstream_name == _diskstream_name) {
321 _diskstream_name = diskstream_name;
323 _diskstream->set_write_source_name (diskstream_name);
325 boost::shared_ptr<Track> me = boost::dynamic_pointer_cast<Track> (shared_from_this ());
326 if (_diskstream->playlist()->all_regions_empty () && _session.playlists->playlists_for_track (me).size() == 1) {
327 /* Only rename the diskstream (and therefore the playlist) if
328 a) the playlist has never had a region added to it and
329 b) there is only one playlist for this track.
331 If (a) is not followed, people can get confused if, say,
332 they have notes about a playlist with a given name and then
333 it changes (see mantis #4759).
335 If (b) is not followed, we rename the current playlist and not
336 the other ones, which is a bit confusing (see mantis #4977).
338 _diskstream->set_name (str);
341 /* save state so that the statefile fully reflects any filename changes */
343 if ((ret = Route::set_name (str)) == 0) {
344 _session.save_state ("");
351 Track::set_latency_compensation (framecnt_t longest_session_latency)
353 Route::set_latency_compensation (longest_session_latency);
354 _diskstream->set_roll_delay (_roll_delay);
358 Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
360 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
366 bool can_record = _session.actively_recording ();
368 /* no outputs? nothing to do ... what happens if we have sends etc. ? */
370 if (n_outputs().n_total() == 0 && !ARDOUR::Profile->get_mixbus()) {
371 //Note: Mixbus has its own output mechanism, so we should operate even if no explicit outputs are assigned
375 /* not active ... do the minimum possible by just outputting silence */
379 if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled())) {
385 if (session_state_changing) {
386 if (_session.transport_speed() != 0.0f) {
387 /* we're rolling but some state is changing (e.g. our diskstream contents)
388 so we cannot use them. Be silent till this is over. Don't declick.
390 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
392 passthru_silence (start_frame, end_frame, nframes, 0);
395 /* we're really not rolling, so we're either delivery silence or actually
396 monitoring, both of which are safe to do while session_state_changing is true.
400 _diskstream->check_record_status (start_frame, can_record);
404 MonitorState const s = monitoring_state ();
405 /* we are not rolling, so be silent even if we are monitoring disk, as there
406 will be no disk data coming in.
409 case MonitoringSilence:
415 case MonitoringInput:
423 //if we have an internal generator, let it play regardless of monitoring state
424 if (_have_internal_generator) {
428 _amp->apply_gain_automation (false);
430 /* if have_internal_generator, or .. */
434 if (_meter_point == MeterInput) {
435 /* still need input monitoring and metering */
437 bool const track_rec = _diskstream->record_enabled ();
438 bool const auto_input = _session.config.get_auto_input ();
439 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
440 bool const tape_machine_mode = Config->get_tape_machine_mode ();
441 bool no_meter = false;
443 /* this needs a proper K-map
444 * and should be separated into a function similar to monitoring_state()
445 * that also handles roll() states in audio_track.cc, midi_track.cc and route.cc
447 * see http://www.oofus.co.uk/ardour/Ardour3MonitorModesV3.pdf
449 if (!auto_input && !track_rec) {
452 else if (tape_machine_mode && !track_rec && auto_input) {
455 else if (!software_monitor && tape_machine_mode && !track_rec) {
458 else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) {
463 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
464 _meter->run (bufs, start_frame, end_frame, 1.0, nframes, true);
465 _input->process_input (boost::shared_ptr<Processor>(), start_frame, end_frame, speed(), nframes);
467 _input->process_input (_meter, start_frame, end_frame, speed(), nframes);
471 passthru_silence (start_frame, end_frame, nframes, 0);
475 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
477 fill_buffers_with_input (bufs, _input, nframes);
479 if (_meter_point == MeterInput) {
480 _meter->run (bufs, start_frame, end_frame, 1.0 /*speed()*/, nframes, true);
483 passthru (bufs, start_frame, end_frame, nframes, false);
486 flush_processor_buffers_locked (nframes);
492 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler)
494 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
496 framecnt_t playback_distance = _diskstream->calculate_playback_distance(nframes);
497 if (can_internal_playback_seek(playback_distance)) {
498 internal_playback_seek(playback_distance);
503 if (n_outputs().n_total() == 0 && _processors.empty()) {
513 _amp->apply_gain_automation(false);
516 flush_processor_buffers_locked (nframes);
518 framecnt_t playback_distance;
520 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
522 int const dret = _diskstream->process (bufs, _session.transport_frame(), nframes, playback_distance, false);
523 need_butler = _diskstream->commit (playback_distance);
528 Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
532 ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
533 diskstream_playlist_changed ();
534 ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
535 ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
539 Track::diskstream_playlist_changed ()
541 PlaylistChanged (); /* EMIT SIGNAL */
545 Track::diskstream_speed_changed ()
547 SpeedChanged (); /* EMIT SIGNAL */
551 Track::diskstream_alignment_style_changed ()
553 AlignmentStyleChanged (); /* EMIT SIGNAL */
556 boost::shared_ptr<Playlist>
559 return _diskstream->playlist ();
563 Track::request_input_monitoring (bool m)
565 _diskstream->request_input_monitoring (m);
569 Track::ensure_input_monitoring (bool m)
571 _diskstream->ensure_input_monitoring (m);
575 Track::destructive () const
577 return _diskstream->destructive ();
580 list<boost::shared_ptr<Source> > &
581 Track::last_capture_sources ()
583 return _diskstream->last_capture_sources ();
587 Track::set_capture_offset ()
589 _diskstream->set_capture_offset ();
593 Track::steal_write_source_name()
595 return _diskstream->steal_write_source_name ();
599 Track::reset_write_sources (bool r, bool force)
601 _diskstream->reset_write_sources (r, force);
605 Track::playback_buffer_load () const
607 return _diskstream->playback_buffer_load ();
611 Track::capture_buffer_load () const
613 return _diskstream->capture_buffer_load ();
619 return _diskstream->do_refill ();
623 Track::do_flush (RunContext c, bool force)
625 return _diskstream->do_flush (c, force);
629 Track::set_pending_overwrite (bool o)
631 _diskstream->set_pending_overwrite (o);
635 Track::seek (framepos_t p, bool complete_refill)
637 return _diskstream->seek (p, complete_refill);
641 Track::hidden () const
643 return _diskstream->hidden ();
647 Track::can_internal_playback_seek (framecnt_t p)
649 return _diskstream->can_internal_playback_seek (p);
653 Track::internal_playback_seek (framecnt_t p)
655 return _diskstream->internal_playback_seek (p);
659 Track::non_realtime_input_change ()
661 _diskstream->non_realtime_input_change ();
665 Track::non_realtime_locate (framepos_t p)
667 Route::non_realtime_locate (p);
670 /* don't waste i/o cycles and butler calls
671 for hidden (secret) tracks
673 _diskstream->non_realtime_locate (p);
678 Track::non_realtime_set_speed ()
680 _diskstream->non_realtime_set_speed ();
684 Track::overwrite_existing_buffers ()
686 return _diskstream->overwrite_existing_buffers ();
690 Track::get_captured_frames (uint32_t n) const
692 return _diskstream->get_captured_frames (n);
696 Track::set_loop (Location* l)
698 return _diskstream->set_loop (l);
702 Track::transport_looped (framepos_t p)
704 _diskstream->transport_looped (p);
708 Track::realtime_set_speed (double s, bool g)
710 return _diskstream->realtime_set_speed (s, g);
714 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
716 _diskstream->transport_stopped_wallclock (n, t, g);
720 Track::pending_overwrite () const
722 return _diskstream->pending_overwrite ();
726 Track::speed () const
728 return _diskstream->speed ();
732 Track::prepare_to_stop (framepos_t t, framepos_t a)
734 _diskstream->prepare_to_stop (t, a);
738 Track::set_slaved (bool s)
740 _diskstream->set_slaved (s);
746 return _diskstream->n_channels ();
750 Track::get_capture_start_frame (uint32_t n) const
752 return _diskstream->get_capture_start_frame (n);
756 Track::alignment_style () const
758 return _diskstream->alignment_style ();
762 Track::alignment_choice () const
764 return _diskstream->alignment_choice ();
768 Track::current_capture_start () const
770 return _diskstream->current_capture_start ();
774 Track::current_capture_end () const
776 return _diskstream->current_capture_end ();
780 Track::playlist_modified ()
782 _diskstream->playlist_modified ();
786 Track::use_playlist (boost::shared_ptr<Playlist> p)
788 int ret = _diskstream->use_playlist (p);
790 p->set_orig_track_id (id());
796 Track::use_copy_playlist ()
798 int ret = _diskstream->use_copy_playlist ();
801 _diskstream->playlist()->set_orig_track_id (id());
808 Track::use_new_playlist ()
810 int ret = _diskstream->use_new_playlist ();
813 _diskstream->playlist()->set_orig_track_id (id());
820 Track::set_align_style (AlignStyle s, bool force)
822 _diskstream->set_align_style (s, force);
826 Track::set_align_choice (AlignChoice s, bool force)
828 _diskstream->set_align_choice (s, force);
832 Track::using_diskstream_id (PBD::ID id) const
834 return (id == _diskstream->id ());
838 Track::set_block_size (pframes_t n)
840 Route::set_block_size (n);
841 _diskstream->set_block_size (n);
845 Track::adjust_playback_buffering ()
848 _diskstream->adjust_playback_buffering ();
853 Track::adjust_capture_buffering ()
856 _diskstream->adjust_capture_buffering ();
860 #ifdef USE_TRACKS_CODE_FEATURES
862 /* This is the Tracks version of Track::monitoring_state().
864 * Ardour developers: try to flag or fix issues if parts of the libardour API
865 * change in ways that invalidate this
869 Track::monitoring_state () const
871 /* Explicit requests */
873 if (_monitoring & MonitorInput) {
874 return MonitoringInput;
877 if (_monitoring & MonitorDisk) {
878 return MonitoringDisk;
881 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
882 I don't think it's ever going to be too pretty too look at.
885 // GZ: NOT USED IN TRACKS
886 //bool const auto_input = _session.config.get_auto_input ();
887 //bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
888 //bool const tape_machine_mode = Config->get_tape_machine_mode ();
890 bool const roll = _session.transport_rolling ();
891 bool const track_rec = _diskstream->record_enabled ();
892 bool session_rec = _session.actively_recording ();
896 if (!session_rec && roll) {
897 return MonitoringDisk;
899 return MonitoringInput;
905 return MonitoringDisk;
909 return MonitoringSilence;
914 /* This is the Ardour/Mixbus version of Track::monitoring_state().
916 * Tracks developers: do NOT modify this method under any circumstances.
920 Track::monitoring_state () const
922 /* Explicit requests */
923 MonitorChoice m (_monitoring_control->monitoring_choice());
925 if (m & MonitorInput) {
926 return MonitoringInput;
929 if (m & MonitorDisk) {
930 return MonitoringDisk;
933 switch (_session.config.get_session_monitoring ()) {
935 return MonitoringDisk;
938 return MonitoringInput;
944 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
945 I don't think it's ever going to be too pretty too look at.
948 bool const roll = _session.transport_rolling ();
949 bool const track_rec = _diskstream->record_enabled ();
950 bool const auto_input = _session.config.get_auto_input ();
951 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
952 bool const tape_machine_mode = Config->get_tape_machine_mode ();
955 /* I suspect that just use actively_recording() is good enough all the
956 * time, but just to keep the semantics the same as they were before
957 * sept 26th 2012, we differentiate between the cases where punch is
958 * enabled and those where it is not.
960 * rg: I suspect this is not the case: monitoring may differ
963 if (_session.config.get_punch_in() || _session.config.get_punch_out() || _session.preroll_record_punch_enabled ()) {
964 session_rec = _session.actively_recording ();
966 session_rec = _session.get_record_enabled();
971 if (!session_rec && roll && auto_input) {
972 return MonitoringDisk;
974 return software_monitor ? MonitoringInput : MonitoringSilence;
979 if (tape_machine_mode) {
981 return MonitoringDisk;
985 if (!roll && auto_input) {
986 return software_monitor ? MonitoringInput : MonitoringSilence;
988 return MonitoringDisk;
994 abort(); /* NOTREACHED */
995 return MonitoringSilence;
1001 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
1003 /* never declick if there is an internal generator - we just want it to
1004 keep generating sound without interruption.
1006 ditto if we are monitoring inputs.
1009 if (_have_internal_generator || (_monitoring_control->monitoring_choice() == MonitorInput)) {
1014 declick = _pending_declick;
1018 Amp::declick (bufs, nframes, declick);
1023 Track::check_initial_delay (framecnt_t nframes, framepos_t& transport_frame)
1025 if (_roll_delay > nframes) {
1027 _roll_delay -= nframes;
1028 silence_unlocked (nframes);
1029 /* transport frame is not legal for caller to use */
1032 } else if (_roll_delay > 0) {
1034 nframes -= _roll_delay;
1035 silence_unlocked (_roll_delay);
1036 transport_frame += _roll_delay;
1038 /* shuffle all the port buffers for things that lead "out" of this Route
1039 to reflect that we just wrote _roll_delay frames of silence.
1042 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1043 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1044 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
1046 iop->increment_port_buffer_offset (_roll_delay);
1049 _output->increment_port_buffer_offset (_roll_delay);
1059 Track::monitoring_changed (bool, Controllable::GroupControlDisposition)
1061 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1062 (*i)->monitoring_changed ();
1067 Track::metering_state () const
1070 if (_session.transport_rolling ()) {
1071 // audio_track.cc || midi_track.cc roll() runs meter IFF:
1072 rv = _meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled());
1074 // track no_roll() always metering if
1075 rv = _meter_point == MeterInput;
1077 return rv ? MeteringInput : MeteringRoute;