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));
77 Track::state (bool full)
79 XMLNode& root (Route::state (full));
80 root.add_property (X_("monitoring"), enum_2_string (_monitoring));
81 root.add_property (X_("saved-meter-point"), enum_2_string (_saved_meter_point));
82 root.add_child_nocopy (_rec_enable_control->get_state());
83 root.add_child_nocopy (_diskstream->get_state ());
85 if (!_deactivated_processors.empty ()) {
86 XMLNode* node = new XMLNode (X_("DeactivatedProcessors"));
87 for (list<boost::weak_ptr<Processor> >::iterator i = _deactivated_processors.begin(); i != _deactivated_processors.end(); ++i) {
88 boost::shared_ptr<Processor> p = i->lock ();
90 XMLNode* c = new XMLNode (X_("Processor"));
91 c->add_property (X_("id"), p->id().to_s());
92 node->add_child_nocopy (*c);
95 root.add_child_nocopy (*node);
102 Track::set_state (const XMLNode& node, int version)
104 if (Route::set_state (node, version)) {
110 if (version >= 3000) {
111 if ((child = find_named_node (node, X_("Diskstream"))) != 0) {
112 boost::shared_ptr<Diskstream> ds = diskstream_factory (*child);
113 ds->do_refill_with_alloc ();
118 /* set rec-enable control *AFTER* setting up diskstream, because it may
119 want to operate on the diskstream as it sets its own state
122 XMLNodeList nlist = node.children();
123 for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
127 if (child->name() == Controllable::xml_node_name && (prop = child->property ("name")) != 0) {
128 if (prop->value() == X_("recenable")) {
129 _rec_enable_control->set_state (*child, version);
133 if (child->name() == X_("DeactivatedProcessors")) {
134 XMLNodeList dp = child->children ();
135 for (XMLNodeConstIterator i = dp.begin(); i != dp.end(); ++i) {
136 assert ((*i)->name() == X_("Processor"));
137 XMLProperty* prop = (*i)->property (X_("id"));
138 boost::shared_ptr<Processor> p = processor_by_id (PBD::ID (prop->value ()));
140 _deactivated_processors.push_back (p);
146 const XMLProperty* prop;
148 if ((prop = node.property (X_("monitoring"))) != 0) {
149 _monitoring = MonitorChoice (string_2_enum (prop->value(), _monitoring));
151 _monitoring = MonitorAuto;
154 if ((prop = node.property (X_("saved-meter-point"))) != 0) {
155 _saved_meter_point = MeterPoint (string_2_enum (prop->value(), _saved_meter_point));
157 _saved_meter_point = _meter_point;
164 Track::get_template ()
166 return state (false);
170 Track::toggle_monitor_input ()
172 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
173 i->ensure_monitor_input(!i->monitoring_input());
177 Track::FreezeRecord::~FreezeRecord ()
179 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
185 Track::freeze_state() const
187 return _freeze_record.state;
190 Track::RecEnableControllable::RecEnableControllable (Track& s)
191 : Controllable (X_("recenable")), track (s)
196 Track::RecEnableControllable::set_value (double val)
198 bool bval = ((val >= 0.5) ? true: false);
199 track.set_record_enabled (bval, this);
203 Track::RecEnableControllable::get_value (void) const
205 if (track.record_enabled()) { return 1.0; }
210 Track::record_enabled () const
212 return _diskstream && _diskstream->record_enabled ();
218 bool will_record = true;
219 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
227 /* Turn off visible processors (except Fader), keeping track of the old states */
229 Track::deactivate_visible_processors ()
231 _deactivated_processors.clear ();
232 Glib::RWLock::ReaderLock lm (_processor_lock);
234 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
235 if ((*i)->active() && (*i)->display_to_user() && boost::dynamic_pointer_cast<Amp> (*i) == 0) {
237 _deactivated_processors.push_back (*i);
242 /* Turn deactivated processors back on again */
244 Track::activate_deactivated_processors ()
246 for (list<boost::weak_ptr<Processor> >::iterator i = _deactivated_processors.begin(); i != _deactivated_processors.end(); ++i) {
247 boost::shared_ptr<Processor> p = i->lock ();
255 Track::set_record_enabled (bool yn, void *src)
257 if (!_session.writable()) {
261 if (_freeze_record.state == Frozen) {
265 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_recenable()) {
266 _route_group->apply (&Track::set_record_enabled, yn, _route_group);
270 /* keep track of the meter point as it was before we rec-enabled */
271 if (!_diskstream->record_enabled()) {
272 _saved_meter_point = _meter_point;
275 if (Config->get_do_not_record_plugins ()) {
277 deactivate_visible_processors ();
279 activate_deactivated_processors ();
283 _diskstream->set_record_enabled (yn);
285 if (_diskstream->record_enabled()) {
286 if (_meter_point != MeterCustom) {
287 set_meter_point (MeterInput);
290 set_meter_point (_saved_meter_point);
293 _rec_enable_control->Changed ();
298 Track::set_name (const string& str)
302 if (record_enabled() && _session.actively_recording()) {
303 /* this messes things up if done while recording */
307 _diskstream->set_name (str);
309 /* save state so that the statefile fully reflects any filename changes */
311 if ((ret = Route::set_name (str)) == 0) {
312 _session.save_state ("");
319 Track::set_latency_compensation (framecnt_t longest_session_latency)
321 Route::set_latency_compensation (longest_session_latency);
322 _diskstream->set_roll_delay (_roll_delay);
326 Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
328 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
333 bool can_record = _session.actively_recording ();
335 if (n_outputs().n_total() == 0) {
344 if (session_state_changing) {
345 if (_session.transport_speed() != 0.0f) {
346 /* we're rolling but some state is changing (e.g. our diskstream contents)
347 so we cannot use them. Be silent till this is over. Don't declick.
349 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
351 passthru_silence (start_frame, end_frame, nframes, 0);
354 /* we're really not rolling, so we're either delivery silence or actually
355 monitoring, both of which are safe to do while session_state_changing is true.
359 _diskstream->check_record_status (start_frame, can_record);
363 if (_have_internal_generator) {
364 /* since the instrument has no input streams,
365 there is no reason to send any signal
370 be_silent = send_silence ();
373 _amp->apply_gain_automation(false);
377 /* if we're sending silence, but we want the meters to show levels for the signal,
381 if (_have_internal_generator) {
382 passthru_silence (start_frame, end_frame, nframes, 0);
384 if (_meter_point == MeterInput) {
385 _input->process_input (_meter, start_frame, end_frame, nframes);
387 passthru_silence (start_frame, end_frame, nframes, 0);
392 /* we're sending signal, but we may still want to meter the input.
395 passthru (start_frame, end_frame, nframes, false);
398 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
399 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
401 d->flush_buffers (nframes, end_frame - start_frame - 1);
409 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler)
411 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
416 if (n_outputs().n_total() == 0 && _processors.empty()) {
426 _amp->apply_gain_automation(false);
430 framecnt_t playback_distance;
431 int const dret = _diskstream->process (_session.transport_frame(), nframes, playback_distance);
432 need_butler = _diskstream->commit (playback_distance);
437 Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
441 ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
442 diskstream_playlist_changed ();
443 ds->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_enable_changed, this));
444 ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
445 ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
449 Track::diskstream_playlist_changed ()
451 PlaylistChanged (); /* EMIT SIGNAL */
455 Track::diskstream_record_enable_changed ()
457 RecordEnableChanged (); /* EMIT SIGNAL */
461 Track::diskstream_speed_changed ()
463 SpeedChanged (); /* EMIT SIGNAL */
467 Track::diskstream_alignment_style_changed ()
469 AlignmentStyleChanged (); /* EMIT SIGNAL */
472 boost::shared_ptr<Playlist>
475 return _diskstream->playlist ();
479 Track::monitor_input (bool m)
481 _diskstream->monitor_input (m);
485 Track::destructive () const
487 return _diskstream->destructive ();
490 list<boost::shared_ptr<Source> > &
491 Track::last_capture_sources ()
493 return _diskstream->last_capture_sources ();
497 Track::set_capture_offset ()
499 _diskstream->set_capture_offset ();
502 list<boost::shared_ptr<Source> >
503 Track::steal_write_sources()
505 return _diskstream->steal_write_sources ();
509 Track::reset_write_sources (bool r, bool force)
511 _diskstream->reset_write_sources (r, force);
515 Track::playback_buffer_load () const
517 return _diskstream->playback_buffer_load ();
521 Track::capture_buffer_load () const
523 return _diskstream->capture_buffer_load ();
529 return _diskstream->do_refill ();
533 Track::do_flush (RunContext c, bool force)
535 return _diskstream->do_flush (c, force);
539 Track::set_pending_overwrite (bool o)
541 _diskstream->set_pending_overwrite (o);
545 Track::seek (framepos_t p, bool complete_refill)
547 return _diskstream->seek (p, complete_refill);
551 Track::hidden () const
553 return _diskstream->hidden ();
557 Track::can_internal_playback_seek (framepos_t p)
559 return _diskstream->can_internal_playback_seek (p);
563 Track::internal_playback_seek (framepos_t p)
565 return _diskstream->internal_playback_seek (p);
569 Track::non_realtime_input_change ()
571 _diskstream->non_realtime_input_change ();
575 Track::non_realtime_locate (framepos_t p)
577 _diskstream->non_realtime_locate (p);
581 Track::non_realtime_set_speed ()
583 _diskstream->non_realtime_set_speed ();
587 Track::overwrite_existing_buffers ()
589 return _diskstream->overwrite_existing_buffers ();
593 Track::get_captured_frames (uint32_t n) const
595 return _diskstream->get_captured_frames (n);
599 Track::set_loop (Location* l)
601 return _diskstream->set_loop (l);
605 Track::transport_looped (framepos_t p)
607 _diskstream->transport_looped (p);
611 Track::realtime_set_speed (double s, bool g)
613 return _diskstream->realtime_set_speed (s, g);
617 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
619 _diskstream->transport_stopped_wallclock (n, t, g);
623 Track::pending_overwrite () const
625 return _diskstream->pending_overwrite ();
629 Track::speed () const
631 return _diskstream->speed ();
635 Track::prepare_to_stop (framepos_t p)
637 _diskstream->prepare_to_stop (p);
641 Track::set_slaved (bool s)
643 _diskstream->set_slaved (s);
649 return _diskstream->n_channels ();
653 Track::get_capture_start_frame (uint32_t n) const
655 return _diskstream->get_capture_start_frame (n);
659 Track::alignment_style () const
661 return _diskstream->alignment_style ();
665 Track::alignment_choice () const
667 return _diskstream->alignment_choice ();
671 Track::current_capture_start () const
673 return _diskstream->current_capture_start ();
677 Track::current_capture_end () const
679 return _diskstream->current_capture_end ();
683 Track::playlist_modified ()
685 _diskstream->playlist_modified ();
689 Track::use_playlist (boost::shared_ptr<Playlist> p)
691 return _diskstream->use_playlist (p);
695 Track::use_copy_playlist ()
697 return _diskstream->use_copy_playlist ();
701 Track::use_new_playlist ()
703 return _diskstream->use_new_playlist ();
707 Track::set_align_style (AlignStyle s, bool force)
709 _diskstream->set_align_style (s, force);
713 Track::set_align_choice (AlignChoice s, bool force)
715 _diskstream->set_align_choice (s, force);
719 Track::diskstream_id () const
721 return _diskstream->id ();
725 Track::set_block_size (pframes_t n)
727 Route::set_block_size (n);
728 _diskstream->set_block_size (n);
732 Track::adjust_playback_buffering ()
735 _diskstream->adjust_playback_buffering ();
740 Track::adjust_capture_buffering ()
743 _diskstream->adjust_capture_buffering ();
748 Track::send_silence () const
752 if (Config->get_tape_machine_mode()) {
754 /* ADATs work in a strange way..
755 they monitor input always when stopped.and auto-input is engaged.
758 if ((Config->get_monitoring_model() == SoftwareMonitoring)
759 && ((_monitoring & MonitorInput) || (_diskstream->record_enabled()))) {
760 send_silence = false;
768 /* Other machines switch to input on stop if the track is record enabled,
769 regardless of the auto input setting (auto input only changes the
770 monitoring state when the transport is rolling)
773 if ((Config->get_monitoring_model() == SoftwareMonitoring)
774 && ((_monitoring & MonitorInput) ||
775 (!(_monitoring & MonitorDisk) && (_session.config.get_auto_input () || _diskstream->record_enabled())))){
777 DEBUG_TRACE (DEBUG::Monitor,
778 string_compose ("%1: no roll, use silence = FALSE, monitoring choice %2 recenable %3 sRA %4 autoinput %5\n",
779 name(), enum_2_string (_monitoring),
780 _diskstream->record_enabled(), _session.actively_recording(),
781 _session.config.get_auto_input()));
783 send_silence = false;
785 DEBUG_TRACE (DEBUG::Monitor,
786 string_compose ("%1: no roll, use silence = TRUE, monitoring choice %2 recenable %3 sRA %4 autoinput %5\n",
787 name(), enum_2_string (_monitoring),
788 _diskstream->record_enabled(), _session.actively_recording(),
789 _session.config.get_auto_input()));
798 Track::monitoring_state ()
800 MonitorState ms = MonitoringSilence;
802 if (_session.transport_rolling()) {
806 if (_monitoring & MonitorInput) { // explicitly requested input monitoring
808 ms = MonitoringInput;
810 } else if (_monitoring & MonitorDisk) { // explicitly requested disk monitoring
814 } else if (_diskstream->record_enabled() && _session.actively_recording()) { // Track actually recording
816 ms = MonitoringInput;
818 } else if (_diskstream->record_enabled() && !_session.actively_recording() && _session.config.get_auto_input()) { // Track armed but not recording, with auto input enabled
820 ms = MonitoringInput;
822 } else { // Every other state
832 if (send_silence()) {
834 ms = MonitoringSilence;
837 ms = MonitoringInput;
845 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
847 /* never declick if there is an internal generator - we just want it to
848 keep generating sound without interruption.
850 ditto if we are monitoring inputs.
853 if (_have_internal_generator || monitoring_choice() == MonitorInput) {
858 declick = _pending_declick;
862 Amp::declick (bufs, nframes, declick);
867 Track::check_initial_delay (framecnt_t nframes, framecnt_t& transport_frame)
869 if (_roll_delay > nframes) {
871 _roll_delay -= nframes;
872 silence_unlocked (nframes);
873 /* transport frame is not legal for caller to use */
876 } else if (_roll_delay > 0) {
878 nframes -= _roll_delay;
879 silence_unlocked (_roll_delay);
880 transport_frame += _roll_delay;
882 /* shuffle all the port buffers for things that lead "out" of this Route
883 to reflect that we just wrote _roll_delay frames of silence.
886 Glib::RWLock::ReaderLock lm (_processor_lock);
887 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
888 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
890 iop->increment_port_buffer_offset (_roll_delay);
893 _output->increment_port_buffer_offset (_roll_delay);
903 Track::set_monitoring (MonitorChoice mc)
905 if (mc != _monitoring) {
907 MonitoringChanged (); /* EMIT SIGNAL */
912 Track::parameter_changed (string p)
914 if (p != "do-not-record-plugins") {
918 if (record_enabled ()) {
919 if (Config->get_do_not_record_plugins ()) {
920 deactivate_visible_processors ();
922 activate_deactivated_processors ();