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);
337 bool can_record = _session.actively_recording ();
339 if (n_outputs().n_total() == 0) {
348 if (session_state_changing) {
349 if (_session.transport_speed() != 0.0f) {
350 /* we're rolling but some state is changing (e.g. our diskstream contents)
351 so we cannot use them. Be silent till this is over. Don't declick.
353 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
355 passthru_silence (start_frame, end_frame, nframes, 0);
358 /* we're really not rolling, so we're either delivery silence or actually
359 monitoring, both of which are safe to do while session_state_changing is true.
363 _diskstream->check_record_status (start_frame, can_record);
367 if (_have_internal_generator) {
368 /* since the instrument has no input streams,
369 there is no reason to send any signal
376 MonitorState const s = monitoring_state ();
377 /* we are not rolling, so be silent even if we are monitoring disk, as there
378 will be no disk data coming in.
381 case MonitoringSilence:
382 /* if there is an instrument, be_silent should always
385 be_silent = (the_instrument_unlocked() == 0);
390 case MonitoringInput:
396 if (!_have_internal_generator && metering_state() == MeteringInput) {
397 _input->process_input (_meter, start_frame, end_frame, nframes);
400 _amp->apply_gain_automation (false);
402 /* if have_internal_generator, or .. */
403 //_input->process_input (_meter, start_frame, end_frame, nframes);
407 passthru_silence (start_frame, end_frame, nframes, 0);
411 /* we're sending signal, but we may still want to meter the input.
414 passthru (start_frame, end_frame, nframes, false);
417 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
418 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
420 d->flush_buffers (nframes);
428 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler)
430 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
435 if (n_outputs().n_total() == 0 && _processors.empty()) {
445 _amp->apply_gain_automation(false);
449 framecnt_t playback_distance;
450 int const dret = _diskstream->process (_session.transport_frame(), nframes, playback_distance);
451 need_butler = _diskstream->commit (playback_distance);
456 Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
460 ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
461 diskstream_playlist_changed ();
462 ds->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_enable_changed, this));
463 ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
464 ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
468 Track::diskstream_playlist_changed ()
470 PlaylistChanged (); /* EMIT SIGNAL */
474 Track::diskstream_record_enable_changed ()
476 RecordEnableChanged (); /* EMIT SIGNAL */
480 Track::diskstream_speed_changed ()
482 SpeedChanged (); /* EMIT SIGNAL */
486 Track::diskstream_alignment_style_changed ()
488 AlignmentStyleChanged (); /* EMIT SIGNAL */
491 boost::shared_ptr<Playlist>
494 return _diskstream->playlist ();
498 Track::request_jack_monitors_input (bool m)
500 _diskstream->request_jack_monitors_input (m);
504 Track::ensure_jack_monitors_input (bool m)
506 _diskstream->ensure_jack_monitors_input (m);
510 Track::destructive () const
512 return _diskstream->destructive ();
515 list<boost::shared_ptr<Source> > &
516 Track::last_capture_sources ()
518 return _diskstream->last_capture_sources ();
522 Track::set_capture_offset ()
524 _diskstream->set_capture_offset ();
527 list<boost::shared_ptr<Source> >
528 Track::steal_write_sources()
530 return _diskstream->steal_write_sources ();
534 Track::reset_write_sources (bool r, bool force)
536 _diskstream->reset_write_sources (r, force);
540 Track::playback_buffer_load () const
542 return _diskstream->playback_buffer_load ();
546 Track::capture_buffer_load () const
548 return _diskstream->capture_buffer_load ();
554 return _diskstream->do_refill ();
558 Track::do_flush (RunContext c, bool force)
560 return _diskstream->do_flush (c, force);
564 Track::set_pending_overwrite (bool o)
566 _diskstream->set_pending_overwrite (o);
570 Track::seek (framepos_t p, bool complete_refill)
572 return _diskstream->seek (p, complete_refill);
576 Track::hidden () const
578 return _diskstream->hidden ();
582 Track::can_internal_playback_seek (framecnt_t p)
584 return _diskstream->can_internal_playback_seek (p);
588 Track::internal_playback_seek (framecnt_t p)
590 return _diskstream->internal_playback_seek (p);
594 Track::non_realtime_input_change ()
596 _diskstream->non_realtime_input_change ();
600 Track::non_realtime_locate (framepos_t p)
602 Route::non_realtime_locate (p);
605 /* don't waste i/o cycles and butler calls
606 for hidden (secret) tracks
608 _diskstream->non_realtime_locate (p);
613 Track::non_realtime_set_speed ()
615 _diskstream->non_realtime_set_speed ();
619 Track::overwrite_existing_buffers ()
621 return _diskstream->overwrite_existing_buffers ();
625 Track::get_captured_frames (uint32_t n) const
627 return _diskstream->get_captured_frames (n);
631 Track::set_loop (Location* l)
633 return _diskstream->set_loop (l);
637 Track::transport_looped (framepos_t p)
639 _diskstream->transport_looped (p);
643 Track::realtime_set_speed (double s, bool g)
645 return _diskstream->realtime_set_speed (s, g);
649 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
651 _diskstream->transport_stopped_wallclock (n, t, g);
655 Track::pending_overwrite () const
657 return _diskstream->pending_overwrite ();
661 Track::speed () const
663 return _diskstream->speed ();
667 Track::prepare_to_stop (framepos_t p)
669 _diskstream->prepare_to_stop (p);
673 Track::set_slaved (bool s)
675 _diskstream->set_slaved (s);
681 return _diskstream->n_channels ();
685 Track::get_capture_start_frame (uint32_t n) const
687 return _diskstream->get_capture_start_frame (n);
691 Track::alignment_style () const
693 return _diskstream->alignment_style ();
697 Track::alignment_choice () const
699 return _diskstream->alignment_choice ();
703 Track::current_capture_start () const
705 return _diskstream->current_capture_start ();
709 Track::current_capture_end () const
711 return _diskstream->current_capture_end ();
715 Track::playlist_modified ()
717 _diskstream->playlist_modified ();
721 Track::use_playlist (boost::shared_ptr<Playlist> p)
723 int ret = _diskstream->use_playlist (p);
725 p->set_orig_track_id (id());
731 Track::use_copy_playlist ()
733 int ret = _diskstream->use_copy_playlist ();
736 _diskstream->playlist()->set_orig_track_id (id());
743 Track::use_new_playlist ()
745 int ret = _diskstream->use_new_playlist ();
748 _diskstream->playlist()->set_orig_track_id (id());
755 Track::set_align_style (AlignStyle s, bool force)
757 _diskstream->set_align_style (s, force);
761 Track::set_align_choice (AlignChoice s, bool force)
763 _diskstream->set_align_choice (s, force);
767 Track::using_diskstream_id (PBD::ID id) const
769 return (id == _diskstream->id ());
773 Track::set_block_size (pframes_t n)
775 Route::set_block_size (n);
776 _diskstream->set_block_size (n);
780 Track::adjust_playback_buffering ()
783 _diskstream->adjust_playback_buffering ();
788 Track::adjust_capture_buffering ()
791 _diskstream->adjust_capture_buffering ();
796 Track::monitoring_state () const
798 /* Explicit requests */
800 if (_monitoring & MonitorInput) {
801 return MonitoringInput;
804 if (_monitoring & MonitorDisk) {
805 return MonitoringDisk;
808 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
809 I don't think it's ever going to be too pretty too look at.
812 bool const roll = _session.transport_rolling ();
813 bool const track_rec = _diskstream->record_enabled ();
814 bool const auto_input = _session.config.get_auto_input ();
815 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
816 bool const tape_machine_mode = Config->get_tape_machine_mode ();
819 /* I suspect that just use actively_recording() is good enough all the
820 * time, but just to keep the semantics the same as they were before
821 * sept 26th 2012, we differentiate between the cases where punch is
822 * enabled and those where it is not.
825 if (_session.config.get_punch_in() || _session.config.get_punch_out()) {
826 session_rec = _session.actively_recording ();
828 session_rec = _session.get_record_enabled();
833 if (!session_rec && roll && auto_input) {
834 return MonitoringDisk;
836 return software_monitor ? MonitoringInput : MonitoringSilence;
841 if (tape_machine_mode) {
843 return MonitoringDisk;
847 if (!roll && auto_input) {
848 return software_monitor ? MonitoringInput : MonitoringSilence;
850 return MonitoringDisk;
857 return MonitoringSilence;
861 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
863 /* never declick if there is an internal generator - we just want it to
864 keep generating sound without interruption.
866 ditto if we are monitoring inputs.
869 if (_have_internal_generator || monitoring_choice() == MonitorInput) {
874 declick = _pending_declick;
878 Amp::declick (bufs, nframes, declick);
883 Track::check_initial_delay (framecnt_t nframes, framepos_t& transport_frame)
885 if (_roll_delay > nframes) {
887 _roll_delay -= nframes;
888 silence_unlocked (nframes);
889 /* transport frame is not legal for caller to use */
892 } else if (_roll_delay > 0) {
894 nframes -= _roll_delay;
895 silence_unlocked (_roll_delay);
896 transport_frame += _roll_delay;
898 /* shuffle all the port buffers for things that lead "out" of this Route
899 to reflect that we just wrote _roll_delay frames of silence.
902 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
903 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
904 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
906 iop->increment_port_buffer_offset (_roll_delay);
909 _output->increment_port_buffer_offset (_roll_delay);
919 Track::set_monitoring (MonitorChoice mc)
921 if (mc != _monitoring) {
924 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
925 (*i)->monitoring_changed ();
928 MonitoringChanged (); /* EMIT SIGNAL */
933 Track::metering_state () const
935 return _diskstream->record_enabled() ? MeteringInput : MeteringRoute;