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:
404 _amp->apply_gain_automation (false);
406 /* if have_internal_generator, or .. */
410 if (_meter_point == MeterInput) {
411 /* still need input monitoring and metering */
413 bool const track_rec = _diskstream->record_enabled ();
414 bool const auto_input = _session.config.get_auto_input ();
415 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
416 bool const tape_machine_mode = Config->get_tape_machine_mode ();
417 bool no_meter = false;
419 if (!auto_input && !track_rec) {
422 else if (!software_monitor && tape_machine_mode && !track_rec) {
425 else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) {
431 _input->process_input (boost::shared_ptr<Processor>(), start_frame, end_frame, nframes);
433 _input->process_input (_meter, start_frame, end_frame, nframes);
437 passthru_silence (start_frame, end_frame, nframes, 0);
441 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
443 fill_buffers_with_input (bufs, _input, nframes);
445 if (_meter_point == MeterInput) {
446 _meter->run (bufs, start_frame, end_frame, nframes, true);
449 passthru (bufs, start_frame, end_frame, nframes, false);
452 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
453 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
455 d->flush_buffers (nframes);
463 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler)
465 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
470 if (n_outputs().n_total() == 0 && _processors.empty()) {
480 _amp->apply_gain_automation(false);
484 framecnt_t playback_distance;
486 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
488 int const dret = _diskstream->process (bufs, _session.transport_frame(), nframes, playback_distance, false);
489 need_butler = _diskstream->commit (playback_distance);
494 Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
498 ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
499 diskstream_playlist_changed ();
500 ds->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_enable_changed, this));
501 ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
502 ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
506 Track::diskstream_playlist_changed ()
508 PlaylistChanged (); /* EMIT SIGNAL */
512 Track::diskstream_record_enable_changed ()
514 RecordEnableChanged (); /* EMIT SIGNAL */
518 Track::diskstream_speed_changed ()
520 SpeedChanged (); /* EMIT SIGNAL */
524 Track::diskstream_alignment_style_changed ()
526 AlignmentStyleChanged (); /* EMIT SIGNAL */
529 boost::shared_ptr<Playlist>
532 return _diskstream->playlist ();
536 Track::request_jack_monitors_input (bool m)
538 _diskstream->request_jack_monitors_input (m);
542 Track::ensure_jack_monitors_input (bool m)
544 _diskstream->ensure_jack_monitors_input (m);
548 Track::destructive () const
550 return _diskstream->destructive ();
553 list<boost::shared_ptr<Source> > &
554 Track::last_capture_sources ()
556 return _diskstream->last_capture_sources ();
560 Track::set_capture_offset ()
562 _diskstream->set_capture_offset ();
565 list<boost::shared_ptr<Source> >
566 Track::steal_write_sources()
568 return _diskstream->steal_write_sources ();
572 Track::reset_write_sources (bool r, bool force)
574 _diskstream->reset_write_sources (r, force);
578 Track::playback_buffer_load () const
580 return _diskstream->playback_buffer_load ();
584 Track::capture_buffer_load () const
586 return _diskstream->capture_buffer_load ();
592 return _diskstream->do_refill ();
596 Track::do_flush (RunContext c, bool force)
598 return _diskstream->do_flush (c, force);
602 Track::set_pending_overwrite (bool o)
604 _diskstream->set_pending_overwrite (o);
608 Track::seek (framepos_t p, bool complete_refill)
610 return _diskstream->seek (p, complete_refill);
614 Track::hidden () const
616 return _diskstream->hidden ();
620 Track::can_internal_playback_seek (framecnt_t p)
622 return _diskstream->can_internal_playback_seek (p);
626 Track::internal_playback_seek (framecnt_t p)
628 return _diskstream->internal_playback_seek (p);
632 Track::non_realtime_input_change ()
634 _diskstream->non_realtime_input_change ();
638 Track::non_realtime_locate (framepos_t p)
640 Route::non_realtime_locate (p);
643 /* don't waste i/o cycles and butler calls
644 for hidden (secret) tracks
646 _diskstream->non_realtime_locate (p);
651 Track::non_realtime_set_speed ()
653 _diskstream->non_realtime_set_speed ();
657 Track::overwrite_existing_buffers ()
659 return _diskstream->overwrite_existing_buffers ();
663 Track::get_captured_frames (uint32_t n) const
665 return _diskstream->get_captured_frames (n);
669 Track::set_loop (Location* l)
671 return _diskstream->set_loop (l);
675 Track::transport_looped (framepos_t p)
677 _diskstream->transport_looped (p);
681 Track::realtime_set_speed (double s, bool g)
683 return _diskstream->realtime_set_speed (s, g);
687 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
689 _diskstream->transport_stopped_wallclock (n, t, g);
693 Track::pending_overwrite () const
695 return _diskstream->pending_overwrite ();
699 Track::speed () const
701 return _diskstream->speed ();
705 Track::prepare_to_stop (framepos_t p)
707 _diskstream->prepare_to_stop (p);
711 Track::set_slaved (bool s)
713 _diskstream->set_slaved (s);
719 return _diskstream->n_channels ();
723 Track::get_capture_start_frame (uint32_t n) const
725 return _diskstream->get_capture_start_frame (n);
729 Track::alignment_style () const
731 return _diskstream->alignment_style ();
735 Track::alignment_choice () const
737 return _diskstream->alignment_choice ();
741 Track::current_capture_start () const
743 return _diskstream->current_capture_start ();
747 Track::current_capture_end () const
749 return _diskstream->current_capture_end ();
753 Track::playlist_modified ()
755 _diskstream->playlist_modified ();
759 Track::use_playlist (boost::shared_ptr<Playlist> p)
761 int ret = _diskstream->use_playlist (p);
763 p->set_orig_track_id (id());
769 Track::use_copy_playlist ()
771 int ret = _diskstream->use_copy_playlist ();
774 _diskstream->playlist()->set_orig_track_id (id());
781 Track::use_new_playlist ()
783 int ret = _diskstream->use_new_playlist ();
786 _diskstream->playlist()->set_orig_track_id (id());
793 Track::set_align_style (AlignStyle s, bool force)
795 _diskstream->set_align_style (s, force);
799 Track::set_align_choice (AlignChoice s, bool force)
801 _diskstream->set_align_choice (s, force);
805 Track::using_diskstream_id (PBD::ID id) const
807 return (id == _diskstream->id ());
811 Track::set_block_size (pframes_t n)
813 Route::set_block_size (n);
814 _diskstream->set_block_size (n);
818 Track::adjust_playback_buffering ()
821 _diskstream->adjust_playback_buffering ();
826 Track::adjust_capture_buffering ()
829 _diskstream->adjust_capture_buffering ();
834 Track::monitoring_state () const
836 /* Explicit requests */
838 if (_monitoring & MonitorInput) {
839 return MonitoringInput;
842 if (_monitoring & MonitorDisk) {
843 return MonitoringDisk;
846 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
847 I don't think it's ever going to be too pretty too look at.
850 bool const roll = _session.transport_rolling ();
851 bool const track_rec = _diskstream->record_enabled ();
852 bool const auto_input = _session.config.get_auto_input ();
853 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
854 bool const tape_machine_mode = Config->get_tape_machine_mode ();
857 /* I suspect that just use actively_recording() is good enough all the
858 * time, but just to keep the semantics the same as they were before
859 * sept 26th 2012, we differentiate between the cases where punch is
860 * enabled and those where it is not.
863 if (_session.config.get_punch_in() || _session.config.get_punch_out()) {
864 session_rec = _session.actively_recording ();
866 session_rec = _session.get_record_enabled();
871 if (!session_rec && roll && auto_input) {
872 return MonitoringDisk;
874 return software_monitor ? MonitoringInput : MonitoringSilence;
879 if (tape_machine_mode) {
881 return MonitoringDisk;
885 if (!roll && auto_input) {
886 return software_monitor ? MonitoringInput : MonitoringSilence;
888 return MonitoringDisk;
895 return MonitoringSilence;
899 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
901 /* never declick if there is an internal generator - we just want it to
902 keep generating sound without interruption.
904 ditto if we are monitoring inputs.
907 if (_have_internal_generator || monitoring_choice() == MonitorInput) {
912 declick = _pending_declick;
916 Amp::declick (bufs, nframes, declick);
921 Track::check_initial_delay (framecnt_t nframes, framepos_t& transport_frame)
923 if (_roll_delay > nframes) {
925 _roll_delay -= nframes;
926 silence_unlocked (nframes);
927 /* transport frame is not legal for caller to use */
930 } else if (_roll_delay > 0) {
932 nframes -= _roll_delay;
933 silence_unlocked (_roll_delay);
934 transport_frame += _roll_delay;
936 /* shuffle all the port buffers for things that lead "out" of this Route
937 to reflect that we just wrote _roll_delay frames of silence.
940 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
941 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
942 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
944 iop->increment_port_buffer_offset (_roll_delay);
947 _output->increment_port_buffer_offset (_roll_delay);
957 Track::set_monitoring (MonitorChoice mc)
959 if (mc != _monitoring) {
962 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
963 (*i)->monitoring_changed ();
966 MonitoringChanged (); /* EMIT SIGNAL */
971 Track::metering_state () const
974 if (_session.transport_rolling ()) {
975 // audio_track.cc || midi_track.cc roll() runs meter IFF:
976 rv = _meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled());
978 // track no_roll() always metering if
979 rv = _meter_point == MeterInput;
981 return rv ? MeteringInput : MeteringRoute;