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, Route::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 _record_enable_control->set_flags (Controllable::Toggle);
70 _monitoring_control.reset (new MonitorControl (_session, X_("monitoring"), *this));
72 _record_safe_control.reset (new AutomationControl (_session, RecSafeAutomation, ParameterDescriptor (RecSafeAutomation),
73 boost::shared_ptr<AutomationList> (new AutomationList (Evoral::Parameter (RecSafeAutomation))),
76 track_number_changed.connect_same_thread (*this, boost::bind (&Track::resync_track_name, this));
77 _session.config.ParameterChanged.connect_same_thread (*this, boost::bind (&Track::parameter_changed, this, _1));
79 _monitoring_control->Changed.connect_same_thread (*this, boost::bind (&Track::monitoring_changed, this, _1, _2));
80 _record_safe_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_safe_changed, this, _1, _2));
81 _record_enable_control->Changed.connect_same_thread (*this, boost::bind (&Track::record_enable_changed, this, _1, _2));
87 Track::use_new_diskstream ()
89 boost::shared_ptr<Diskstream> ds = create_diskstream ();
91 ds->do_refill_with_alloc ();
92 ds->set_block_size (_session.get_block_size ());
93 ds->playlist()->set_orig_track_id (id());
105 Track::state (bool full)
107 XMLNode& root (Route::state (full));
108 root.add_property (X_("saved-meter-point"), enum_2_string (_saved_meter_point));
109 root.add_child_nocopy (_diskstream->get_state ());
115 Track::set_state (const XMLNode& node, int version)
117 if (Route::set_state (node, version)) {
123 if (version >= 3000) {
124 if ((child = find_named_node (node, X_("Diskstream"))) != 0) {
125 boost::shared_ptr<Diskstream> ds = diskstream_factory (*child);
126 ds->do_refill_with_alloc ();
132 _diskstream->playlist()->set_orig_track_id (id());
135 /* set rec-enable control *AFTER* setting up diskstream, because it may
136 want to operate on the diskstream as it sets its own state
139 XMLNodeList nlist = node.children();
140 for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
143 XMLProperty const * prop;
144 if (child->name() == Controllable::xml_node_name && (prop = child->property ("name")) != 0) {
145 if (prop->value() == X_("recenable")) {
146 _record_enable_control->set_state (*child, version);
151 XMLProperty const * prop;
153 if ((prop = node.property (X_("saved-meter-point"))) != 0) {
154 _saved_meter_point = MeterPoint (string_2_enum (prop->value(), _saved_meter_point));
156 _saved_meter_point = _meter_point;
163 Track::get_template ()
165 return state (false);
168 Track::FreezeRecord::~FreezeRecord ()
170 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
176 Track::freeze_state() const
178 return _freeze_record.state;
184 bool will_record = true;
185 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
194 Track::prep_record_enabled (bool yn)
196 if (yn && _record_safe_control->get_value()) {
200 if (!can_be_record_enabled()) {
204 /* keep track of the meter point as it was before we rec-enabled */
205 if (!_diskstream->record_enabled()) {
206 _saved_meter_point = _meter_point;
212 will_follow = _diskstream->prep_record_enable ();
214 will_follow = _diskstream->prep_record_disable ();
219 if (_meter_point != MeterCustom) {
220 set_meter_point (MeterInput);
223 set_meter_point (_saved_meter_point);
231 Track::record_enable_changed (bool, Controllable::GroupControlDisposition)
233 _diskstream->set_record_enabled (_record_enable_control->get_value());
237 Track::record_safe_changed (bool, Controllable::GroupControlDisposition)
239 _diskstream->set_record_safe (_record_safe_control->get_value());
243 Track::record_safe () const
245 return _diskstream && _diskstream->record_safe ();
249 Track::set_record_safe (bool yn, Controllable::GroupControlDisposition group_override)
251 if (!_session.writable()) {
255 if (_freeze_record.state == Frozen) {
259 if (record_enabled ()) {
263 _rec_safe_control->set_value (yn, group_override);
267 Track::parameter_changed (string const & p)
269 if (p == "track-name-number") {
270 resync_track_name ();
272 else if (p == "track-name-take") {
273 resync_track_name ();
275 else if (p == "take-name") {
276 if (_session.config.get_track_name_take()) {
277 resync_track_name ();
283 Track::resync_track_name ()
289 Track::set_name (const string& str)
293 if (_record_enable_control->get_value() && _session.actively_recording()) {
294 /* this messes things up if done while recording */
298 string diskstream_name = "";
299 if (_session.config.get_track_name_take () && !_session.config.get_take_name ().empty()) {
300 // Note: any text is fine, legalize_for_path() fixes this later
301 diskstream_name += _session.config.get_take_name ();
302 diskstream_name += "_";
304 const int64_t tracknumber = track_number();
305 if (tracknumber > 0 && _session.config.get_track_name_number()) {
306 char num[64], fmt[10];
307 snprintf(fmt, sizeof(fmt), "%%0%d" PRId64, _session.track_number_decimals());
308 snprintf(num, sizeof(num), fmt, tracknumber);
309 diskstream_name += num;
310 diskstream_name += "_";
312 diskstream_name += str;
314 if (diskstream_name == _diskstream_name) {
317 _diskstream_name = diskstream_name;
319 _diskstream->set_write_source_name (diskstream_name);
321 boost::shared_ptr<Track> me = boost::dynamic_pointer_cast<Track> (shared_from_this ());
322 if (_diskstream->playlist()->all_regions_empty () && _session.playlists->playlists_for_track (me).size() == 1) {
323 /* Only rename the diskstream (and therefore the playlist) if
324 a) the playlist has never had a region added to it and
325 b) there is only one playlist for this track.
327 If (a) is not followed, people can get confused if, say,
328 they have notes about a playlist with a given name and then
329 it changes (see mantis #4759).
331 If (b) is not followed, we rename the current playlist and not
332 the other ones, which is a bit confusing (see mantis #4977).
334 _diskstream->set_name (str);
337 /* save state so that the statefile fully reflects any filename changes */
339 if ((ret = Route::set_name (str)) == 0) {
340 _session.save_state ("");
347 Track::set_latency_compensation (framecnt_t longest_session_latency)
349 Route::set_latency_compensation (longest_session_latency);
350 _diskstream->set_roll_delay (_roll_delay);
354 Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
356 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
362 bool can_record = _session.actively_recording ();
364 /* no outputs? nothing to do ... what happens if we have sends etc. ? */
366 if (n_outputs().n_total() == 0) {
370 /* not active ... do the minimum possible by just outputting silence */
374 if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled())) {
380 if (session_state_changing) {
381 if (_session.transport_speed() != 0.0f) {
382 /* we're rolling but some state is changing (e.g. our diskstream contents)
383 so we cannot use them. Be silent till this is over. Don't declick.
385 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
387 passthru_silence (start_frame, end_frame, nframes, 0);
390 /* we're really not rolling, so we're either delivery silence or actually
391 monitoring, both of which are safe to do while session_state_changing is true.
395 _diskstream->check_record_status (start_frame, can_record);
399 MonitorState const s = monitoring_state ();
400 /* we are not rolling, so be silent even if we are monitoring disk, as there
401 will be no disk data coming in.
404 case MonitoringSilence:
410 case MonitoringInput:
418 //if we have an internal generator, let it play regardless of monitoring state
419 if (_have_internal_generator) {
423 _amp->apply_gain_automation (false);
425 /* if have_internal_generator, or .. */
429 if (_meter_point == MeterInput) {
430 /* still need input monitoring and metering */
432 bool const track_rec = _diskstream->record_enabled ();
433 bool const auto_input = _session.config.get_auto_input ();
434 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
435 bool const tape_machine_mode = Config->get_tape_machine_mode ();
436 bool no_meter = false;
438 /* this needs a proper K-map
439 * and should be separated into a function similar to monitoring_state()
440 * that also handles roll() states in audio_track.cc, midi_track.cc and route.cc
442 * see http://www.oofus.co.uk/ardour/Ardour3MonitorModesV3.pdf
444 if (!auto_input && !track_rec) {
447 else if (tape_machine_mode && !track_rec && auto_input) {
450 else if (!software_monitor && tape_machine_mode && !track_rec) {
453 else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) {
458 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
459 _meter->run (bufs, 0, 0, nframes, true);
460 _input->process_input (boost::shared_ptr<Processor>(), start_frame, end_frame, nframes);
462 _input->process_input (_meter, start_frame, end_frame, nframes);
466 passthru_silence (start_frame, end_frame, nframes, 0);
470 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
472 fill_buffers_with_input (bufs, _input, nframes);
474 if (_meter_point == MeterInput) {
475 _meter->run (bufs, start_frame, end_frame, nframes, true);
478 passthru (bufs, start_frame, end_frame, nframes, false);
481 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
482 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
484 d->flush_buffers (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);
517 framecnt_t playback_distance;
519 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
521 int const dret = _diskstream->process (bufs, _session.transport_frame(), nframes, playback_distance, false);
522 need_butler = _diskstream->commit (playback_distance);
527 Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
531 ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
532 diskstream_playlist_changed ();
533 ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
534 ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
538 Track::diskstream_playlist_changed ()
540 PlaylistChanged (); /* EMIT SIGNAL */
544 Track::diskstream_speed_changed ()
546 SpeedChanged (); /* EMIT SIGNAL */
550 Track::diskstream_alignment_style_changed ()
552 AlignmentStyleChanged (); /* EMIT SIGNAL */
555 boost::shared_ptr<Playlist>
558 return _diskstream->playlist ();
562 Track::request_input_monitoring (bool m)
564 _diskstream->request_input_monitoring (m);
568 Track::ensure_input_monitoring (bool m)
570 _diskstream->ensure_input_monitoring (m);
574 Track::destructive () const
576 return _diskstream->destructive ();
579 list<boost::shared_ptr<Source> > &
580 Track::last_capture_sources ()
582 return _diskstream->last_capture_sources ();
586 Track::set_capture_offset ()
588 _diskstream->set_capture_offset ();
592 Track::steal_write_source_name()
594 return _diskstream->steal_write_source_name ();
598 Track::reset_write_sources (bool r, bool force)
600 _diskstream->reset_write_sources (r, force);
604 Track::playback_buffer_load () const
606 return _diskstream->playback_buffer_load ();
610 Track::capture_buffer_load () const
612 return _diskstream->capture_buffer_load ();
618 return _diskstream->do_refill ();
622 Track::do_flush (RunContext c, bool force)
624 return _diskstream->do_flush (c, force);
628 Track::set_pending_overwrite (bool o)
630 _diskstream->set_pending_overwrite (o);
634 Track::seek (framepos_t p, bool complete_refill)
636 return _diskstream->seek (p, complete_refill);
640 Track::hidden () const
642 return _diskstream->hidden ();
646 Track::can_internal_playback_seek (framecnt_t p)
648 return _diskstream->can_internal_playback_seek (p);
652 Track::internal_playback_seek (framecnt_t p)
654 return _diskstream->internal_playback_seek (p);
658 Track::non_realtime_input_change ()
660 _diskstream->non_realtime_input_change ();
664 Track::non_realtime_locate (framepos_t p)
666 Route::non_realtime_locate (p);
669 /* don't waste i/o cycles and butler calls
670 for hidden (secret) tracks
672 _diskstream->non_realtime_locate (p);
677 Track::non_realtime_set_speed ()
679 _diskstream->non_realtime_set_speed ();
683 Track::overwrite_existing_buffers ()
685 return _diskstream->overwrite_existing_buffers ();
689 Track::get_captured_frames (uint32_t n) const
691 return _diskstream->get_captured_frames (n);
695 Track::set_loop (Location* l)
697 return _diskstream->set_loop (l);
701 Track::transport_looped (framepos_t p)
703 _diskstream->transport_looped (p);
707 Track::realtime_set_speed (double s, bool g)
709 return _diskstream->realtime_set_speed (s, g);
713 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
715 _diskstream->transport_stopped_wallclock (n, t, g);
719 Track::pending_overwrite () const
721 return _diskstream->pending_overwrite ();
725 Track::speed () const
727 return _diskstream->speed ();
731 Track::prepare_to_stop (framepos_t t, framepos_t a)
733 _diskstream->prepare_to_stop (t, a);
737 Track::set_slaved (bool s)
739 _diskstream->set_slaved (s);
745 return _diskstream->n_channels ();
749 Track::get_capture_start_frame (uint32_t n) const
751 return _diskstream->get_capture_start_frame (n);
755 Track::alignment_style () const
757 return _diskstream->alignment_style ();
761 Track::alignment_choice () const
763 return _diskstream->alignment_choice ();
767 Track::current_capture_start () const
769 return _diskstream->current_capture_start ();
773 Track::current_capture_end () const
775 return _diskstream->current_capture_end ();
779 Track::playlist_modified ()
781 _diskstream->playlist_modified ();
785 Track::use_playlist (boost::shared_ptr<Playlist> p)
787 int ret = _diskstream->use_playlist (p);
789 p->set_orig_track_id (id());
795 Track::use_copy_playlist ()
797 int ret = _diskstream->use_copy_playlist ();
800 _diskstream->playlist()->set_orig_track_id (id());
807 Track::use_new_playlist ()
809 int ret = _diskstream->use_new_playlist ();
812 _diskstream->playlist()->set_orig_track_id (id());
819 Track::set_align_style (AlignStyle s, bool force)
821 _diskstream->set_align_style (s, force);
825 Track::set_align_choice (AlignChoice s, bool force)
827 _diskstream->set_align_choice (s, force);
831 Track::using_diskstream_id (PBD::ID id) const
833 return (id == _diskstream->id ());
837 Track::set_block_size (pframes_t n)
839 Route::set_block_size (n);
840 _diskstream->set_block_size (n);
844 Track::adjust_playback_buffering ()
847 _diskstream->adjust_playback_buffering ();
852 Track::adjust_capture_buffering ()
855 _diskstream->adjust_capture_buffering ();
859 #ifdef USE_TRACKS_CODE_FEATURES
861 /* This is the Tracks version of Track::monitoring_state().
863 * Ardour developers: try to flag or fix issues if parts of the libardour API
864 * change in ways that invalidate this
868 Track::monitoring_state () const
870 /* Explicit requests */
872 if (_monitoring & MonitorInput) {
873 return MonitoringInput;
876 if (_monitoring & MonitorDisk) {
877 return MonitoringDisk;
880 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
881 I don't think it's ever going to be too pretty too look at.
884 // GZ: NOT USED IN TRACKS
885 //bool const auto_input = _session.config.get_auto_input ();
886 //bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
887 //bool const tape_machine_mode = Config->get_tape_machine_mode ();
889 bool const roll = _session.transport_rolling ();
890 bool const track_rec = _diskstream->record_enabled ();
891 bool session_rec = _session.actively_recording ();
895 if (!session_rec && roll) {
896 return MonitoringDisk;
898 return MonitoringInput;
904 return MonitoringDisk;
908 return MonitoringSilence;
913 /* This is the Ardour/Mixbus version of Track::monitoring_state().
915 * Tracks developers: do NOT modify this method under any circumstances.
919 Track::monitoring_state () const
921 /* Explicit requests */
922 MonitorChoice m (_monitoring_control->monitoring_choice());
924 if (m & MonitorInput) {
925 return MonitoringInput;
928 if (m & MonitorDisk) {
929 return MonitoringDisk;
932 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
933 I don't think it's ever going to be too pretty too look at.
936 bool const roll = _session.transport_rolling ();
937 bool const track_rec = _diskstream->record_enabled ();
938 bool const auto_input = _session.config.get_auto_input ();
939 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
940 bool const tape_machine_mode = Config->get_tape_machine_mode ();
943 /* I suspect that just use actively_recording() is good enough all the
944 * time, but just to keep the semantics the same as they were before
945 * sept 26th 2012, we differentiate between the cases where punch is
946 * enabled and those where it is not.
949 if (_session.config.get_punch_in() || _session.config.get_punch_out()) {
950 session_rec = _session.actively_recording ();
952 session_rec = _session.get_record_enabled();
957 if (!session_rec && roll && auto_input) {
958 return MonitoringDisk;
960 return software_monitor ? MonitoringInput : MonitoringSilence;
965 if (tape_machine_mode) {
967 return MonitoringDisk;
971 if (!roll && auto_input) {
972 return software_monitor ? MonitoringInput : MonitoringSilence;
974 return MonitoringDisk;
980 abort(); /* NOTREACHED */
981 return MonitoringSilence;
987 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
989 /* never declick if there is an internal generator - we just want it to
990 keep generating sound without interruption.
992 ditto if we are monitoring inputs.
995 if (_have_internal_generator || (_monitoring_control->monitoring_choice() == MonitorInput)) {
1000 declick = _pending_declick;
1004 Amp::declick (bufs, nframes, declick);
1009 Track::check_initial_delay (framecnt_t nframes, framepos_t& transport_frame)
1011 if (_roll_delay > nframes) {
1013 _roll_delay -= nframes;
1014 silence_unlocked (nframes);
1015 /* transport frame is not legal for caller to use */
1018 } else if (_roll_delay > 0) {
1020 nframes -= _roll_delay;
1021 silence_unlocked (_roll_delay);
1022 transport_frame += _roll_delay;
1024 /* shuffle all the port buffers for things that lead "out" of this Route
1025 to reflect that we just wrote _roll_delay frames of silence.
1028 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1029 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1030 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
1032 iop->increment_port_buffer_offset (_roll_delay);
1035 _output->increment_port_buffer_offset (_roll_delay);
1045 Track::monitoring_changed (bool, Controllable::GroupControlDisposition)
1047 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1048 (*i)->monitoring_changed ();
1053 Track::metering_state () const
1056 if (_session.transport_rolling ()) {
1057 // audio_track.cc || midi_track.cc roll() runs meter IFF:
1058 rv = _meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled());
1060 // track no_roll() always metering if
1061 rv = _meter_point == MeterInput;
1063 return rv ? MeteringInput : MeteringRoute;