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/playlist.h"
27 #include "ardour/port.h"
28 #include "ardour/processor.h"
29 #include "ardour/route_group_specialized.h"
30 #include "ardour/session.h"
31 #include "ardour/session_playlists.h"
32 #include "ardour/track.h"
33 #include "ardour/utils.h"
38 using namespace ARDOUR;
41 Track::Track (Session& sess, string name, Route::Flag flag, TrackMode mode, DataType default_type)
42 : Route (sess, name, flag, default_type)
43 , _saved_meter_point (_meter_point)
45 , _monitoring (MonitorAuto)
47 _freeze_record.state = NoFreeze;
53 DEBUG_TRACE (DEBUG::Destruction, string_compose ("track %1 destructor\n", _name));
63 boost::shared_ptr<Route> rp (shared_from_this());
64 boost::shared_ptr<Track> rt = boost::dynamic_pointer_cast<Track> (rp);
65 _rec_enable_control = boost::shared_ptr<RecEnableControl> (new RecEnableControl(rt));
66 _rec_enable_control->set_flags (Controllable::Toggle);
68 /* don't add rec_enable_control to controls because we don't want it to
69 * appear as an automatable parameter
76 Track::use_new_diskstream ()
78 boost::shared_ptr<Diskstream> ds = create_diskstream ();
80 ds->do_refill_with_alloc ();
81 ds->set_block_size (_session.get_block_size ());
82 ds->playlist()->set_orig_track_id (id());
94 Track::state (bool full)
96 XMLNode& root (Route::state (full));
97 root.add_property (X_("monitoring"), enum_2_string (_monitoring));
98 root.add_property (X_("saved-meter-point"), enum_2_string (_saved_meter_point));
99 root.add_child_nocopy (_rec_enable_control->get_state());
100 root.add_child_nocopy (_diskstream->get_state ());
106 Track::set_state (const XMLNode& node, int version)
108 if (Route::set_state (node, version)) {
114 if (version >= 3000) {
115 if ((child = find_named_node (node, X_("Diskstream"))) != 0) {
116 boost::shared_ptr<Diskstream> ds = diskstream_factory (*child);
117 ds->do_refill_with_alloc ();
123 _diskstream->playlist()->set_orig_track_id (id());
126 /* set rec-enable control *AFTER* setting up diskstream, because it may
127 want to operate on the diskstream as it sets its own state
130 XMLNodeList nlist = node.children();
131 for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
135 if (child->name() == Controllable::xml_node_name && (prop = child->property ("name")) != 0) {
136 if (prop->value() == X_("recenable")) {
137 _rec_enable_control->set_state (*child, version);
142 const XMLProperty* prop;
144 if ((prop = node.property (X_("monitoring"))) != 0) {
145 _monitoring = MonitorChoice (string_2_enum (prop->value(), _monitoring));
147 _monitoring = MonitorAuto;
150 if ((prop = node.property (X_("saved-meter-point"))) != 0) {
151 _saved_meter_point = MeterPoint (string_2_enum (prop->value(), _saved_meter_point));
153 _saved_meter_point = _meter_point;
160 Track::get_template ()
162 return state (false);
165 Track::FreezeRecord::~FreezeRecord ()
167 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
173 Track::freeze_state() const
175 return _freeze_record.state;
178 Track::RecEnableControl::RecEnableControl (boost::shared_ptr<Track> t)
179 : AutomationControl (t->session(), RecEnableAutomation, boost::shared_ptr<AutomationList>(), X_("recenable"))
182 boost::shared_ptr<AutomationList> gl(new AutomationList(Evoral::Parameter(RecEnableAutomation)));
187 Track::RecEnableControl::set_value (double val)
189 boost::shared_ptr<Track> t = track.lock ();
194 t->set_record_enabled (val >= 0.5 ? true : false, this);
198 Track::RecEnableControl::get_value () const
200 boost::shared_ptr<Track> t = track.lock ();
205 return (t->record_enabled() ? 1.0 : 0.0);
209 Track::record_enabled () const
211 return _diskstream && _diskstream->record_enabled ();
217 bool will_record = true;
218 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
227 Track::prep_record_enabled (bool yn, void *src)
229 if (!_session.writable()) {
233 if (_freeze_record.state == Frozen) {
237 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_recenable()) {
238 _route_group->apply (&Track::prep_record_enabled, yn, _route_group);
242 /* keep track of the meter point as it was before we rec-enabled */
243 if (!_diskstream->record_enabled()) {
244 _saved_meter_point = _meter_point;
250 will_follow = _diskstream->prep_record_enable ();
252 will_follow = _diskstream->prep_record_disable ();
257 if (_meter_point != MeterCustom) {
258 set_meter_point (MeterInput);
261 set_meter_point (_saved_meter_point);
267 Track::set_record_enabled (bool yn, void *src)
269 if (!_session.writable()) {
273 if (_freeze_record.state == Frozen) {
277 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_recenable()) {
278 _route_group->apply (&Track::set_record_enabled, yn, _route_group);
282 _diskstream->set_record_enabled (yn);
284 _rec_enable_control->Changed ();
288 Track::set_name (const string& str)
292 if (record_enabled() && _session.actively_recording()) {
293 /* this messes things up if done while recording */
297 boost::shared_ptr<Track> me = boost::dynamic_pointer_cast<Track> (shared_from_this ());
298 if (_diskstream->playlist()->all_regions_empty () && _session.playlists->playlists_for_track (me).size() == 1) {
299 /* Only rename the diskstream (and therefore the playlist) if
300 a) the playlist has never had a region added to it and
301 b) there is only one playlist for this track.
303 If (a) is not followed, people can get confused if, say,
304 they have notes about a playlist with a given name and then
305 it changes (see mantis #4759).
307 If (b) is not followed, we rename the current playlist and not
308 the other ones, which is a bit confusing (see mantis #4977).
310 _diskstream->set_name (str);
313 /* save state so that the statefile fully reflects any filename changes */
315 if ((ret = Route::set_name (str)) == 0) {
316 _session.save_state ("");
323 Track::set_latency_compensation (framecnt_t longest_session_latency)
325 Route::set_latency_compensation (longest_session_latency);
326 _diskstream->set_roll_delay (_roll_delay);
330 Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
332 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
338 bool can_record = _session.actively_recording ();
340 /* no outputs? nothing to do ... what happens if we have sends etc. ? */
342 if (n_outputs().n_total() == 0) {
346 /* not active ... do the minimum possible by just outputting silence */
350 if (_meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled())) {
356 if (session_state_changing) {
357 if (_session.transport_speed() != 0.0f) {
358 /* we're rolling but some state is changing (e.g. our diskstream contents)
359 so we cannot use them. Be silent till this is over. Don't declick.
361 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
363 passthru_silence (start_frame, end_frame, nframes, 0);
366 /* we're really not rolling, so we're either delivery silence or actually
367 monitoring, both of which are safe to do while session_state_changing is true.
371 _diskstream->check_record_status (start_frame, can_record);
375 if (_have_internal_generator) {
376 /* since the instrument has no input streams,
377 there is no reason to send any signal
384 MonitorState const s = monitoring_state ();
385 /* we are not rolling, so be silent even if we are monitoring disk, as there
386 will be no disk data coming in.
389 case MonitoringSilence:
390 /* if there is an instrument, be_silent should always
393 be_silent = (the_instrument_unlocked() == 0);
398 case MonitoringInput:
407 _amp->apply_gain_automation (false);
409 /* if have_internal_generator, or .. */
413 if (_meter_point == MeterInput) {
414 /* still need input monitoring and metering */
416 bool const track_rec = _diskstream->record_enabled ();
417 bool const auto_input = _session.config.get_auto_input ();
418 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
419 bool const tape_machine_mode = Config->get_tape_machine_mode ();
420 bool no_meter = false;
422 /* this needs a proper K-map
423 * and should be separated into a function similar to monitoring_state()
424 * that also handles roll() states in audio_track.cc, midi_track.cc and route.cc
426 * see http://www.oofus.co.uk/ardour/Ardour3MonitorModesV3.pdf
428 if (!auto_input && !track_rec) {
431 else if (tape_machine_mode && !track_rec && auto_input) {
434 else if (!software_monitor && tape_machine_mode && !track_rec) {
437 else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) {
442 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
443 _meter->run (bufs, 0, 0, nframes, true);
444 _input->process_input (boost::shared_ptr<Processor>(), start_frame, end_frame, nframes);
446 _input->process_input (_meter, start_frame, end_frame, nframes);
450 passthru_silence (start_frame, end_frame, nframes, 0);
454 BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
456 fill_buffers_with_input (bufs, _input, nframes);
458 if (_meter_point == MeterInput) {
459 _meter->run (bufs, start_frame, end_frame, nframes, true);
462 passthru (bufs, start_frame, end_frame, nframes, false);
465 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
466 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
468 d->flush_buffers (nframes);
476 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler)
478 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
483 if (n_outputs().n_total() == 0 && _processors.empty()) {
493 _amp->apply_gain_automation(false);
497 framecnt_t playback_distance;
499 BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
501 int const dret = _diskstream->process (bufs, _session.transport_frame(), nframes, playback_distance, false);
502 need_butler = _diskstream->commit (playback_distance);
507 Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
511 ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
512 diskstream_playlist_changed ();
513 ds->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_enable_changed, this));
514 ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
515 ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
519 Track::diskstream_playlist_changed ()
521 PlaylistChanged (); /* EMIT SIGNAL */
525 Track::diskstream_record_enable_changed ()
527 RecordEnableChanged (); /* EMIT SIGNAL */
531 Track::diskstream_speed_changed ()
533 SpeedChanged (); /* EMIT SIGNAL */
537 Track::diskstream_alignment_style_changed ()
539 AlignmentStyleChanged (); /* EMIT SIGNAL */
542 boost::shared_ptr<Playlist>
545 return _diskstream->playlist ();
549 Track::request_jack_monitors_input (bool m)
551 _diskstream->request_jack_monitors_input (m);
555 Track::ensure_jack_monitors_input (bool m)
557 _diskstream->ensure_jack_monitors_input (m);
561 Track::destructive () const
563 return _diskstream->destructive ();
566 list<boost::shared_ptr<Source> > &
567 Track::last_capture_sources ()
569 return _diskstream->last_capture_sources ();
573 Track::set_capture_offset ()
575 _diskstream->set_capture_offset ();
578 list<boost::shared_ptr<Source> >
579 Track::steal_write_sources()
581 return _diskstream->steal_write_sources ();
585 Track::reset_write_sources (bool r, bool force)
587 _diskstream->reset_write_sources (r, force);
591 Track::playback_buffer_load () const
593 return _diskstream->playback_buffer_load ();
597 Track::capture_buffer_load () const
599 return _diskstream->capture_buffer_load ();
605 return _diskstream->do_refill ();
609 Track::do_flush (RunContext c, bool force)
611 return _diskstream->do_flush (c, force);
615 Track::set_pending_overwrite (bool o)
617 _diskstream->set_pending_overwrite (o);
621 Track::seek (framepos_t p, bool complete_refill)
623 return _diskstream->seek (p, complete_refill);
627 Track::hidden () const
629 return _diskstream->hidden ();
633 Track::can_internal_playback_seek (framecnt_t p)
635 return _diskstream->can_internal_playback_seek (p);
639 Track::internal_playback_seek (framecnt_t p)
641 return _diskstream->internal_playback_seek (p);
645 Track::non_realtime_input_change ()
647 _diskstream->non_realtime_input_change ();
651 Track::non_realtime_locate (framepos_t p)
653 Route::non_realtime_locate (p);
656 /* don't waste i/o cycles and butler calls
657 for hidden (secret) tracks
659 _diskstream->non_realtime_locate (p);
664 Track::non_realtime_set_speed ()
666 _diskstream->non_realtime_set_speed ();
670 Track::overwrite_existing_buffers ()
672 return _diskstream->overwrite_existing_buffers ();
676 Track::get_captured_frames (uint32_t n) const
678 return _diskstream->get_captured_frames (n);
682 Track::set_loop (Location* l)
684 return _diskstream->set_loop (l);
688 Track::transport_looped (framepos_t p)
690 _diskstream->transport_looped (p);
694 Track::realtime_set_speed (double s, bool g)
696 return _diskstream->realtime_set_speed (s, g);
700 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
702 _diskstream->transport_stopped_wallclock (n, t, g);
706 Track::pending_overwrite () const
708 return _diskstream->pending_overwrite ();
712 Track::speed () const
714 return _diskstream->speed ();
718 Track::prepare_to_stop (framepos_t p)
720 _diskstream->prepare_to_stop (p);
724 Track::set_slaved (bool s)
726 _diskstream->set_slaved (s);
732 return _diskstream->n_channels ();
736 Track::get_capture_start_frame (uint32_t n) const
738 return _diskstream->get_capture_start_frame (n);
742 Track::alignment_style () const
744 return _diskstream->alignment_style ();
748 Track::alignment_choice () const
750 return _diskstream->alignment_choice ();
754 Track::current_capture_start () const
756 return _diskstream->current_capture_start ();
760 Track::current_capture_end () const
762 return _diskstream->current_capture_end ();
766 Track::playlist_modified ()
768 _diskstream->playlist_modified ();
772 Track::use_playlist (boost::shared_ptr<Playlist> p)
774 int ret = _diskstream->use_playlist (p);
776 p->set_orig_track_id (id());
782 Track::use_copy_playlist ()
784 int ret = _diskstream->use_copy_playlist ();
787 _diskstream->playlist()->set_orig_track_id (id());
794 Track::use_new_playlist ()
796 int ret = _diskstream->use_new_playlist ();
799 _diskstream->playlist()->set_orig_track_id (id());
806 Track::set_align_style (AlignStyle s, bool force)
808 _diskstream->set_align_style (s, force);
812 Track::set_align_choice (AlignChoice s, bool force)
814 _diskstream->set_align_choice (s, force);
818 Track::using_diskstream_id (PBD::ID id) const
820 return (id == _diskstream->id ());
824 Track::set_block_size (pframes_t n)
826 Route::set_block_size (n);
827 _diskstream->set_block_size (n);
831 Track::adjust_playback_buffering ()
834 _diskstream->adjust_playback_buffering ();
839 Track::adjust_capture_buffering ()
842 _diskstream->adjust_capture_buffering ();
847 Track::monitoring_state () const
849 /* Explicit requests */
851 if (_monitoring & MonitorInput) {
852 return MonitoringInput;
855 if (_monitoring & MonitorDisk) {
856 return MonitoringDisk;
859 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
860 I don't think it's ever going to be too pretty too look at.
863 bool const roll = _session.transport_rolling ();
864 bool const track_rec = _diskstream->record_enabled ();
865 bool const auto_input = _session.config.get_auto_input ();
866 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
867 bool const tape_machine_mode = Config->get_tape_machine_mode ();
870 /* I suspect that just use actively_recording() is good enough all the
871 * time, but just to keep the semantics the same as they were before
872 * sept 26th 2012, we differentiate between the cases where punch is
873 * enabled and those where it is not.
876 if (_session.config.get_punch_in() || _session.config.get_punch_out()) {
877 session_rec = _session.actively_recording ();
879 session_rec = _session.get_record_enabled();
884 if (!session_rec && roll && auto_input) {
885 return MonitoringDisk;
887 return software_monitor ? MonitoringInput : MonitoringSilence;
892 if (tape_machine_mode) {
894 return MonitoringDisk;
898 if (!roll && auto_input) {
899 return software_monitor ? MonitoringInput : MonitoringSilence;
901 return MonitoringDisk;
908 return MonitoringSilence;
912 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
914 /* never declick if there is an internal generator - we just want it to
915 keep generating sound without interruption.
917 ditto if we are monitoring inputs.
920 if (_have_internal_generator || monitoring_choice() == MonitorInput) {
925 declick = _pending_declick;
929 Amp::declick (bufs, nframes, declick);
934 Track::check_initial_delay (framecnt_t nframes, framepos_t& transport_frame)
936 if (_roll_delay > nframes) {
938 _roll_delay -= nframes;
939 silence_unlocked (nframes);
940 /* transport frame is not legal for caller to use */
943 } else if (_roll_delay > 0) {
945 nframes -= _roll_delay;
946 silence_unlocked (_roll_delay);
947 transport_frame += _roll_delay;
949 /* shuffle all the port buffers for things that lead "out" of this Route
950 to reflect that we just wrote _roll_delay frames of silence.
953 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
954 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
955 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
957 iop->increment_port_buffer_offset (_roll_delay);
960 _output->increment_port_buffer_offset (_roll_delay);
970 Track::set_monitoring (MonitorChoice mc)
972 if (mc != _monitoring) {
975 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
976 (*i)->monitoring_changed ();
979 MonitoringChanged (); /* EMIT SIGNAL */
984 Track::metering_state () const
987 if (_session.transport_rolling ()) {
988 // audio_track.cc || midi_track.cc roll() runs meter IFF:
989 rv = _meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled());
991 // track no_roll() always metering if
992 rv = _meter_point == MeterInput;
994 return rv ? MeteringInput : MeteringRoute;