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 */
353 if (session_state_changing) {
354 if (_session.transport_speed() != 0.0f) {
355 /* we're rolling but some state is changing (e.g. our diskstream contents)
356 so we cannot use them. Be silent till this is over. Don't declick.
358 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
360 passthru_silence (start_frame, end_frame, nframes, 0);
363 /* we're really not rolling, so we're either delivery silence or actually
364 monitoring, both of which are safe to do while session_state_changing is true.
368 _diskstream->check_record_status (start_frame, can_record);
372 if (_have_internal_generator) {
373 /* since the instrument has no input streams,
374 there is no reason to send any signal
381 MonitorState const s = monitoring_state ();
382 /* we are not rolling, so be silent even if we are monitoring disk, as there
383 will be no disk data coming in.
386 case MonitoringSilence:
387 /* if there is an instrument, be_silent should always
390 be_silent = (the_instrument_unlocked() == 0);
395 case MonitoringInput:
401 _amp->apply_gain_automation (false);
403 /* if have_internal_generator, or .. */
407 if (_meter_point == MeterInput) {
408 /* still need input monitoring */
409 _input->process_input (_meter, start_frame, end_frame, nframes);
412 passthru_silence (start_frame, end_frame, nframes, 0);
416 BufferSet& bufs = _session.get_scratch_buffers (n_process_buffers());
418 fill_buffers_with_input (bufs, _input, nframes);
420 if (_meter_point == MeterInput) {
421 _meter->run (bufs, start_frame, end_frame, nframes, true);
424 passthru (bufs, start_frame, end_frame, nframes, false);
427 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
428 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
430 d->flush_buffers (nframes);
438 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler)
440 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
445 if (n_outputs().n_total() == 0 && _processors.empty()) {
455 _amp->apply_gain_automation(false);
459 framecnt_t playback_distance;
461 BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
463 int const dret = _diskstream->process (bufs, _session.transport_frame(), nframes, playback_distance, false);
464 need_butler = _diskstream->commit (playback_distance);
469 Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
473 ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
474 diskstream_playlist_changed ();
475 ds->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_enable_changed, this));
476 ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
477 ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
481 Track::diskstream_playlist_changed ()
483 PlaylistChanged (); /* EMIT SIGNAL */
487 Track::diskstream_record_enable_changed ()
489 RecordEnableChanged (); /* EMIT SIGNAL */
493 Track::diskstream_speed_changed ()
495 SpeedChanged (); /* EMIT SIGNAL */
499 Track::diskstream_alignment_style_changed ()
501 AlignmentStyleChanged (); /* EMIT SIGNAL */
504 boost::shared_ptr<Playlist>
507 return _diskstream->playlist ();
511 Track::request_jack_monitors_input (bool m)
513 _diskstream->request_jack_monitors_input (m);
517 Track::ensure_jack_monitors_input (bool m)
519 _diskstream->ensure_jack_monitors_input (m);
523 Track::destructive () const
525 return _diskstream->destructive ();
528 list<boost::shared_ptr<Source> > &
529 Track::last_capture_sources ()
531 return _diskstream->last_capture_sources ();
535 Track::set_capture_offset ()
537 _diskstream->set_capture_offset ();
540 list<boost::shared_ptr<Source> >
541 Track::steal_write_sources()
543 return _diskstream->steal_write_sources ();
547 Track::reset_write_sources (bool r, bool force)
549 _diskstream->reset_write_sources (r, force);
553 Track::playback_buffer_load () const
555 return _diskstream->playback_buffer_load ();
559 Track::capture_buffer_load () const
561 return _diskstream->capture_buffer_load ();
567 return _diskstream->do_refill ();
571 Track::do_flush (RunContext c, bool force)
573 return _diskstream->do_flush (c, force);
577 Track::set_pending_overwrite (bool o)
579 _diskstream->set_pending_overwrite (o);
583 Track::seek (framepos_t p, bool complete_refill)
585 return _diskstream->seek (p, complete_refill);
589 Track::hidden () const
591 return _diskstream->hidden ();
595 Track::can_internal_playback_seek (framecnt_t p)
597 return _diskstream->can_internal_playback_seek (p);
601 Track::internal_playback_seek (framecnt_t p)
603 return _diskstream->internal_playback_seek (p);
607 Track::non_realtime_input_change ()
609 _diskstream->non_realtime_input_change ();
613 Track::non_realtime_locate (framepos_t p)
615 Route::non_realtime_locate (p);
618 /* don't waste i/o cycles and butler calls
619 for hidden (secret) tracks
621 _diskstream->non_realtime_locate (p);
626 Track::non_realtime_set_speed ()
628 _diskstream->non_realtime_set_speed ();
632 Track::overwrite_existing_buffers ()
634 return _diskstream->overwrite_existing_buffers ();
638 Track::get_captured_frames (uint32_t n) const
640 return _diskstream->get_captured_frames (n);
644 Track::set_loop (Location* l)
646 return _diskstream->set_loop (l);
650 Track::transport_looped (framepos_t p)
652 _diskstream->transport_looped (p);
656 Track::realtime_set_speed (double s, bool g)
658 return _diskstream->realtime_set_speed (s, g);
662 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
664 _diskstream->transport_stopped_wallclock (n, t, g);
668 Track::pending_overwrite () const
670 return _diskstream->pending_overwrite ();
674 Track::speed () const
676 return _diskstream->speed ();
680 Track::prepare_to_stop (framepos_t p)
682 _diskstream->prepare_to_stop (p);
686 Track::set_slaved (bool s)
688 _diskstream->set_slaved (s);
694 return _diskstream->n_channels ();
698 Track::get_capture_start_frame (uint32_t n) const
700 return _diskstream->get_capture_start_frame (n);
704 Track::alignment_style () const
706 return _diskstream->alignment_style ();
710 Track::alignment_choice () const
712 return _diskstream->alignment_choice ();
716 Track::current_capture_start () const
718 return _diskstream->current_capture_start ();
722 Track::current_capture_end () const
724 return _diskstream->current_capture_end ();
728 Track::playlist_modified ()
730 _diskstream->playlist_modified ();
734 Track::use_playlist (boost::shared_ptr<Playlist> p)
736 int ret = _diskstream->use_playlist (p);
738 p->set_orig_track_id (id());
744 Track::use_copy_playlist ()
746 int ret = _diskstream->use_copy_playlist ();
749 _diskstream->playlist()->set_orig_track_id (id());
756 Track::use_new_playlist ()
758 int ret = _diskstream->use_new_playlist ();
761 _diskstream->playlist()->set_orig_track_id (id());
768 Track::set_align_style (AlignStyle s, bool force)
770 _diskstream->set_align_style (s, force);
774 Track::set_align_choice (AlignChoice s, bool force)
776 _diskstream->set_align_choice (s, force);
780 Track::using_diskstream_id (PBD::ID id) const
782 return (id == _diskstream->id ());
786 Track::set_block_size (pframes_t n)
788 Route::set_block_size (n);
789 _diskstream->set_block_size (n);
793 Track::adjust_playback_buffering ()
796 _diskstream->adjust_playback_buffering ();
801 Track::adjust_capture_buffering ()
804 _diskstream->adjust_capture_buffering ();
809 Track::monitoring_state () const
811 /* Explicit requests */
813 if (_monitoring & MonitorInput) {
814 return MonitoringInput;
817 if (_monitoring & MonitorDisk) {
818 return MonitoringDisk;
821 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
822 I don't think it's ever going to be too pretty too look at.
825 bool const roll = _session.transport_rolling ();
826 bool const track_rec = _diskstream->record_enabled ();
827 bool const auto_input = _session.config.get_auto_input ();
828 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
829 bool const tape_machine_mode = Config->get_tape_machine_mode ();
832 /* I suspect that just use actively_recording() is good enough all the
833 * time, but just to keep the semantics the same as they were before
834 * sept 26th 2012, we differentiate between the cases where punch is
835 * enabled and those where it is not.
838 if (_session.config.get_punch_in() || _session.config.get_punch_out()) {
839 session_rec = _session.actively_recording ();
841 session_rec = _session.get_record_enabled();
846 if (!session_rec && roll && auto_input) {
847 return MonitoringDisk;
849 return software_monitor ? MonitoringInput : MonitoringSilence;
854 if (tape_machine_mode) {
856 return MonitoringDisk;
860 if (!roll && auto_input) {
861 return software_monitor ? MonitoringInput : MonitoringSilence;
863 return MonitoringDisk;
870 return MonitoringSilence;
874 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
876 /* never declick if there is an internal generator - we just want it to
877 keep generating sound without interruption.
879 ditto if we are monitoring inputs.
882 if (_have_internal_generator || monitoring_choice() == MonitorInput) {
887 declick = _pending_declick;
891 Amp::declick (bufs, nframes, declick);
896 Track::check_initial_delay (framecnt_t nframes, framepos_t& transport_frame)
898 if (_roll_delay > nframes) {
900 _roll_delay -= nframes;
901 silence_unlocked (nframes);
902 /* transport frame is not legal for caller to use */
905 } else if (_roll_delay > 0) {
907 nframes -= _roll_delay;
908 silence_unlocked (_roll_delay);
909 transport_frame += _roll_delay;
911 /* shuffle all the port buffers for things that lead "out" of this Route
912 to reflect that we just wrote _roll_delay frames of silence.
915 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
916 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
917 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
919 iop->increment_port_buffer_offset (_roll_delay);
922 _output->increment_port_buffer_offset (_roll_delay);
932 Track::set_monitoring (MonitorChoice mc)
934 if (mc != _monitoring) {
937 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
938 (*i)->monitoring_changed ();
941 MonitoringChanged (); /* EMIT SIGNAL */
946 Track::metering_state () const
948 return _diskstream->record_enabled() ? MeteringInput : MeteringRoute;