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;
55 DEBUG_TRACE (DEBUG::Destruction, string_compose ("track %1 destructor\n", _name));
75 Track::state (bool full)
77 XMLNode& root (Route::state (full));
78 root.add_property (X_("monitoring"), enum_2_string (_monitoring));
83 Track::set_state (const XMLNode& node, int version)
85 return _set_state (node, version);
89 Track::_set_state (const XMLNode& node, int version)
91 if (Route::_set_state (node, version)) {
95 const XMLProperty* prop;
97 if ((prop = node.property (X_("monitoring"))) != 0) {
98 _monitoring = MonitorChoice (string_2_enum (prop->value(), _monitoring));
100 _monitoring = MonitorAuto;
107 Track::get_template ()
109 return state (false);
113 Track::toggle_monitor_input ()
115 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
116 i->ensure_monitor_input(!i->monitoring_input());
120 Track::FreezeRecord::~FreezeRecord ()
122 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
128 Track::freeze_state() const
130 return _freeze_record.state;
133 Track::RecEnableControllable::RecEnableControllable (Track& s)
134 : Controllable (X_("recenable")), track (s)
139 Track::RecEnableControllable::set_value (double val)
141 bool bval = ((val >= 0.5) ? true: false);
142 track.set_record_enabled (bval, this);
146 Track::RecEnableControllable::get_value (void) const
148 if (track.record_enabled()) { return 1.0; }
153 Track::record_enabled () const
155 return _diskstream && _diskstream->record_enabled ();
161 bool will_record = true;
162 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
171 Track::set_record_enabled (bool yn, void *src)
173 if (!_session.writable()) {
177 if (_freeze_record.state == Frozen) {
181 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_recenable()) {
182 _route_group->apply (&Track::set_record_enabled, yn, _route_group);
186 /* keep track of the meter point as it was before we rec-enabled */
187 if (!_diskstream->record_enabled()) {
188 _saved_meter_point = _meter_point;
191 _diskstream->set_record_enabled (yn);
193 if (_diskstream->record_enabled()) {
194 if (_meter_point != MeterCustom) {
195 set_meter_point (MeterInput);
198 set_meter_point (_saved_meter_point);
201 _rec_enable_control->Changed ();
206 Track::set_name (const string& str)
210 if (record_enabled() && _session.actively_recording()) {
211 /* this messes things up if done while recording */
215 _diskstream->set_name (str);
217 /* save state so that the statefile fully reflects any filename changes */
219 if ((ret = Route::set_name (str)) == 0) {
220 _session.save_state ("");
227 Track::set_latency_compensation (framecnt_t longest_session_latency)
229 Route::set_latency_compensation (longest_session_latency);
230 _diskstream->set_roll_delay (_roll_delay);
234 Track::zero_diskstream_id_in_xml (XMLNode& node)
236 if (node.property ("diskstream-id")) {
237 node.add_property ("diskstream-id", "0");
242 Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
244 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
249 bool can_record = _session.actively_recording ();
251 if (n_outputs().n_total() == 0) {
260 if (session_state_changing) {
261 if (_session.transport_speed() != 0.0f) {
262 /* we're rolling but some state is changing (e.g. our diskstream contents)
263 so we cannot use them. Be silent till this is over. Don't declick.
265 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
267 passthru_silence (start_frame, end_frame, nframes, 0);
270 /* we're really not rolling, so we're either delivery silence or actually
271 monitoring, both of which are safe to do while session_state_changing is true.
275 _diskstream->check_record_status (start_frame, can_record);
279 if (_have_internal_generator) {
280 /* since the instrument has no input streams,
281 there is no reason to send any signal
286 be_silent = send_silence ();
289 _amp->apply_gain_automation(false);
293 /* if we're sending silence, but we want the meters to show levels for the signal,
297 if (_have_internal_generator) {
298 passthru_silence (start_frame, end_frame, nframes, 0);
300 if (_meter_point == MeterInput) {
301 _input->process_input (_meter, start_frame, end_frame, nframes);
303 passthru_silence (start_frame, end_frame, nframes, 0);
308 /* we're sending signal, but we may still want to meter the input.
311 passthru (start_frame, end_frame, nframes, false);
314 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
315 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
317 d->flush_buffers (nframes, end_frame - start_frame - 1);
325 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler)
327 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
332 if (n_outputs().n_total() == 0 && _processors.empty()) {
342 _amp->apply_gain_automation(false);
346 return _diskstream->process (_session.transport_frame(), nframes, need_butler);
350 Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
354 ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
355 diskstream_playlist_changed ();
356 ds->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_enable_changed, this));
357 ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
358 ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
362 Track::diskstream_playlist_changed ()
364 PlaylistChanged (); /* EMIT SIGNAL */
368 Track::diskstream_record_enable_changed ()
370 RecordEnableChanged (); /* EMIT SIGNAL */
374 Track::diskstream_speed_changed ()
376 SpeedChanged (); /* EMIT SIGNAL */
380 Track::diskstream_alignment_style_changed ()
382 AlignmentStyleChanged (); /* EMIT SIGNAL */
385 boost::shared_ptr<Playlist>
388 return _diskstream->playlist ();
392 Track::monitor_input (bool m)
394 _diskstream->monitor_input (m);
398 Track::destructive () const
400 return _diskstream->destructive ();
403 list<boost::shared_ptr<Source> > &
404 Track::last_capture_sources ()
406 return _diskstream->last_capture_sources ();
410 Track::set_capture_offset ()
412 _diskstream->set_capture_offset ();
415 list<boost::shared_ptr<Source> >
416 Track::steal_write_sources()
418 return _diskstream->steal_write_sources ();
422 Track::reset_write_sources (bool r, bool force)
424 _diskstream->reset_write_sources (r, force);
428 Track::playback_buffer_load () const
430 return _diskstream->playback_buffer_load ();
434 Track::capture_buffer_load () const
436 return _diskstream->capture_buffer_load ();
442 return _diskstream->do_refill ();
446 Track::do_flush (RunContext c, bool force)
448 return _diskstream->do_flush (c, force);
452 Track::set_pending_overwrite (bool o)
454 _diskstream->set_pending_overwrite (o);
458 Track::seek (framepos_t p, bool complete_refill)
460 return _diskstream->seek (p, complete_refill);
464 Track::hidden () const
466 return _diskstream->hidden ();
470 Track::can_internal_playback_seek (framepos_t p)
472 return _diskstream->can_internal_playback_seek (p);
476 Track::internal_playback_seek (framepos_t p)
478 return _diskstream->internal_playback_seek (p);
482 Track::non_realtime_input_change ()
484 _diskstream->non_realtime_input_change ();
488 Track::non_realtime_locate (framepos_t p)
490 _diskstream->non_realtime_locate (p);
494 Track::non_realtime_set_speed ()
496 _diskstream->non_realtime_set_speed ();
500 Track::overwrite_existing_buffers ()
502 return _diskstream->overwrite_existing_buffers ();
506 Track::get_captured_frames (uint32_t n) const
508 return _diskstream->get_captured_frames (n);
512 Track::set_loop (Location* l)
514 return _diskstream->set_loop (l);
518 Track::transport_looped (framepos_t p)
520 _diskstream->transport_looped (p);
524 Track::realtime_set_speed (double s, bool g)
526 return _diskstream->realtime_set_speed (s, g);
530 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
532 _diskstream->transport_stopped_wallclock (n, t, g);
536 Track::pending_overwrite () const
538 return _diskstream->pending_overwrite ();
542 Track::speed () const
544 return _diskstream->speed ();
548 Track::prepare_to_stop (framepos_t p)
550 _diskstream->prepare_to_stop (p);
554 Track::set_slaved (bool s)
556 _diskstream->set_slaved (s);
562 return _diskstream->n_channels ();
566 Track::get_capture_start_frame (uint32_t n) const
568 return _diskstream->get_capture_start_frame (n);
572 Track::alignment_style () const
574 return _diskstream->alignment_style ();
578 Track::alignment_choice () const
580 return _diskstream->alignment_choice ();
584 Track::current_capture_start () const
586 return _diskstream->current_capture_start ();
590 Track::current_capture_end () const
592 return _diskstream->current_capture_end ();
596 Track::playlist_modified ()
598 _diskstream->playlist_modified ();
602 Track::use_playlist (boost::shared_ptr<Playlist> p)
604 return _diskstream->use_playlist (p);
608 Track::use_copy_playlist ()
610 return _diskstream->use_copy_playlist ();
614 Track::use_new_playlist ()
616 return _diskstream->use_new_playlist ();
620 Track::set_align_style (AlignStyle s, bool force)
622 _diskstream->set_align_style (s, force);
626 Track::set_align_choice (AlignChoice s, bool force)
628 _diskstream->set_align_choice (s, force);
632 Track::diskstream_id () const
634 return _diskstream->id ();
638 Track::set_block_size (pframes_t n)
640 Route::set_block_size (n);
641 _diskstream->set_block_size (n);
645 Track::adjust_playback_buffering ()
648 _diskstream->adjust_playback_buffering ();
653 Track::adjust_capture_buffering ()
656 _diskstream->adjust_capture_buffering ();
661 Track::send_silence () const
665 if (Config->get_tape_machine_mode()) {
667 /* ADATs work in a strange way..
668 they monitor input always when stopped.and auto-input is engaged.
671 if ((Config->get_monitoring_model() == SoftwareMonitoring)
672 && ((_monitoring & MonitorInput) || (_diskstream->record_enabled()))) {
673 send_silence = false;
681 /* Other machines switch to input on stop if the track is record enabled,
682 regardless of the auto input setting (auto input only changes the
683 monitoring state when the transport is rolling)
686 if ((Config->get_monitoring_model() == SoftwareMonitoring)
687 && ((_monitoring & MonitorInput) ||
688 (!(_monitoring & MonitorDisk) && (_session.config.get_auto_input () || _diskstream->record_enabled())))){
690 DEBUG_TRACE (DEBUG::Monitor,
691 string_compose ("%1: no roll, use silence = FALSE, monitoring choice %2 recenable %3 sRA %4 autoinput %5\n",
692 name(), enum_2_string (_monitoring),
693 _diskstream->record_enabled(), _session.actively_recording(),
694 _session.config.get_auto_input()));
696 send_silence = false;
698 DEBUG_TRACE (DEBUG::Monitor,
699 string_compose ("%1: no roll, use silence = TRUE, monitoring choice %2 recenable %3 sRA %4 autoinput %5\n",
700 name(), enum_2_string (_monitoring),
701 _diskstream->record_enabled(), _session.actively_recording(),
702 _session.config.get_auto_input()));
711 Track::monitoring_state ()
713 MonitorState ms = MonitoringSilence;
715 if (_session.transport_rolling()) {
719 if (_monitoring & MonitorInput) { // explicitly requested input monitoring
721 ms = MonitoringInput;
723 } else if (_monitoring & MonitorDisk) { // explicitly requested disk monitoring
727 } else if (_diskstream->record_enabled() && _session.actively_recording()) { // Track actually recording
729 ms = MonitoringInput;
731 } else if (_diskstream->record_enabled() && !_session.actively_recording() && _session.config.get_auto_input()) { // Track armed but not recording, with auto input enabled
733 ms = MonitoringInput;
735 } else { // Every other state
745 if (send_silence()) {
747 ms = MonitoringSilence;
750 ms = MonitoringInput;
758 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
760 /* never declick if there is an internal generator - we just want it to
761 keep generating sound without interruption.
763 ditto if we are monitoring inputs.
766 if (_have_internal_generator || monitoring_choice() == MonitorInput) {
771 declick = _pending_declick;
775 Amp::declick (bufs, nframes, declick);
780 Track::check_initial_delay (framecnt_t nframes, framecnt_t& transport_frame)
782 if (_roll_delay > nframes) {
784 _roll_delay -= nframes;
785 silence_unlocked (nframes);
786 /* transport frame is not legal for caller to use */
789 } else if (_roll_delay > 0) {
791 nframes -= _roll_delay;
792 silence_unlocked (_roll_delay);
793 transport_frame += _roll_delay;
795 /* shuffle all the port buffers for things that lead "out" of this Route
796 to reflect that we just wrote _roll_delay frames of silence.
799 Glib::RWLock::ReaderLock lm (_processor_lock);
800 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
801 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
803 iop->increment_port_buffer_offset (_roll_delay);
806 _output->increment_port_buffer_offset (_roll_delay);
816 Track::set_monitoring (MonitorChoice mc)
818 if (mc != _monitoring) {
820 MonitoringChanged (); /* EMIT SIGNAL */