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/io_processor.h"
25 #include "ardour/meter.h"
26 #include "ardour/monitor_control.h"
27 #include "ardour/playlist.h"
28 #include "ardour/port.h"
29 #include "ardour/processor.h"
30 #include "ardour/record_enable_control.h"
31 #include "ardour/route_group_specialized.h"
32 #include "ardour/session.h"
33 #include "ardour/session_playlists.h"
34 #include "ardour/track.h"
35 #include "ardour/utils.h"
40 using namespace ARDOUR;
43 Track::Track (Session& sess, string name, PresentationInfo::Flag flag, TrackMode mode, DataType default_type)
44 : Route (sess, name, flag, default_type)
45 , _saved_meter_point (_meter_point)
48 _freeze_record.state = NoFreeze;
54 DEBUG_TRACE (DEBUG::Destruction, string_compose ("track %1 destructor\n", _name));
64 boost::shared_ptr<Route> rp (shared_from_this());
65 boost::shared_ptr<Track> rt = boost::dynamic_pointer_cast<Track> (rp);
67 _record_enable_control.reset (new RecordEnableControl (_session, X_("recenable"), *this));
68 add_control (_record_enable_control);
70 _record_safe_control.reset (new AutomationControl (_session, RecSafeAutomation, ParameterDescriptor (RecSafeAutomation),
71 boost::shared_ptr<AutomationList> (new AutomationList (Evoral::Parameter (RecSafeAutomation))),
73 add_control (_record_safe_control);
75 _monitoring_control.reset (new MonitorControl (_session, X_("monitoring"), *this));
76 add_control (_monitoring_control);
78 _session.config.ParameterChanged.connect_same_thread (*this, boost::bind (&Track::parameter_changed, this, _1));
80 _monitoring_control->Changed.connect_same_thread (*this, boost::bind (&Track::monitoring_changed, this, _1, _2));
81 _record_safe_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_safe_changed, this, _1, _2));
82 _record_enable_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_enable_changed, this, _1, _2));
88 Track::use_new_diskstream ()
90 boost::shared_ptr<Diskstream> ds = create_diskstream ();
92 ds->do_refill_with_alloc ();
93 ds->set_block_size (_session.get_block_size ());
94 ds->playlist()->set_orig_track_id (id());
106 Track::state (bool full)
108 XMLNode& root (Route::state (full));
109 root.add_property (X_("saved-meter-point"), enum_2_string (_saved_meter_point));
110 root.add_child_nocopy (_diskstream->get_state ());
116 Track::set_state (const XMLNode& node, int version)
118 if (Route::set_state (node, version)) {
124 if (version >= 3000) {
125 if ((child = find_named_node (node, X_("Diskstream"))) != 0) {
126 boost::shared_ptr<Diskstream> ds = diskstream_factory (*child);
127 ds->do_refill_with_alloc ();
133 _diskstream->playlist()->set_orig_track_id (id());
136 /* set rec-enable control *AFTER* setting up diskstream, because it may
137 want to operate on the diskstream as it sets its own state
140 XMLNodeList nlist = node.children();
141 for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
144 XMLProperty const * prop;
145 if (child->name() == Controllable::xml_node_name && (prop = child->property ("name")) != 0) {
146 if (prop->value() == X_("recenable")) {
147 _record_enable_control->set_state (*child, version);
152 XMLProperty const * prop;
154 if ((prop = node.property (X_("saved-meter-point"))) != 0) {
155 _saved_meter_point = MeterPoint (string_2_enum (prop->value(), _saved_meter_point));
157 _saved_meter_point = _meter_point;
164 Track::get_template ()
166 return state (false);
169 Track::FreezeRecord::~FreezeRecord ()
171 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
177 Track::freeze_state() const
179 return _freeze_record.state;
185 bool will_record = true;
186 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
195 Track::prep_record_enabled (bool yn)
197 if (yn && _record_safe_control->get_value()) {
201 if (!can_be_record_enabled()) {
205 /* keep track of the meter point as it was before we rec-enabled */
206 if (!_diskstream->record_enabled()) {
207 _saved_meter_point = _meter_point;
213 will_follow = _diskstream->prep_record_enable ();
215 will_follow = _diskstream->prep_record_disable ();
220 if (_meter_point != MeterCustom) {
221 set_meter_point (MeterInput);
224 set_meter_point (_saved_meter_point);
232 Track::record_enable_changed (bool, Controllable::GroupControlDisposition)
234 _diskstream->set_record_enabled (_record_enable_control->get_value());
238 Track::record_safe_changed (bool, Controllable::GroupControlDisposition)
240 _diskstream->set_record_safe (_record_safe_control->get_value());
244 Track::record_safe () const
246 return _diskstream && _diskstream->record_safe ();
250 Track::set_record_safe (bool yn, Controllable::GroupControlDisposition group_override)
252 if (!_session.writable()) {
256 if (_freeze_record.state == Frozen) {
260 if (record_enabled ()) {
264 _rec_safe_control->set_value (yn, group_override);
268 Track::parameter_changed (string const & p)
270 if (p == "track-name-number") {
271 resync_track_name ();
273 else if (p == "track-name-take") {
274 resync_track_name ();
276 else if (p == "take-name") {
277 if (_session.config.get_track_name_take()) {
278 resync_track_name ();
284 Track::resync_track_name ()
290 Track::set_name (const string& str)
294 if (_record_enable_control->get_value() && _session.actively_recording()) {
295 /* this messes things up if done while recording */
299 string diskstream_name = "";
300 if (_session.config.get_track_name_take () && !_session.config.get_take_name ().empty()) {
301 // Note: any text is fine, legalize_for_path() fixes this later
302 diskstream_name += _session.config.get_take_name ();
303 diskstream_name += "_";
305 const int64_t tracknumber = track_number();
306 if (tracknumber > 0 && _session.config.get_track_name_number()) {
307 char num[64], fmt[10];
308 snprintf(fmt, sizeof(fmt), "%%0%d" PRId64, _session.track_number_decimals());
309 snprintf(num, sizeof(num), fmt, tracknumber);
310 diskstream_name += num;
311 diskstream_name += "_";
313 diskstream_name += str;
315 if (diskstream_name == _diskstream_name) {
318 _diskstream_name = diskstream_name;
320 _diskstream->set_write_source_name (diskstream_name);
322 boost::shared_ptr<Track> me = boost::dynamic_pointer_cast<Track> (shared_from_this ());
323 if (_diskstream->playlist()->all_regions_empty () && _session.playlists->playlists_for_track (me).size() == 1) {
324 /* Only rename the diskstream (and therefore the playlist) if
325 a) the playlist has never had a region added to it and
326 b) there is only one playlist for this track.
328 If (a) is not followed, people can get confused if, say,
329 they have notes about a playlist with a given name and then
330 it changes (see mantis #4759).
332 If (b) is not followed, we rename the current playlist and not
333 the other ones, which is a bit confusing (see mantis #4977).
335 _diskstream->set_name (str);
338 /* save state so that the statefile fully reflects any filename changes */
340 if ((ret = Route::set_name (str)) == 0) {
341 _session.save_state ("");
348 Track::set_latency_compensation (framecnt_t longest_session_latency)
350 Route::set_latency_compensation (longest_session_latency);
351 _diskstream->set_roll_delay (_roll_delay);
355 Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
357 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
363 bool can_record = _session.actively_recording ();
365 /* no outputs? nothing to do ... what happens if we have sends etc. ? */
367 if (n_outputs().n_total() == 0) {
371 /* not active ... do the minimum possible by just outputting silence */
375 if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled())) {
381 if (session_state_changing) {
382 if (_session.transport_speed() != 0.0f) {
383 /* we're rolling but some state is changing (e.g. our diskstream contents)
384 so we cannot use them. Be silent till this is over. Don't declick.
386 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
388 passthru_silence (start_frame, end_frame, nframes, 0);
391 /* we're really not rolling, so we're either delivery silence or actually
392 monitoring, both of which are safe to do while session_state_changing is true.
396 _diskstream->check_record_status (start_frame, can_record);
400 MonitorState const s = monitoring_state ();
401 /* we are not rolling, so be silent even if we are monitoring disk, as there
402 will be no disk data coming in.
405 case MonitoringSilence:
411 case MonitoringInput:
419 //if we have an internal generator, let it play regardless of monitoring state
420 if (_have_internal_generator) {
424 _amp->apply_gain_automation (false);
426 /* if have_internal_generator, or .. */
430 if (_meter_point == MeterInput) {
431 /* still need input monitoring and metering */
433 bool const track_rec = _diskstream->record_enabled ();
434 bool const auto_input = _session.config.get_auto_input ();
435 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
436 bool const tape_machine_mode = Config->get_tape_machine_mode ();
437 bool no_meter = false;
439 /* this needs a proper K-map
440 * and should be separated into a function similar to monitoring_state()
441 * that also handles roll() states in audio_track.cc, midi_track.cc and route.cc
443 * see http://www.oofus.co.uk/ardour/Ardour3MonitorModesV3.pdf
445 if (!auto_input && !track_rec) {
448 else if (tape_machine_mode && !track_rec && auto_input) {
451 else if (!software_monitor && tape_machine_mode && !track_rec) {
454 else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) {
459 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
460 _meter->run (bufs, 0, 0, nframes, true);
461 _input->process_input (boost::shared_ptr<Processor>(), start_frame, end_frame, nframes);
463 _input->process_input (_meter, start_frame, end_frame, nframes);
467 passthru_silence (start_frame, end_frame, nframes, 0);
471 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
473 fill_buffers_with_input (bufs, _input, nframes);
475 if (_meter_point == MeterInput) {
476 _meter->run (bufs, start_frame, end_frame, nframes, true);
479 passthru (bufs, start_frame, end_frame, nframes, false);
482 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
483 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
485 d->flush_buffers (nframes);
493 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler)
495 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
497 framecnt_t playback_distance = _diskstream->calculate_playback_distance(nframes);
498 if (can_internal_playback_seek(playback_distance)) {
499 internal_playback_seek(playback_distance);
504 if (n_outputs().n_total() == 0 && _processors.empty()) {
514 _amp->apply_gain_automation(false);
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 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
934 I don't think it's ever going to be too pretty too look at.
937 bool const roll = _session.transport_rolling ();
938 bool const track_rec = _diskstream->record_enabled ();
939 bool const auto_input = _session.config.get_auto_input ();
940 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
941 bool const tape_machine_mode = Config->get_tape_machine_mode ();
944 /* I suspect that just use actively_recording() is good enough all the
945 * time, but just to keep the semantics the same as they were before
946 * sept 26th 2012, we differentiate between the cases where punch is
947 * enabled and those where it is not.
950 if (_session.config.get_punch_in() || _session.config.get_punch_out()) {
951 session_rec = _session.actively_recording ();
953 session_rec = _session.get_record_enabled();
958 if (!session_rec && roll && auto_input) {
959 return MonitoringDisk;
961 return software_monitor ? MonitoringInput : MonitoringSilence;
966 if (tape_machine_mode) {
968 return MonitoringDisk;
972 if (!roll && auto_input) {
973 return software_monitor ? MonitoringInput : MonitoringSilence;
975 return MonitoringDisk;
981 abort(); /* NOTREACHED */
982 return MonitoringSilence;
988 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
990 /* never declick if there is an internal generator - we just want it to
991 keep generating sound without interruption.
993 ditto if we are monitoring inputs.
996 if (_have_internal_generator || (_monitoring_control->monitoring_choice() == MonitorInput)) {
1001 declick = _pending_declick;
1005 Amp::declick (bufs, nframes, declick);
1010 Track::check_initial_delay (framecnt_t nframes, framepos_t& transport_frame)
1012 if (_roll_delay > nframes) {
1014 _roll_delay -= nframes;
1015 silence_unlocked (nframes);
1016 /* transport frame is not legal for caller to use */
1019 } else if (_roll_delay > 0) {
1021 nframes -= _roll_delay;
1022 silence_unlocked (_roll_delay);
1023 transport_frame += _roll_delay;
1025 /* shuffle all the port buffers for things that lead "out" of this Route
1026 to reflect that we just wrote _roll_delay frames of silence.
1029 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1030 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1031 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
1033 iop->increment_port_buffer_offset (_roll_delay);
1036 _output->increment_port_buffer_offset (_roll_delay);
1046 Track::monitoring_changed (bool, Controllable::GroupControlDisposition)
1048 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1049 (*i)->monitoring_changed ();
1054 Track::metering_state () const
1057 if (_session.transport_rolling ()) {
1058 // audio_track.cc || midi_track.cc roll() runs meter IFF:
1059 rv = _meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled());
1061 // track no_roll() always metering if
1062 rv = _meter_point == MeterInput;
1064 return rv ? MeteringInput : MeteringRoute;