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 /* this needs a proper K-map
420 * and should be separated into a function similar to monitoring_state()
421 * that also handles roll() states in audio_track.cc, midi_track.cc and route.cc
423 * see http://www.oofus.co.uk/ardour/Ardour3MonitorModesV3.pdf
425 if (!auto_input && !track_rec) {
428 else if (tape_machine_mode && !track_rec && auto_input) {
431 else if (!software_monitor && tape_machine_mode && !track_rec) {
434 else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) {
440 _input->process_input (boost::shared_ptr<Processor>(), start_frame, end_frame, nframes);
442 _input->process_input (_meter, start_frame, end_frame, nframes);
446 passthru_silence (start_frame, end_frame, nframes, 0);
450 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
452 fill_buffers_with_input (bufs, _input, nframes);
454 if (_meter_point == MeterInput) {
455 _meter->run (bufs, start_frame, end_frame, nframes, true);
458 passthru (bufs, start_frame, end_frame, nframes, false);
461 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
462 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
464 d->flush_buffers (nframes);
472 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler)
474 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
479 if (n_outputs().n_total() == 0 && _processors.empty()) {
489 _amp->apply_gain_automation(false);
493 framecnt_t playback_distance;
495 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
497 int const dret = _diskstream->process (bufs, _session.transport_frame(), nframes, playback_distance, false);
498 need_butler = _diskstream->commit (playback_distance);
503 Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
507 ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
508 diskstream_playlist_changed ();
509 ds->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_enable_changed, this));
510 ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
511 ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
515 Track::diskstream_playlist_changed ()
517 PlaylistChanged (); /* EMIT SIGNAL */
521 Track::diskstream_record_enable_changed ()
523 RecordEnableChanged (); /* EMIT SIGNAL */
527 Track::diskstream_speed_changed ()
529 SpeedChanged (); /* EMIT SIGNAL */
533 Track::diskstream_alignment_style_changed ()
535 AlignmentStyleChanged (); /* EMIT SIGNAL */
538 boost::shared_ptr<Playlist>
541 return _diskstream->playlist ();
545 Track::request_jack_monitors_input (bool m)
547 _diskstream->request_jack_monitors_input (m);
551 Track::ensure_jack_monitors_input (bool m)
553 _diskstream->ensure_jack_monitors_input (m);
557 Track::destructive () const
559 return _diskstream->destructive ();
562 list<boost::shared_ptr<Source> > &
563 Track::last_capture_sources ()
565 return _diskstream->last_capture_sources ();
569 Track::set_capture_offset ()
571 _diskstream->set_capture_offset ();
574 list<boost::shared_ptr<Source> >
575 Track::steal_write_sources()
577 return _diskstream->steal_write_sources ();
581 Track::reset_write_sources (bool r, bool force)
583 _diskstream->reset_write_sources (r, force);
587 Track::playback_buffer_load () const
589 return _diskstream->playback_buffer_load ();
593 Track::capture_buffer_load () const
595 return _diskstream->capture_buffer_load ();
601 return _diskstream->do_refill ();
605 Track::do_flush (RunContext c, bool force)
607 return _diskstream->do_flush (c, force);
611 Track::set_pending_overwrite (bool o)
613 _diskstream->set_pending_overwrite (o);
617 Track::seek (framepos_t p, bool complete_refill)
619 return _diskstream->seek (p, complete_refill);
623 Track::hidden () const
625 return _diskstream->hidden ();
629 Track::can_internal_playback_seek (framecnt_t p)
631 return _diskstream->can_internal_playback_seek (p);
635 Track::internal_playback_seek (framecnt_t p)
637 return _diskstream->internal_playback_seek (p);
641 Track::non_realtime_input_change ()
643 _diskstream->non_realtime_input_change ();
647 Track::non_realtime_locate (framepos_t p)
649 Route::non_realtime_locate (p);
652 /* don't waste i/o cycles and butler calls
653 for hidden (secret) tracks
655 _diskstream->non_realtime_locate (p);
660 Track::non_realtime_set_speed ()
662 _diskstream->non_realtime_set_speed ();
666 Track::overwrite_existing_buffers ()
668 return _diskstream->overwrite_existing_buffers ();
672 Track::get_captured_frames (uint32_t n) const
674 return _diskstream->get_captured_frames (n);
678 Track::set_loop (Location* l)
680 return _diskstream->set_loop (l);
684 Track::transport_looped (framepos_t p)
686 _diskstream->transport_looped (p);
690 Track::realtime_set_speed (double s, bool g)
692 return _diskstream->realtime_set_speed (s, g);
696 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
698 _diskstream->transport_stopped_wallclock (n, t, g);
702 Track::pending_overwrite () const
704 return _diskstream->pending_overwrite ();
708 Track::speed () const
710 return _diskstream->speed ();
714 Track::prepare_to_stop (framepos_t p)
716 _diskstream->prepare_to_stop (p);
720 Track::set_slaved (bool s)
722 _diskstream->set_slaved (s);
728 return _diskstream->n_channels ();
732 Track::get_capture_start_frame (uint32_t n) const
734 return _diskstream->get_capture_start_frame (n);
738 Track::alignment_style () const
740 return _diskstream->alignment_style ();
744 Track::alignment_choice () const
746 return _diskstream->alignment_choice ();
750 Track::current_capture_start () const
752 return _diskstream->current_capture_start ();
756 Track::current_capture_end () const
758 return _diskstream->current_capture_end ();
762 Track::playlist_modified ()
764 _diskstream->playlist_modified ();
768 Track::use_playlist (boost::shared_ptr<Playlist> p)
770 int ret = _diskstream->use_playlist (p);
772 p->set_orig_track_id (id());
778 Track::use_copy_playlist ()
780 int ret = _diskstream->use_copy_playlist ();
783 _diskstream->playlist()->set_orig_track_id (id());
790 Track::use_new_playlist ()
792 int ret = _diskstream->use_new_playlist ();
795 _diskstream->playlist()->set_orig_track_id (id());
802 Track::set_align_style (AlignStyle s, bool force)
804 _diskstream->set_align_style (s, force);
808 Track::set_align_choice (AlignChoice s, bool force)
810 _diskstream->set_align_choice (s, force);
814 Track::using_diskstream_id (PBD::ID id) const
816 return (id == _diskstream->id ());
820 Track::set_block_size (pframes_t n)
822 Route::set_block_size (n);
823 _diskstream->set_block_size (n);
827 Track::adjust_playback_buffering ()
830 _diskstream->adjust_playback_buffering ();
835 Track::adjust_capture_buffering ()
838 _diskstream->adjust_capture_buffering ();
843 Track::monitoring_state () const
845 /* Explicit requests */
847 if (_monitoring & MonitorInput) {
848 return MonitoringInput;
851 if (_monitoring & MonitorDisk) {
852 return MonitoringDisk;
855 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
856 I don't think it's ever going to be too pretty too look at.
859 bool const roll = _session.transport_rolling ();
860 bool const track_rec = _diskstream->record_enabled ();
861 bool const auto_input = _session.config.get_auto_input ();
862 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
863 bool const tape_machine_mode = Config->get_tape_machine_mode ();
866 /* I suspect that just use actively_recording() is good enough all the
867 * time, but just to keep the semantics the same as they were before
868 * sept 26th 2012, we differentiate between the cases where punch is
869 * enabled and those where it is not.
872 if (_session.config.get_punch_in() || _session.config.get_punch_out()) {
873 session_rec = _session.actively_recording ();
875 session_rec = _session.get_record_enabled();
880 if (!session_rec && roll && auto_input) {
881 return MonitoringDisk;
883 return software_monitor ? MonitoringInput : MonitoringSilence;
888 if (tape_machine_mode) {
890 return MonitoringDisk;
894 if (!roll && auto_input) {
895 return software_monitor ? MonitoringInput : MonitoringSilence;
897 return MonitoringDisk;
904 return MonitoringSilence;
908 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
910 /* never declick if there is an internal generator - we just want it to
911 keep generating sound without interruption.
913 ditto if we are monitoring inputs.
916 if (_have_internal_generator || monitoring_choice() == MonitorInput) {
921 declick = _pending_declick;
925 Amp::declick (bufs, nframes, declick);
930 Track::check_initial_delay (framecnt_t nframes, framepos_t& transport_frame)
932 if (_roll_delay > nframes) {
934 _roll_delay -= nframes;
935 silence_unlocked (nframes);
936 /* transport frame is not legal for caller to use */
939 } else if (_roll_delay > 0) {
941 nframes -= _roll_delay;
942 silence_unlocked (_roll_delay);
943 transport_frame += _roll_delay;
945 /* shuffle all the port buffers for things that lead "out" of this Route
946 to reflect that we just wrote _roll_delay frames of silence.
949 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
950 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
951 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
953 iop->increment_port_buffer_offset (_roll_delay);
956 _output->increment_port_buffer_offset (_roll_delay);
966 Track::set_monitoring (MonitorChoice mc)
968 if (mc != _monitoring) {
971 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
972 (*i)->monitoring_changed ();
975 MonitoringChanged (); /* EMIT SIGNAL */
980 Track::metering_state () const
983 if (_session.transport_rolling ()) {
984 // audio_track.cc || midi_track.cc roll() runs meter IFF:
985 rv = _meter_point == MeterInput && (_monitoring & MonitorInput || _diskstream->record_enabled());
987 // track no_roll() always metering if
988 rv = _meter_point == MeterInput;
990 return rv ? MeteringInput : MeteringRoute;