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/audioplaylist.h"
22 #include "ardour/audioregion.h"
23 #include "ardour/audiosource.h"
24 #include "ardour/debug.h"
25 #include "ardour/delivery.h"
26 #include "ardour/diskstream.h"
27 #include "ardour/io_processor.h"
28 #include "ardour/meter.h"
29 #include "ardour/port.h"
30 #include "ardour/processor.h"
31 #include "ardour/route_group_specialized.h"
32 #include "ardour/session.h"
33 #include "ardour/track.h"
34 #include "ardour/utils.h"
39 using namespace ARDOUR;
42 Track::Track (Session& sess, string name, Route::Flag flag, TrackMode mode, DataType default_type)
43 : Route (sess, name, flag, default_type)
44 , _saved_meter_point (_meter_point)
46 , _monitoring (MonitorAuto)
47 , _rec_enable_control (new RecEnableControllable(*this))
49 _freeze_record.state = NoFreeze;
52 Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Track::parameter_changed, this, _1));
57 DEBUG_TRACE (DEBUG::Destruction, string_compose ("track %1 destructor\n", _name));
71 Track::use_new_diskstream ()
73 boost::shared_ptr<Diskstream> ds = create_diskstream ();
75 ds->do_refill_with_alloc ();
76 ds->set_block_size (_session.get_block_size ());
77 ds->playlist()->set_orig_track_id (id());
89 Track::state (bool full)
91 XMLNode& root (Route::state (full));
92 root.add_property (X_("monitoring"), enum_2_string (_monitoring));
93 root.add_property (X_("saved-meter-point"), enum_2_string (_saved_meter_point));
94 root.add_child_nocopy (_rec_enable_control->get_state());
95 root.add_child_nocopy (_diskstream->get_state ());
97 if (!_deactivated_processors.empty ()) {
98 XMLNode* node = new XMLNode (X_("DeactivatedProcessors"));
99 for (list<boost::weak_ptr<Processor> >::iterator i = _deactivated_processors.begin(); i != _deactivated_processors.end(); ++i) {
100 boost::shared_ptr<Processor> p = i->lock ();
102 XMLNode* c = new XMLNode (X_("Processor"));
103 c->add_property (X_("id"), p->id().to_s());
104 node->add_child_nocopy (*c);
107 root.add_child_nocopy (*node);
114 Track::set_state (const XMLNode& node, int version)
116 if (Route::set_state (node, version)) {
122 if (version >= 3000) {
123 if ((child = find_named_node (node, X_("Diskstream"))) != 0) {
124 boost::shared_ptr<Diskstream> ds = diskstream_factory (*child);
125 ds->do_refill_with_alloc ();
131 _diskstream->playlist()->set_orig_track_id (id());
134 /* set rec-enable control *AFTER* setting up diskstream, because it may
135 want to operate on the diskstream as it sets its own state
138 XMLNodeList nlist = node.children();
139 for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
143 if (child->name() == Controllable::xml_node_name && (prop = child->property ("name")) != 0) {
144 if (prop->value() == X_("recenable")) {
145 _rec_enable_control->set_state (*child, version);
149 if (child->name() == X_("DeactivatedProcessors")) {
150 XMLNodeList dp = child->children ();
151 for (XMLNodeConstIterator i = dp.begin(); i != dp.end(); ++i) {
152 assert ((*i)->name() == X_("Processor"));
153 XMLProperty* prop = (*i)->property (X_("id"));
154 boost::shared_ptr<Processor> p = processor_by_id (PBD::ID (prop->value ()));
156 _deactivated_processors.push_back (p);
162 const XMLProperty* prop;
164 if ((prop = node.property (X_("monitoring"))) != 0) {
165 _monitoring = MonitorChoice (string_2_enum (prop->value(), _monitoring));
167 _monitoring = MonitorAuto;
170 if ((prop = node.property (X_("saved-meter-point"))) != 0) {
171 _saved_meter_point = MeterPoint (string_2_enum (prop->value(), _saved_meter_point));
173 _saved_meter_point = _meter_point;
180 Track::get_template ()
182 return state (false);
186 Track::toggle_monitor_input ()
188 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
189 i->ensure_monitor_input(!i->monitoring_input());
193 Track::FreezeRecord::~FreezeRecord ()
195 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
201 Track::freeze_state() const
203 return _freeze_record.state;
206 Track::RecEnableControllable::RecEnableControllable (Track& s)
207 : Controllable (X_("recenable")), track (s)
212 Track::RecEnableControllable::set_value (double val)
214 bool bval = ((val >= 0.5) ? true: false);
215 track.set_record_enabled (bval, this);
219 Track::RecEnableControllable::get_value (void) const
221 if (track.record_enabled()) { return 1.0; }
226 Track::record_enabled () const
228 return _diskstream && _diskstream->record_enabled ();
234 bool will_record = true;
235 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
243 /* Turn off visible processors (except Fader), keeping track of the old states */
245 Track::deactivate_visible_processors ()
247 _deactivated_processors.clear ();
248 Glib::RWLock::ReaderLock lm (_processor_lock);
250 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
251 if ((*i)->active() && (*i)->display_to_user() && boost::dynamic_pointer_cast<Amp> (*i) == 0) {
253 _deactivated_processors.push_back (*i);
258 /* Turn deactivated processors back on again */
260 Track::activate_deactivated_processors ()
262 for (list<boost::weak_ptr<Processor> >::iterator i = _deactivated_processors.begin(); i != _deactivated_processors.end(); ++i) {
263 boost::shared_ptr<Processor> p = i->lock ();
271 Track::set_record_enabled (bool yn, void *src)
273 if (!_session.writable()) {
277 if (_freeze_record.state == Frozen) {
281 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_recenable()) {
282 _route_group->apply (&Track::set_record_enabled, yn, _route_group);
286 /* keep track of the meter point as it was before we rec-enabled */
287 if (!_diskstream->record_enabled()) {
288 _saved_meter_point = _meter_point;
291 if (Config->get_do_not_record_plugins ()) {
293 deactivate_visible_processors ();
295 activate_deactivated_processors ();
299 _diskstream->set_record_enabled (yn);
301 if (_diskstream->record_enabled()) {
302 if (_meter_point != MeterCustom) {
303 set_meter_point (MeterInput);
306 set_meter_point (_saved_meter_point);
309 _rec_enable_control->Changed ();
314 Track::set_name (const string& str)
318 if (record_enabled() && _session.actively_recording()) {
319 /* this messes things up if done while recording */
323 _diskstream->set_name (str);
325 /* save state so that the statefile fully reflects any filename changes */
327 if ((ret = Route::set_name (str)) == 0) {
328 _session.save_state ("");
335 Track::set_latency_compensation (framecnt_t longest_session_latency)
337 Route::set_latency_compensation (longest_session_latency);
338 _diskstream->set_roll_delay (_roll_delay);
342 Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
344 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
349 bool can_record = _session.actively_recording ();
351 if (n_outputs().n_total() == 0) {
360 if (session_state_changing) {
361 if (_session.transport_speed() != 0.0f) {
362 /* we're rolling but some state is changing (e.g. our diskstream contents)
363 so we cannot use them. Be silent till this is over. Don't declick.
365 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
367 passthru_silence (start_frame, end_frame, nframes, 0);
370 /* we're really not rolling, so we're either delivery silence or actually
371 monitoring, both of which are safe to do while session_state_changing is true.
375 _diskstream->check_record_status (start_frame, can_record);
379 if (_have_internal_generator) {
380 /* since the instrument has no input streams,
381 there is no reason to send any signal
386 be_silent = send_silence ();
389 _amp->apply_gain_automation(false);
393 /* if we're sending silence, but we want the meters to show levels for the signal,
397 if (_have_internal_generator) {
398 passthru_silence (start_frame, end_frame, nframes, 0);
400 if (_meter_point == MeterInput) {
401 _input->process_input (_meter, start_frame, end_frame, nframes);
403 passthru_silence (start_frame, end_frame, nframes, 0);
408 /* we're sending signal, but we may still want to meter the input.
411 passthru (start_frame, end_frame, nframes, false);
414 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
415 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
417 d->flush_buffers (nframes, end_frame - start_frame - 1);
425 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler)
427 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
432 if (n_outputs().n_total() == 0 && _processors.empty()) {
442 _amp->apply_gain_automation(false);
446 framecnt_t playback_distance;
447 int const dret = _diskstream->process (_session.transport_frame(), nframes, playback_distance);
448 need_butler = _diskstream->commit (playback_distance);
453 Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
457 ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
458 diskstream_playlist_changed ();
459 ds->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_enable_changed, this));
460 ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
461 ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
465 Track::diskstream_playlist_changed ()
467 PlaylistChanged (); /* EMIT SIGNAL */
471 Track::diskstream_record_enable_changed ()
473 RecordEnableChanged (); /* EMIT SIGNAL */
477 Track::diskstream_speed_changed ()
479 SpeedChanged (); /* EMIT SIGNAL */
483 Track::diskstream_alignment_style_changed ()
485 AlignmentStyleChanged (); /* EMIT SIGNAL */
488 boost::shared_ptr<Playlist>
491 return _diskstream->playlist ();
495 Track::monitor_input (bool m)
497 _diskstream->monitor_input (m);
501 Track::destructive () const
503 return _diskstream->destructive ();
506 list<boost::shared_ptr<Source> > &
507 Track::last_capture_sources ()
509 return _diskstream->last_capture_sources ();
513 Track::set_capture_offset ()
515 _diskstream->set_capture_offset ();
518 list<boost::shared_ptr<Source> >
519 Track::steal_write_sources()
521 return _diskstream->steal_write_sources ();
525 Track::reset_write_sources (bool r, bool force)
527 _diskstream->reset_write_sources (r, force);
531 Track::playback_buffer_load () const
533 return _diskstream->playback_buffer_load ();
537 Track::capture_buffer_load () const
539 return _diskstream->capture_buffer_load ();
545 return _diskstream->do_refill ();
549 Track::do_flush (RunContext c, bool force)
551 return _diskstream->do_flush (c, force);
555 Track::set_pending_overwrite (bool o)
557 _diskstream->set_pending_overwrite (o);
561 Track::seek (framepos_t p, bool complete_refill)
563 return _diskstream->seek (p, complete_refill);
567 Track::hidden () const
569 return _diskstream->hidden ();
573 Track::can_internal_playback_seek (framepos_t p)
575 return _diskstream->can_internal_playback_seek (p);
579 Track::internal_playback_seek (framepos_t p)
581 return _diskstream->internal_playback_seek (p);
585 Track::non_realtime_input_change ()
587 _diskstream->non_realtime_input_change ();
591 Track::non_realtime_locate (framepos_t p)
593 _diskstream->non_realtime_locate (p);
597 Track::non_realtime_set_speed ()
599 _diskstream->non_realtime_set_speed ();
603 Track::overwrite_existing_buffers ()
605 return _diskstream->overwrite_existing_buffers ();
609 Track::get_captured_frames (uint32_t n) const
611 return _diskstream->get_captured_frames (n);
615 Track::set_loop (Location* l)
617 return _diskstream->set_loop (l);
621 Track::transport_looped (framepos_t p)
623 _diskstream->transport_looped (p);
627 Track::realtime_set_speed (double s, bool g)
629 return _diskstream->realtime_set_speed (s, g);
633 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
635 _diskstream->transport_stopped_wallclock (n, t, g);
639 Track::pending_overwrite () const
641 return _diskstream->pending_overwrite ();
645 Track::speed () const
647 return _diskstream->speed ();
651 Track::prepare_to_stop (framepos_t p)
653 _diskstream->prepare_to_stop (p);
657 Track::set_slaved (bool s)
659 _diskstream->set_slaved (s);
665 return _diskstream->n_channels ();
669 Track::get_capture_start_frame (uint32_t n) const
671 return _diskstream->get_capture_start_frame (n);
675 Track::alignment_style () const
677 return _diskstream->alignment_style ();
681 Track::alignment_choice () const
683 return _diskstream->alignment_choice ();
687 Track::current_capture_start () const
689 return _diskstream->current_capture_start ();
693 Track::current_capture_end () const
695 return _diskstream->current_capture_end ();
699 Track::playlist_modified ()
701 _diskstream->playlist_modified ();
705 Track::use_playlist (boost::shared_ptr<Playlist> p)
707 int ret = _diskstream->use_playlist (p);
709 p->set_orig_track_id (id());
715 Track::use_copy_playlist ()
717 int ret = _diskstream->use_copy_playlist ();
720 _diskstream->playlist()->set_orig_track_id (id());
727 Track::use_new_playlist ()
729 int ret = _diskstream->use_new_playlist ();
732 _diskstream->playlist()->set_orig_track_id (id());
739 Track::set_align_style (AlignStyle s, bool force)
741 _diskstream->set_align_style (s, force);
745 Track::set_align_choice (AlignChoice s, bool force)
747 _diskstream->set_align_choice (s, force);
751 Track::using_diskstream_id (PBD::ID id) const
753 return (id == _diskstream->id ());
757 Track::set_block_size (pframes_t n)
759 Route::set_block_size (n);
760 _diskstream->set_block_size (n);
764 Track::adjust_playback_buffering ()
767 _diskstream->adjust_playback_buffering ();
772 Track::adjust_capture_buffering ()
775 _diskstream->adjust_capture_buffering ();
780 Track::send_silence () const
784 if (Config->get_tape_machine_mode()) {
786 /* ADATs work in a strange way..
787 they monitor input always when stopped.and auto-input is engaged.
790 if ((Config->get_monitoring_model() == SoftwareMonitoring)
791 && ((_monitoring & MonitorInput) || (_diskstream->record_enabled()))) {
792 send_silence = false;
800 /* Other machines switch to input on stop if the track is record enabled,
801 regardless of the auto input setting (auto input only changes the
802 monitoring state when the transport is rolling)
805 if ((Config->get_monitoring_model() == SoftwareMonitoring)
806 && ((_monitoring & MonitorInput) ||
807 (!(_monitoring & MonitorDisk) && (_session.config.get_auto_input () || _diskstream->record_enabled())))){
809 DEBUG_TRACE (DEBUG::Monitor,
810 string_compose ("%1: no roll, use silence = FALSE, monitoring choice %2 recenable %3 sRA %4 autoinput %5\n",
811 name(), enum_2_string (_monitoring),
812 _diskstream->record_enabled(), _session.actively_recording(),
813 _session.config.get_auto_input()));
815 send_silence = false;
817 DEBUG_TRACE (DEBUG::Monitor,
818 string_compose ("%1: no roll, use silence = TRUE, monitoring choice %2 recenable %3 sRA %4 autoinput %5\n",
819 name(), enum_2_string (_monitoring),
820 _diskstream->record_enabled(), _session.actively_recording(),
821 _session.config.get_auto_input()));
830 Track::monitoring_state ()
832 MonitorState ms = MonitoringSilence;
834 if (_session.transport_rolling()) {
838 if (_monitoring & MonitorInput) { // explicitly requested input monitoring
840 ms = MonitoringInput;
842 } else if (_monitoring & MonitorDisk) { // explicitly requested disk monitoring
846 } else if (_diskstream->record_enabled() && _session.actively_recording()) { // Track actually recording
848 ms = MonitoringInput;
850 } else if (_diskstream->record_enabled() && !_session.actively_recording() && _session.config.get_auto_input()) { // Track armed but not recording, with auto input enabled
852 ms = MonitoringInput;
854 } else { // Every other state
864 if (send_silence()) {
866 ms = MonitoringSilence;
869 ms = MonitoringInput;
877 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
879 /* never declick if there is an internal generator - we just want it to
880 keep generating sound without interruption.
882 ditto if we are monitoring inputs.
885 if (_have_internal_generator || monitoring_choice() == MonitorInput) {
890 declick = _pending_declick;
894 Amp::declick (bufs, nframes, declick);
899 Track::check_initial_delay (framecnt_t nframes, framecnt_t& transport_frame)
901 if (_roll_delay > nframes) {
903 _roll_delay -= nframes;
904 silence_unlocked (nframes);
905 /* transport frame is not legal for caller to use */
908 } else if (_roll_delay > 0) {
910 nframes -= _roll_delay;
911 silence_unlocked (_roll_delay);
912 transport_frame += _roll_delay;
914 /* shuffle all the port buffers for things that lead "out" of this Route
915 to reflect that we just wrote _roll_delay frames of silence.
918 Glib::RWLock::ReaderLock lm (_processor_lock);
919 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
920 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
922 iop->increment_port_buffer_offset (_roll_delay);
925 _output->increment_port_buffer_offset (_roll_delay);
935 Track::set_monitoring (MonitorChoice mc)
937 if (mc != _monitoring) {
939 MonitoringChanged (); /* EMIT SIGNAL */
944 Track::parameter_changed (string p)
946 if (p != "do-not-record-plugins") {
950 if (record_enabled ()) {
951 if (Config->get_do_not_record_plugins ()) {
952 deactivate_visible_processors ();
954 activate_deactivated_processors ();