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, true);
89 Track::_set_state (const XMLNode& node, int version, bool call_base)
92 if (Route::_set_state (node, version, call_base)) {
97 const XMLProperty* prop;
99 if ((prop = node.property (X_("monitoring"))) != 0) {
100 _monitoring = MonitorChoice (string_2_enum (prop->value(), _monitoring));
102 _monitoring = MonitorAuto;
109 Track::get_template ()
111 return state (false);
115 Track::toggle_monitor_input ()
117 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
118 i->ensure_monitor_input(!i->monitoring_input());
122 Track::FreezeRecord::~FreezeRecord ()
124 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
130 Track::freeze_state() const
132 return _freeze_record.state;
135 Track::RecEnableControllable::RecEnableControllable (Track& s)
136 : Controllable (X_("recenable")), track (s)
141 Track::RecEnableControllable::set_value (double val)
143 bool bval = ((val >= 0.5) ? true: false);
144 track.set_record_enabled (bval, this);
148 Track::RecEnableControllable::get_value (void) const
150 if (track.record_enabled()) { return 1.0; }
155 Track::record_enabled () const
157 return _diskstream && _diskstream->record_enabled ();
163 bool will_record = true;
164 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
173 Track::set_record_enabled (bool yn, void *src)
175 if (!_session.writable()) {
179 if (_freeze_record.state == Frozen) {
183 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_recenable()) {
184 _route_group->apply (&Track::set_record_enabled, yn, _route_group);
188 /* keep track of the meter point as it was before we rec-enabled */
189 if (!_diskstream->record_enabled()) {
190 _saved_meter_point = _meter_point;
193 _diskstream->set_record_enabled (yn);
195 if (_diskstream->record_enabled()) {
196 if (_meter_point != MeterCustom) {
197 set_meter_point (MeterInput);
200 set_meter_point (_saved_meter_point);
203 _rec_enable_control->Changed ();
208 Track::set_name (const string& str)
212 if (record_enabled() && _session.actively_recording()) {
213 /* this messes things up if done while recording */
217 _diskstream->set_name (str);
219 /* save state so that the statefile fully reflects any filename changes */
221 if ((ret = Route::set_name (str)) == 0) {
222 _session.save_state ("");
229 Track::set_latency_compensation (framecnt_t longest_session_latency)
231 Route::set_latency_compensation (longest_session_latency);
232 _diskstream->set_roll_delay (_roll_delay);
236 Track::zero_diskstream_id_in_xml (XMLNode& node)
238 if (node.property ("diskstream-id")) {
239 node.add_property ("diskstream-id", "0");
244 Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
246 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
251 bool can_record = _session.actively_recording ();
253 if (n_outputs().n_total() == 0) {
262 if (session_state_changing) {
263 if (_session.transport_speed() != 0.0f) {
264 /* we're rolling but some state is changing (e.g. our diskstream contents)
265 so we cannot use them. Be silent till this is over. Don't declick.
267 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
269 passthru_silence (start_frame, end_frame, nframes, 0);
272 /* we're really not rolling, so we're either delivery silence or actually
273 monitoring, both of which are safe to do while session_state_changing is true.
277 _diskstream->check_record_status (start_frame, can_record);
281 if (_have_internal_generator) {
282 /* since the instrument has no input streams,
283 there is no reason to send any signal
288 be_silent = send_silence ();
291 _amp->apply_gain_automation(false);
295 /* if we're sending silence, but we want the meters to show levels for the signal,
299 if (_have_internal_generator) {
300 passthru_silence (start_frame, end_frame, nframes, 0);
302 if (_meter_point == MeterInput) {
303 _input->process_input (_meter, start_frame, end_frame, nframes);
305 passthru_silence (start_frame, end_frame, nframes, 0);
310 /* we're sending signal, but we may still want to meter the input.
313 passthru (start_frame, end_frame, nframes, false);
316 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
317 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
319 d->flush_buffers (nframes, end_frame - start_frame - 1);
327 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler)
329 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
334 if (n_outputs().n_total() == 0 && _processors.empty()) {
344 _amp->apply_gain_automation(false);
348 return _diskstream->process (_session.transport_frame(), nframes, need_butler);
352 Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
356 ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
357 diskstream_playlist_changed ();
358 ds->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_enable_changed, this));
359 ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
360 ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
364 Track::diskstream_playlist_changed ()
366 PlaylistChanged (); /* EMIT SIGNAL */
370 Track::diskstream_record_enable_changed ()
372 RecordEnableChanged (); /* EMIT SIGNAL */
376 Track::diskstream_speed_changed ()
378 SpeedChanged (); /* EMIT SIGNAL */
382 Track::diskstream_alignment_style_changed ()
384 AlignmentStyleChanged (); /* EMIT SIGNAL */
387 boost::shared_ptr<Playlist>
390 return _diskstream->playlist ();
394 Track::monitor_input (bool m)
396 _diskstream->monitor_input (m);
400 Track::destructive () const
402 return _diskstream->destructive ();
405 list<boost::shared_ptr<Source> > &
406 Track::last_capture_sources ()
408 return _diskstream->last_capture_sources ();
412 Track::set_capture_offset ()
414 _diskstream->set_capture_offset ();
417 list<boost::shared_ptr<Source> >
418 Track::steal_write_sources()
420 return _diskstream->steal_write_sources ();
424 Track::reset_write_sources (bool r, bool force)
426 _diskstream->reset_write_sources (r, force);
430 Track::playback_buffer_load () const
432 return _diskstream->playback_buffer_load ();
436 Track::capture_buffer_load () const
438 return _diskstream->capture_buffer_load ();
444 return _diskstream->do_refill ();
448 Track::do_flush (RunContext c, bool force)
450 return _diskstream->do_flush (c, force);
454 Track::set_pending_overwrite (bool o)
456 _diskstream->set_pending_overwrite (o);
460 Track::seek (framepos_t p, bool complete_refill)
462 return _diskstream->seek (p, complete_refill);
466 Track::hidden () const
468 return _diskstream->hidden ();
472 Track::can_internal_playback_seek (framepos_t p)
474 return _diskstream->can_internal_playback_seek (p);
478 Track::internal_playback_seek (framepos_t p)
480 return _diskstream->internal_playback_seek (p);
484 Track::non_realtime_input_change ()
486 _diskstream->non_realtime_input_change ();
490 Track::non_realtime_locate (framepos_t p)
492 _diskstream->non_realtime_locate (p);
496 Track::non_realtime_set_speed ()
498 _diskstream->non_realtime_set_speed ();
502 Track::overwrite_existing_buffers ()
504 return _diskstream->overwrite_existing_buffers ();
508 Track::get_captured_frames (uint32_t n) const
510 return _diskstream->get_captured_frames (n);
514 Track::set_loop (Location* l)
516 return _diskstream->set_loop (l);
520 Track::transport_looped (framepos_t p)
522 _diskstream->transport_looped (p);
526 Track::realtime_set_speed (double s, bool g)
528 return _diskstream->realtime_set_speed (s, g);
532 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
534 _diskstream->transport_stopped_wallclock (n, t, g);
538 Track::pending_overwrite () const
540 return _diskstream->pending_overwrite ();
544 Track::speed () const
546 return _diskstream->speed ();
550 Track::prepare_to_stop (framepos_t p)
552 _diskstream->prepare_to_stop (p);
556 Track::set_slaved (bool s)
558 _diskstream->set_slaved (s);
564 return _diskstream->n_channels ();
568 Track::get_capture_start_frame (uint32_t n) const
570 return _diskstream->get_capture_start_frame (n);
574 Track::alignment_style () const
576 return _diskstream->alignment_style ();
580 Track::alignment_choice () const
582 return _diskstream->alignment_choice ();
586 Track::current_capture_start () const
588 return _diskstream->current_capture_start ();
592 Track::current_capture_end () const
594 return _diskstream->current_capture_end ();
598 Track::playlist_modified ()
600 _diskstream->playlist_modified ();
604 Track::use_playlist (boost::shared_ptr<Playlist> p)
606 return _diskstream->use_playlist (p);
610 Track::use_copy_playlist ()
612 return _diskstream->use_copy_playlist ();
616 Track::use_new_playlist ()
618 return _diskstream->use_new_playlist ();
622 Track::set_align_style (AlignStyle s, bool force)
624 _diskstream->set_align_style (s, force);
628 Track::set_align_choice (AlignChoice s, bool force)
630 _diskstream->set_align_choice (s, force);
634 Track::diskstream_id () const
636 return _diskstream->id ();
640 Track::set_block_size (pframes_t n)
642 Route::set_block_size (n);
643 _diskstream->set_block_size (n);
647 Track::adjust_playback_buffering ()
650 _diskstream->adjust_playback_buffering ();
655 Track::adjust_capture_buffering ()
658 _diskstream->adjust_capture_buffering ();
663 Track::send_silence () const
667 if (Config->get_tape_machine_mode()) {
669 /* ADATs work in a strange way..
670 they monitor input always when stopped.and auto-input is engaged.
673 if ((Config->get_monitoring_model() == SoftwareMonitoring)
674 && ((_monitoring & MonitorInput) || (_diskstream->record_enabled()))) {
675 send_silence = false;
683 /* Other machines switch to input on stop if the track is record enabled,
684 regardless of the auto input setting (auto input only changes the
685 monitoring state when the transport is rolling)
688 if ((Config->get_monitoring_model() == SoftwareMonitoring)
689 && ((_monitoring & MonitorInput) ||
690 (!(_monitoring & MonitorDisk) && (_session.config.get_auto_input () || _diskstream->record_enabled())))){
692 DEBUG_TRACE (DEBUG::Monitor,
693 string_compose ("%1: no roll, use silence = FALSE, monitoring choice %2 recenable %3 sRA %4 autoinput %5\n",
694 name(), enum_2_string (_monitoring),
695 _diskstream->record_enabled(), _session.actively_recording(),
696 _session.config.get_auto_input()));
698 send_silence = false;
700 DEBUG_TRACE (DEBUG::Monitor,
701 string_compose ("%1: no roll, use silence = TRUE, monitoring choice %2 recenable %3 sRA %4 autoinput %5\n",
702 name(), enum_2_string (_monitoring),
703 _diskstream->record_enabled(), _session.actively_recording(),
704 _session.config.get_auto_input()));
713 Track::monitoring_state ()
715 MonitorState ms = MonitoringSilence;
717 if (_session.transport_rolling()) {
721 if (_monitoring & MonitorInput) { // explicitly requested input monitoring
723 ms = MonitoringInput;
725 } else if (_monitoring & MonitorDisk) { // explicitly requested disk monitoring
729 } else if (_diskstream->record_enabled() && _session.actively_recording()) { // Track actually recording
731 ms = MonitoringInput;
733 } else if (_diskstream->record_enabled() && !_session.actively_recording() && _session.config.get_auto_input()) { // Track armed but not recording, with auto input enabled
735 ms = MonitoringInput;
737 } else { // Every other state
747 if (send_silence()) {
749 ms = MonitoringSilence;
752 ms = MonitoringInput;
760 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
762 /* never declick if there is an internal generator - we just want it to
763 keep generating sound without interruption.
765 ditto if we are monitoring inputs.
768 if (_have_internal_generator || monitoring_choice() == MonitorInput) {
773 declick = _pending_declick;
777 Amp::declick (bufs, nframes, declick);
782 Track::check_initial_delay (framecnt_t nframes, framecnt_t& transport_frame)
784 if (_roll_delay > nframes) {
786 _roll_delay -= nframes;
787 silence_unlocked (nframes);
788 /* transport frame is not legal for caller to use */
791 } else if (_roll_delay > 0) {
793 nframes -= _roll_delay;
794 silence_unlocked (_roll_delay);
795 transport_frame += _roll_delay;
797 /* shuffle all the port buffers for things that lead "out" of this Route
798 to reflect that we just wrote _roll_delay frames of silence.
801 Glib::RWLock::ReaderLock lm (_processor_lock);
802 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
803 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
805 iop->increment_port_buffer_offset (_roll_delay);
808 _output->increment_port_buffer_offset (_roll_delay);
818 Track::set_monitoring (MonitorChoice mc)
820 if (mc != _monitoring) {
822 MonitoringChanged (); /* EMIT SIGNAL */