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 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 track_number_changed.connect_same_thread (*this, boost::bind (&Track::resync_track_name, this));
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));
110 root.add_property (X_("saved-meter-point"), enum_2_string (_saved_meter_point));
111 root.add_child_nocopy (_diskstream->get_state ());
117 Track::set_state (const XMLNode& node, int version)
119 if (Route::set_state (node, version)) {
125 if (version >= 3000) {
126 if ((child = find_named_node (node, X_("Diskstream"))) != 0) {
127 boost::shared_ptr<Diskstream> ds = diskstream_factory (*child);
128 ds->do_refill_with_alloc ();
134 _diskstream->playlist()->set_orig_track_id (id());
137 /* set rec-enable control *AFTER* setting up diskstream, because it may
138 want to operate on the diskstream as it sets its own state
141 XMLNodeList nlist = node.children();
142 for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
145 XMLProperty const * prop;
146 if (child->name() == Controllable::xml_node_name && (prop = child->property ("name")) != 0) {
147 if (prop->value() == X_("recenable")) {
148 _record_enable_control->set_state (*child, version);
153 XMLProperty const * prop;
155 if ((prop = node.property (X_("saved-meter-point"))) != 0) {
156 _saved_meter_point = MeterPoint (string_2_enum (prop->value(), _saved_meter_point));
158 _saved_meter_point = _meter_point;
165 Track::get_template ()
167 return state (false);
170 Track::FreezeRecord::~FreezeRecord ()
172 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
178 Track::freeze_state() const
180 return _freeze_record.state;
186 bool will_record = true;
187 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
196 Track::prep_record_enabled (bool yn)
198 if (yn && _record_safe_control->get_value()) {
202 if (!can_be_record_enabled()) {
206 /* keep track of the meter point as it was before we rec-enabled */
207 if (!_diskstream->record_enabled()) {
208 _saved_meter_point = _meter_point;
214 will_follow = _diskstream->prep_record_enable ();
216 will_follow = _diskstream->prep_record_disable ();
221 if (_meter_point != MeterCustom) {
222 set_meter_point (MeterInput);
225 set_meter_point (_saved_meter_point);
233 Track::record_enable_changed (bool, Controllable::GroupControlDisposition)
235 _diskstream->set_record_enabled (_record_enable_control->get_value());
239 Track::record_safe_changed (bool, Controllable::GroupControlDisposition)
241 _diskstream->set_record_safe (_record_safe_control->get_value());
245 Track::record_safe () const
247 return _diskstream && _diskstream->record_safe ();
251 Track::set_record_safe (bool yn, Controllable::GroupControlDisposition group_override)
253 if (!_session.writable()) {
257 if (_freeze_record.state == Frozen) {
261 if (record_enabled ()) {
265 _rec_safe_control->set_value (yn, group_override);
269 Track::parameter_changed (string const & p)
271 if (p == "track-name-number") {
272 resync_track_name ();
274 else if (p == "track-name-take") {
275 resync_track_name ();
277 else if (p == "take-name") {
278 if (_session.config.get_track_name_take()) {
279 resync_track_name ();
285 Track::resync_track_name ()
291 Track::set_name (const string& str)
295 if (_record_enable_control->get_value() && _session.actively_recording()) {
296 /* this messes things up if done while recording */
300 string diskstream_name = "";
301 if (_session.config.get_track_name_take () && !_session.config.get_take_name ().empty()) {
302 // Note: any text is fine, legalize_for_path() fixes this later
303 diskstream_name += _session.config.get_take_name ();
304 diskstream_name += "_";
306 const int64_t tracknumber = track_number();
307 if (tracknumber > 0 && _session.config.get_track_name_number()) {
308 char num[64], fmt[10];
309 snprintf(fmt, sizeof(fmt), "%%0%d" PRId64, _session.track_number_decimals());
310 snprintf(num, sizeof(num), fmt, tracknumber);
311 diskstream_name += num;
312 diskstream_name += "_";
314 diskstream_name += str;
316 if (diskstream_name == _diskstream_name) {
319 _diskstream_name = diskstream_name;
321 _diskstream->set_write_source_name (diskstream_name);
323 boost::shared_ptr<Track> me = boost::dynamic_pointer_cast<Track> (shared_from_this ());
324 if (_diskstream->playlist()->all_regions_empty () && _session.playlists->playlists_for_track (me).size() == 1) {
325 /* Only rename the diskstream (and therefore the playlist) if
326 a) the playlist has never had a region added to it and
327 b) there is only one playlist for this track.
329 If (a) is not followed, people can get confused if, say,
330 they have notes about a playlist with a given name and then
331 it changes (see mantis #4759).
333 If (b) is not followed, we rename the current playlist and not
334 the other ones, which is a bit confusing (see mantis #4977).
336 _diskstream->set_name (str);
339 /* save state so that the statefile fully reflects any filename changes */
341 if ((ret = Route::set_name (str)) == 0) {
342 _session.save_state ("");
349 Track::set_latency_compensation (framecnt_t longest_session_latency)
351 Route::set_latency_compensation (longest_session_latency);
352 _diskstream->set_roll_delay (_roll_delay);
356 Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
358 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
364 bool can_record = _session.actively_recording ();
366 /* no outputs? nothing to do ... what happens if we have sends etc. ? */
368 if (n_outputs().n_total() == 0) {
372 /* not active ... do the minimum possible by just outputting silence */
376 if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled())) {
382 if (session_state_changing) {
383 if (_session.transport_speed() != 0.0f) {
384 /* we're rolling but some state is changing (e.g. our diskstream contents)
385 so we cannot use them. Be silent till this is over. Don't declick.
387 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
389 passthru_silence (start_frame, end_frame, nframes, 0);
392 /* we're really not rolling, so we're either delivery silence or actually
393 monitoring, both of which are safe to do while session_state_changing is true.
397 _diskstream->check_record_status (start_frame, can_record);
401 MonitorState const s = monitoring_state ();
402 /* we are not rolling, so be silent even if we are monitoring disk, as there
403 will be no disk data coming in.
406 case MonitoringSilence:
412 case MonitoringInput:
420 //if we have an internal generator, let it play regardless of monitoring state
421 if (_have_internal_generator) {
425 _amp->apply_gain_automation (false);
427 /* if have_internal_generator, or .. */
431 if (_meter_point == MeterInput) {
432 /* still need input monitoring and metering */
434 bool const track_rec = _diskstream->record_enabled ();
435 bool const auto_input = _session.config.get_auto_input ();
436 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
437 bool const tape_machine_mode = Config->get_tape_machine_mode ();
438 bool no_meter = false;
440 /* this needs a proper K-map
441 * and should be separated into a function similar to monitoring_state()
442 * that also handles roll() states in audio_track.cc, midi_track.cc and route.cc
444 * see http://www.oofus.co.uk/ardour/Ardour3MonitorModesV3.pdf
446 if (!auto_input && !track_rec) {
449 else if (tape_machine_mode && !track_rec && auto_input) {
452 else if (!software_monitor && tape_machine_mode && !track_rec) {
455 else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) {
460 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
461 _meter->run (bufs, 0, 0, nframes, true);
462 _input->process_input (boost::shared_ptr<Processor>(), start_frame, end_frame, nframes);
464 _input->process_input (_meter, start_frame, end_frame, nframes);
468 passthru_silence (start_frame, end_frame, nframes, 0);
472 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
474 fill_buffers_with_input (bufs, _input, nframes);
476 if (_meter_point == MeterInput) {
477 _meter->run (bufs, start_frame, end_frame, nframes, true);
480 passthru (bufs, start_frame, end_frame, nframes, false);
483 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
484 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
486 d->flush_buffers (nframes);
494 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler)
496 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
498 framecnt_t playback_distance = _diskstream->calculate_playback_distance(nframes);
499 if (can_internal_playback_seek(playback_distance)) {
500 internal_playback_seek(playback_distance);
505 if (n_outputs().n_total() == 0 && _processors.empty()) {
515 _amp->apply_gain_automation(false);
519 framecnt_t playback_distance;
521 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
523 int const dret = _diskstream->process (bufs, _session.transport_frame(), nframes, playback_distance, false);
524 need_butler = _diskstream->commit (playback_distance);
529 Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
533 ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
534 diskstream_playlist_changed ();
535 ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
536 ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
540 Track::diskstream_playlist_changed ()
542 PlaylistChanged (); /* EMIT SIGNAL */
546 Track::diskstream_speed_changed ()
548 SpeedChanged (); /* EMIT SIGNAL */
552 Track::diskstream_alignment_style_changed ()
554 AlignmentStyleChanged (); /* EMIT SIGNAL */
557 boost::shared_ptr<Playlist>
560 return _diskstream->playlist ();
564 Track::request_input_monitoring (bool m)
566 _diskstream->request_input_monitoring (m);
570 Track::ensure_input_monitoring (bool m)
572 _diskstream->ensure_input_monitoring (m);
576 Track::destructive () const
578 return _diskstream->destructive ();
581 list<boost::shared_ptr<Source> > &
582 Track::last_capture_sources ()
584 return _diskstream->last_capture_sources ();
588 Track::set_capture_offset ()
590 _diskstream->set_capture_offset ();
594 Track::steal_write_source_name()
596 return _diskstream->steal_write_source_name ();
600 Track::reset_write_sources (bool r, bool force)
602 _diskstream->reset_write_sources (r, force);
606 Track::playback_buffer_load () const
608 return _diskstream->playback_buffer_load ();
612 Track::capture_buffer_load () const
614 return _diskstream->capture_buffer_load ();
620 return _diskstream->do_refill ();
624 Track::do_flush (RunContext c, bool force)
626 return _diskstream->do_flush (c, force);
630 Track::set_pending_overwrite (bool o)
632 _diskstream->set_pending_overwrite (o);
636 Track::seek (framepos_t p, bool complete_refill)
638 return _diskstream->seek (p, complete_refill);
642 Track::hidden () const
644 return _diskstream->hidden ();
648 Track::can_internal_playback_seek (framecnt_t p)
650 return _diskstream->can_internal_playback_seek (p);
654 Track::internal_playback_seek (framecnt_t p)
656 return _diskstream->internal_playback_seek (p);
660 Track::non_realtime_input_change ()
662 _diskstream->non_realtime_input_change ();
666 Track::non_realtime_locate (framepos_t p)
668 Route::non_realtime_locate (p);
671 /* don't waste i/o cycles and butler calls
672 for hidden (secret) tracks
674 _diskstream->non_realtime_locate (p);
679 Track::non_realtime_set_speed ()
681 _diskstream->non_realtime_set_speed ();
685 Track::overwrite_existing_buffers ()
687 return _diskstream->overwrite_existing_buffers ();
691 Track::get_captured_frames (uint32_t n) const
693 return _diskstream->get_captured_frames (n);
697 Track::set_loop (Location* l)
699 return _diskstream->set_loop (l);
703 Track::transport_looped (framepos_t p)
705 _diskstream->transport_looped (p);
709 Track::realtime_set_speed (double s, bool g)
711 return _diskstream->realtime_set_speed (s, g);
715 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
717 _diskstream->transport_stopped_wallclock (n, t, g);
721 Track::pending_overwrite () const
723 return _diskstream->pending_overwrite ();
727 Track::speed () const
729 return _diskstream->speed ();
733 Track::prepare_to_stop (framepos_t t, framepos_t a)
735 _diskstream->prepare_to_stop (t, a);
739 Track::set_slaved (bool s)
741 _diskstream->set_slaved (s);
747 return _diskstream->n_channels ();
751 Track::get_capture_start_frame (uint32_t n) const
753 return _diskstream->get_capture_start_frame (n);
757 Track::alignment_style () const
759 return _diskstream->alignment_style ();
763 Track::alignment_choice () const
765 return _diskstream->alignment_choice ();
769 Track::current_capture_start () const
771 return _diskstream->current_capture_start ();
775 Track::current_capture_end () const
777 return _diskstream->current_capture_end ();
781 Track::playlist_modified ()
783 _diskstream->playlist_modified ();
787 Track::use_playlist (boost::shared_ptr<Playlist> p)
789 int ret = _diskstream->use_playlist (p);
791 p->set_orig_track_id (id());
797 Track::use_copy_playlist ()
799 int ret = _diskstream->use_copy_playlist ();
802 _diskstream->playlist()->set_orig_track_id (id());
809 Track::use_new_playlist ()
811 int ret = _diskstream->use_new_playlist ();
814 _diskstream->playlist()->set_orig_track_id (id());
821 Track::set_align_style (AlignStyle s, bool force)
823 _diskstream->set_align_style (s, force);
827 Track::set_align_choice (AlignChoice s, bool force)
829 _diskstream->set_align_choice (s, force);
833 Track::using_diskstream_id (PBD::ID id) const
835 return (id == _diskstream->id ());
839 Track::set_block_size (pframes_t n)
841 Route::set_block_size (n);
842 _diskstream->set_block_size (n);
846 Track::adjust_playback_buffering ()
849 _diskstream->adjust_playback_buffering ();
854 Track::adjust_capture_buffering ()
857 _diskstream->adjust_capture_buffering ();
861 #ifdef USE_TRACKS_CODE_FEATURES
863 /* This is the Tracks version of Track::monitoring_state().
865 * Ardour developers: try to flag or fix issues if parts of the libardour API
866 * change in ways that invalidate this
870 Track::monitoring_state () const
872 /* Explicit requests */
874 if (_monitoring & MonitorInput) {
875 return MonitoringInput;
878 if (_monitoring & MonitorDisk) {
879 return MonitoringDisk;
882 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
883 I don't think it's ever going to be too pretty too look at.
886 // GZ: NOT USED IN TRACKS
887 //bool const auto_input = _session.config.get_auto_input ();
888 //bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
889 //bool const tape_machine_mode = Config->get_tape_machine_mode ();
891 bool const roll = _session.transport_rolling ();
892 bool const track_rec = _diskstream->record_enabled ();
893 bool session_rec = _session.actively_recording ();
897 if (!session_rec && roll) {
898 return MonitoringDisk;
900 return MonitoringInput;
906 return MonitoringDisk;
910 return MonitoringSilence;
915 /* This is the Ardour/Mixbus version of Track::monitoring_state().
917 * Tracks developers: do NOT modify this method under any circumstances.
921 Track::monitoring_state () const
923 /* Explicit requests */
924 MonitorChoice m (_monitoring_control->monitoring_choice());
926 if (m & MonitorInput) {
927 return MonitoringInput;
930 if (m & MonitorDisk) {
931 return MonitoringDisk;
934 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
935 I don't think it's ever going to be too pretty too look at.
938 bool const roll = _session.transport_rolling ();
939 bool const track_rec = _diskstream->record_enabled ();
940 bool const auto_input = _session.config.get_auto_input ();
941 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
942 bool const tape_machine_mode = Config->get_tape_machine_mode ();
945 /* I suspect that just use actively_recording() is good enough all the
946 * time, but just to keep the semantics the same as they were before
947 * sept 26th 2012, we differentiate between the cases where punch is
948 * enabled and those where it is not.
951 if (_session.config.get_punch_in() || _session.config.get_punch_out()) {
952 session_rec = _session.actively_recording ();
954 session_rec = _session.get_record_enabled();
959 if (!session_rec && roll && auto_input) {
960 return MonitoringDisk;
962 return software_monitor ? MonitoringInput : MonitoringSilence;
967 if (tape_machine_mode) {
969 return MonitoringDisk;
973 if (!roll && auto_input) {
974 return software_monitor ? MonitoringInput : MonitoringSilence;
976 return MonitoringDisk;
982 abort(); /* NOTREACHED */
983 return MonitoringSilence;
989 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
991 /* never declick if there is an internal generator - we just want it to
992 keep generating sound without interruption.
994 ditto if we are monitoring inputs.
997 if (_have_internal_generator || (_monitoring_control->monitoring_choice() == MonitorInput)) {
1002 declick = _pending_declick;
1006 Amp::declick (bufs, nframes, declick);
1011 Track::check_initial_delay (framecnt_t nframes, framepos_t& transport_frame)
1013 if (_roll_delay > nframes) {
1015 _roll_delay -= nframes;
1016 silence_unlocked (nframes);
1017 /* transport frame is not legal for caller to use */
1020 } else if (_roll_delay > 0) {
1022 nframes -= _roll_delay;
1023 silence_unlocked (_roll_delay);
1024 transport_frame += _roll_delay;
1026 /* shuffle all the port buffers for things that lead "out" of this Route
1027 to reflect that we just wrote _roll_delay frames of silence.
1030 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
1031 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1032 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
1034 iop->increment_port_buffer_offset (_roll_delay);
1037 _output->increment_port_buffer_offset (_roll_delay);
1047 Track::monitoring_changed (bool, Controllable::GroupControlDisposition)
1049 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
1050 (*i)->monitoring_changed ();
1055 Track::metering_state () const
1058 if (_session.transport_rolling ()) {
1059 // audio_track.cc || midi_track.cc roll() runs meter IFF:
1060 rv = _meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _diskstream->record_enabled());
1062 // track no_roll() always metering if
1063 rv = _meter_point == MeterInput;
1065 return rv ? MeteringInput : MeteringRoute;