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
374 MonitorState const s = monitoring_state ();
375 /* we are not rolling, so be silent even if we are monitoring disk, as there
376 will be no disk data coming in.
378 be_silent = (s == MonitoringSilence || s == MonitoringDisk);
381 if (!_have_internal_generator && metering_state() == MeteringInput) {
382 _input->process_input (_meter, start_frame, end_frame, nframes);
385 _amp->apply_gain_automation(false);
387 /* if have_internal_generator, or .. */
388 //_input->process_input (_meter, start_frame, end_frame, nframes);
392 passthru_silence (start_frame, end_frame, nframes, 0);
396 /* we're sending signal, but we may still want to meter the input.
399 passthru (start_frame, end_frame, nframes, false);
402 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
403 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
405 d->flush_buffers (nframes);
413 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler)
415 Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
420 if (n_outputs().n_total() == 0 && _processors.empty()) {
430 _amp->apply_gain_automation(false);
434 framecnt_t playback_distance;
435 int const dret = _diskstream->process (_session.transport_frame(), nframes, playback_distance);
436 need_butler = _diskstream->commit (playback_distance);
441 Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
445 ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
446 diskstream_playlist_changed ();
447 ds->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_enable_changed, this));
448 ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
449 ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
453 Track::diskstream_playlist_changed ()
455 PlaylistChanged (); /* EMIT SIGNAL */
459 Track::diskstream_record_enable_changed ()
461 RecordEnableChanged (); /* EMIT SIGNAL */
465 Track::diskstream_speed_changed ()
467 SpeedChanged (); /* EMIT SIGNAL */
471 Track::diskstream_alignment_style_changed ()
473 AlignmentStyleChanged (); /* EMIT SIGNAL */
476 boost::shared_ptr<Playlist>
479 return _diskstream->playlist ();
483 Track::request_jack_monitors_input (bool m)
485 _diskstream->request_jack_monitors_input (m);
489 Track::ensure_jack_monitors_input (bool m)
491 _diskstream->ensure_jack_monitors_input (m);
495 Track::destructive () const
497 return _diskstream->destructive ();
500 list<boost::shared_ptr<Source> > &
501 Track::last_capture_sources ()
503 return _diskstream->last_capture_sources ();
507 Track::set_capture_offset ()
509 _diskstream->set_capture_offset ();
512 list<boost::shared_ptr<Source> >
513 Track::steal_write_sources()
515 return _diskstream->steal_write_sources ();
519 Track::reset_write_sources (bool r, bool force)
521 _diskstream->reset_write_sources (r, force);
525 Track::playback_buffer_load () const
527 return _diskstream->playback_buffer_load ();
531 Track::capture_buffer_load () const
533 return _diskstream->capture_buffer_load ();
539 return _diskstream->do_refill ();
543 Track::do_flush (RunContext c, bool force)
545 return _diskstream->do_flush (c, force);
549 Track::set_pending_overwrite (bool o)
551 _diskstream->set_pending_overwrite (o);
555 Track::seek (framepos_t p, bool complete_refill)
557 return _diskstream->seek (p, complete_refill);
561 Track::hidden () const
563 return _diskstream->hidden ();
567 Track::can_internal_playback_seek (framecnt_t p)
569 return _diskstream->can_internal_playback_seek (p);
573 Track::internal_playback_seek (framecnt_t p)
575 return _diskstream->internal_playback_seek (p);
579 Track::non_realtime_input_change ()
581 _diskstream->non_realtime_input_change ();
585 Track::non_realtime_locate (framepos_t p)
587 Route::non_realtime_locate (p);
590 /* don't waste i/o cycles and butler calls
591 for hidden (secret) tracks
593 _diskstream->non_realtime_locate (p);
598 Track::non_realtime_set_speed ()
600 _diskstream->non_realtime_set_speed ();
604 Track::overwrite_existing_buffers ()
606 return _diskstream->overwrite_existing_buffers ();
610 Track::get_captured_frames (uint32_t n) const
612 return _diskstream->get_captured_frames (n);
616 Track::set_loop (Location* l)
618 return _diskstream->set_loop (l);
622 Track::transport_looped (framepos_t p)
624 _diskstream->transport_looped (p);
628 Track::realtime_set_speed (double s, bool g)
630 return _diskstream->realtime_set_speed (s, g);
634 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
636 _diskstream->transport_stopped_wallclock (n, t, g);
640 Track::pending_overwrite () const
642 return _diskstream->pending_overwrite ();
646 Track::speed () const
648 return _diskstream->speed ();
652 Track::prepare_to_stop (framepos_t p)
654 _diskstream->prepare_to_stop (p);
658 Track::set_slaved (bool s)
660 _diskstream->set_slaved (s);
666 return _diskstream->n_channels ();
670 Track::get_capture_start_frame (uint32_t n) const
672 return _diskstream->get_capture_start_frame (n);
676 Track::alignment_style () const
678 return _diskstream->alignment_style ();
682 Track::alignment_choice () const
684 return _diskstream->alignment_choice ();
688 Track::current_capture_start () const
690 return _diskstream->current_capture_start ();
694 Track::current_capture_end () const
696 return _diskstream->current_capture_end ();
700 Track::playlist_modified ()
702 _diskstream->playlist_modified ();
706 Track::use_playlist (boost::shared_ptr<Playlist> p)
708 int ret = _diskstream->use_playlist (p);
710 p->set_orig_track_id (id());
716 Track::use_copy_playlist ()
718 int ret = _diskstream->use_copy_playlist ();
721 _diskstream->playlist()->set_orig_track_id (id());
728 Track::use_new_playlist ()
730 int ret = _diskstream->use_new_playlist ();
733 _diskstream->playlist()->set_orig_track_id (id());
740 Track::set_align_style (AlignStyle s, bool force)
742 _diskstream->set_align_style (s, force);
746 Track::set_align_choice (AlignChoice s, bool force)
748 _diskstream->set_align_choice (s, force);
752 Track::using_diskstream_id (PBD::ID id) const
754 return (id == _diskstream->id ());
758 Track::set_block_size (pframes_t n)
760 Route::set_block_size (n);
761 _diskstream->set_block_size (n);
765 Track::adjust_playback_buffering ()
768 _diskstream->adjust_playback_buffering ();
773 Track::adjust_capture_buffering ()
776 _diskstream->adjust_capture_buffering ();
781 Track::monitoring_state () const
783 /* Explicit requests */
785 if (_monitoring & MonitorInput) {
786 return MonitoringInput;
789 if (_monitoring & MonitorDisk) {
790 return MonitoringDisk;
793 /* This is an implementation of the truth table in doc/monitor_modes.pdf;
794 I don't think it's ever going to be too pretty too look at.
797 bool const roll = _session.transport_rolling ();
798 bool const track_rec = _diskstream->record_enabled ();
799 bool const auto_input = _session.config.get_auto_input ();
800 bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
801 bool const tape_machine_mode = Config->get_tape_machine_mode ();
804 /* I suspect that just use actively_recording() is good enough all the
805 * time, but just to keep the semantics the same as they were before
806 * sept 26th 2012, we differentiate between the cases where punch is
807 * enabled and those where it is not.
810 if (_session.config.get_punch_in() || _session.config.get_punch_out()) {
811 session_rec = _session.actively_recording ();
813 session_rec = _session.get_record_enabled();
818 if (!session_rec && roll && auto_input) {
819 return MonitoringDisk;
821 return software_monitor ? MonitoringInput : MonitoringSilence;
826 if (tape_machine_mode) {
828 return MonitoringDisk;
832 if (!roll && auto_input) {
833 return software_monitor ? MonitoringInput : MonitoringSilence;
835 return MonitoringDisk;
842 return MonitoringSilence;
846 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
848 /* never declick if there is an internal generator - we just want it to
849 keep generating sound without interruption.
851 ditto if we are monitoring inputs.
854 if (_have_internal_generator || monitoring_choice() == MonitorInput) {
859 declick = _pending_declick;
863 Amp::declick (bufs, nframes, declick);
868 Track::check_initial_delay (framecnt_t nframes, framepos_t& transport_frame)
870 if (_roll_delay > nframes) {
872 _roll_delay -= nframes;
873 silence_unlocked (nframes);
874 /* transport frame is not legal for caller to use */
877 } else if (_roll_delay > 0) {
879 nframes -= _roll_delay;
880 silence_unlocked (_roll_delay);
881 transport_frame += _roll_delay;
883 /* shuffle all the port buffers for things that lead "out" of this Route
884 to reflect that we just wrote _roll_delay frames of silence.
887 Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
888 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
889 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
891 iop->increment_port_buffer_offset (_roll_delay);
894 _output->increment_port_buffer_offset (_roll_delay);
904 Track::set_monitoring (MonitorChoice mc)
906 if (mc != _monitoring) {
909 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
910 (*i)->monitoring_changed ();
913 MonitoringChanged (); /* EMIT SIGNAL */
918 Track::metering_state () const
920 return _diskstream->record_enabled() ? MeteringInput : MeteringRoute;