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));
79 root.add_property (X_("saved-meter-point"), enum_2_string (_saved_meter_point));
80 root.add_child_nocopy (_rec_enable_control->get_state());
81 root.add_child_nocopy (_diskstream->get_state ());
86 Track::set_state (const XMLNode& node, int version)
88 return _set_state (node, version);
92 Track::_set_state (const XMLNode& node, int version)
94 if (Route::_set_state (node, version)) {
100 if (version >= 3000) {
101 if ((child = find_named_node (node, X_("Diskstream"))) != 0) {
102 boost::shared_ptr<Diskstream> ds = diskstream_factory (*child);
103 ds->do_refill_with_alloc ();
108 /* set rec-enable control *AFTER* setting up diskstream, because it may
109 want to operate on the diskstream as it sets its own state
112 XMLNodeList nlist = node.children();
113 for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
117 if (child->name() == Controllable::xml_node_name && (prop = child->property ("name")) != 0) {
118 if (prop->value() == X_("recenable")) {
119 _rec_enable_control->set_state (*child, version);
124 const XMLProperty* prop;
126 if ((prop = node.property (X_("monitoring"))) != 0) {
127 _monitoring = MonitorChoice (string_2_enum (prop->value(), _monitoring));
129 _monitoring = MonitorAuto;
132 if ((prop = node.property (X_("saved-meter-point"))) != 0) {
133 _saved_meter_point = MeterPoint (string_2_enum (prop->value(), _saved_meter_point));
135 _saved_meter_point = _meter_point;
142 Track::get_template ()
144 return state (false);
148 Track::toggle_monitor_input ()
150 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
151 i->ensure_monitor_input(!i->monitoring_input());
155 Track::FreezeRecord::~FreezeRecord ()
157 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
163 Track::freeze_state() const
165 return _freeze_record.state;
168 Track::RecEnableControllable::RecEnableControllable (Track& s)
169 : Controllable (X_("recenable")), track (s)
174 Track::RecEnableControllable::set_value (double val)
176 bool bval = ((val >= 0.5) ? true: false);
177 track.set_record_enabled (bval, this);
181 Track::RecEnableControllable::get_value (void) const
183 if (track.record_enabled()) { return 1.0; }
188 Track::record_enabled () const
190 return _diskstream && _diskstream->record_enabled ();
196 bool will_record = true;
197 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
206 Track::set_record_enabled (bool yn, void *src)
208 if (!_session.writable()) {
212 if (_freeze_record.state == Frozen) {
216 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_recenable()) {
217 _route_group->apply (&Track::set_record_enabled, yn, _route_group);
221 /* keep track of the meter point as it was before we rec-enabled */
222 if (!_diskstream->record_enabled()) {
223 _saved_meter_point = _meter_point;
226 _diskstream->set_record_enabled (yn);
228 if (_diskstream->record_enabled()) {
229 if (_meter_point != MeterCustom) {
230 set_meter_point (MeterInput);
233 set_meter_point (_saved_meter_point);
236 _rec_enable_control->Changed ();
241 Track::set_name (const string& str)
245 if (record_enabled() && _session.actively_recording()) {
246 /* this messes things up if done while recording */
250 _diskstream->set_name (str);
252 /* save state so that the statefile fully reflects any filename changes */
254 if ((ret = Route::set_name (str)) == 0) {
255 _session.save_state ("");
262 Track::set_latency_compensation (framecnt_t longest_session_latency)
264 Route::set_latency_compensation (longest_session_latency);
265 _diskstream->set_roll_delay (_roll_delay);
269 Track::zero_diskstream_id_in_xml (XMLNode& node)
271 if (node.property ("diskstream-id")) {
272 node.add_property ("diskstream-id", "0");
277 Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
279 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
284 bool can_record = _session.actively_recording ();
286 if (n_outputs().n_total() == 0) {
295 if (session_state_changing) {
296 if (_session.transport_speed() != 0.0f) {
297 /* we're rolling but some state is changing (e.g. our diskstream contents)
298 so we cannot use them. Be silent till this is over. Don't declick.
300 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
302 passthru_silence (start_frame, end_frame, nframes, 0);
305 /* we're really not rolling, so we're either delivery silence or actually
306 monitoring, both of which are safe to do while session_state_changing is true.
310 _diskstream->check_record_status (start_frame, can_record);
314 if (_have_internal_generator) {
315 /* since the instrument has no input streams,
316 there is no reason to send any signal
321 be_silent = send_silence ();
324 _amp->apply_gain_automation(false);
328 /* if we're sending silence, but we want the meters to show levels for the signal,
332 if (_have_internal_generator) {
333 passthru_silence (start_frame, end_frame, nframes, 0);
335 if (_meter_point == MeterInput) {
336 _input->process_input (_meter, start_frame, end_frame, nframes);
338 passthru_silence (start_frame, end_frame, nframes, 0);
343 /* we're sending signal, but we may still want to meter the input.
346 passthru (start_frame, end_frame, nframes, false);
349 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
350 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
352 d->flush_buffers (nframes, end_frame - start_frame - 1);
360 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler)
362 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
367 if (n_outputs().n_total() == 0 && _processors.empty()) {
377 _amp->apply_gain_automation(false);
381 framecnt_t playback_distance;
382 int const dret = _diskstream->process (_session.transport_frame(), nframes, playback_distance);
383 need_butler = _diskstream->commit (playback_distance);
388 Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
392 ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
393 diskstream_playlist_changed ();
394 ds->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_enable_changed, this));
395 ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
396 ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
400 Track::diskstream_playlist_changed ()
402 PlaylistChanged (); /* EMIT SIGNAL */
406 Track::diskstream_record_enable_changed ()
408 RecordEnableChanged (); /* EMIT SIGNAL */
412 Track::diskstream_speed_changed ()
414 SpeedChanged (); /* EMIT SIGNAL */
418 Track::diskstream_alignment_style_changed ()
420 AlignmentStyleChanged (); /* EMIT SIGNAL */
423 boost::shared_ptr<Playlist>
426 return _diskstream->playlist ();
430 Track::monitor_input (bool m)
432 _diskstream->monitor_input (m);
436 Track::destructive () const
438 return _diskstream->destructive ();
441 list<boost::shared_ptr<Source> > &
442 Track::last_capture_sources ()
444 return _diskstream->last_capture_sources ();
448 Track::set_capture_offset ()
450 _diskstream->set_capture_offset ();
453 list<boost::shared_ptr<Source> >
454 Track::steal_write_sources()
456 return _diskstream->steal_write_sources ();
460 Track::reset_write_sources (bool r, bool force)
462 _diskstream->reset_write_sources (r, force);
466 Track::playback_buffer_load () const
468 return _diskstream->playback_buffer_load ();
472 Track::capture_buffer_load () const
474 return _diskstream->capture_buffer_load ();
480 return _diskstream->do_refill ();
484 Track::do_flush (RunContext c, bool force)
486 return _diskstream->do_flush (c, force);
490 Track::set_pending_overwrite (bool o)
492 _diskstream->set_pending_overwrite (o);
496 Track::seek (framepos_t p, bool complete_refill)
498 return _diskstream->seek (p, complete_refill);
502 Track::hidden () const
504 return _diskstream->hidden ();
508 Track::can_internal_playback_seek (framepos_t p)
510 return _diskstream->can_internal_playback_seek (p);
514 Track::internal_playback_seek (framepos_t p)
516 return _diskstream->internal_playback_seek (p);
520 Track::non_realtime_input_change ()
522 _diskstream->non_realtime_input_change ();
526 Track::non_realtime_locate (framepos_t p)
528 _diskstream->non_realtime_locate (p);
532 Track::non_realtime_set_speed ()
534 _diskstream->non_realtime_set_speed ();
538 Track::overwrite_existing_buffers ()
540 return _diskstream->overwrite_existing_buffers ();
544 Track::get_captured_frames (uint32_t n) const
546 return _diskstream->get_captured_frames (n);
550 Track::set_loop (Location* l)
552 return _diskstream->set_loop (l);
556 Track::transport_looped (framepos_t p)
558 _diskstream->transport_looped (p);
562 Track::realtime_set_speed (double s, bool g)
564 return _diskstream->realtime_set_speed (s, g);
568 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
570 _diskstream->transport_stopped_wallclock (n, t, g);
574 Track::pending_overwrite () const
576 return _diskstream->pending_overwrite ();
580 Track::speed () const
582 return _diskstream->speed ();
586 Track::prepare_to_stop (framepos_t p)
588 _diskstream->prepare_to_stop (p);
592 Track::set_slaved (bool s)
594 _diskstream->set_slaved (s);
600 return _diskstream->n_channels ();
604 Track::get_capture_start_frame (uint32_t n) const
606 return _diskstream->get_capture_start_frame (n);
610 Track::alignment_style () const
612 return _diskstream->alignment_style ();
616 Track::alignment_choice () const
618 return _diskstream->alignment_choice ();
622 Track::current_capture_start () const
624 return _diskstream->current_capture_start ();
628 Track::current_capture_end () const
630 return _diskstream->current_capture_end ();
634 Track::playlist_modified ()
636 _diskstream->playlist_modified ();
640 Track::use_playlist (boost::shared_ptr<Playlist> p)
642 return _diskstream->use_playlist (p);
646 Track::use_copy_playlist ()
648 return _diskstream->use_copy_playlist ();
652 Track::use_new_playlist ()
654 return _diskstream->use_new_playlist ();
658 Track::set_align_style (AlignStyle s, bool force)
660 _diskstream->set_align_style (s, force);
664 Track::set_align_choice (AlignChoice s, bool force)
666 _diskstream->set_align_choice (s, force);
670 Track::diskstream_id () const
672 return _diskstream->id ();
676 Track::set_block_size (pframes_t n)
678 Route::set_block_size (n);
679 _diskstream->set_block_size (n);
683 Track::adjust_playback_buffering ()
686 _diskstream->adjust_playback_buffering ();
691 Track::adjust_capture_buffering ()
694 _diskstream->adjust_capture_buffering ();
699 Track::send_silence () const
703 if (Config->get_tape_machine_mode()) {
705 /* ADATs work in a strange way..
706 they monitor input always when stopped.and auto-input is engaged.
709 if ((Config->get_monitoring_model() == SoftwareMonitoring)
710 && ((_monitoring & MonitorInput) || (_diskstream->record_enabled()))) {
711 send_silence = false;
719 /* Other machines switch to input on stop if the track is record enabled,
720 regardless of the auto input setting (auto input only changes the
721 monitoring state when the transport is rolling)
724 if ((Config->get_monitoring_model() == SoftwareMonitoring)
725 && ((_monitoring & MonitorInput) ||
726 (!(_monitoring & MonitorDisk) && (_session.config.get_auto_input () || _diskstream->record_enabled())))){
728 DEBUG_TRACE (DEBUG::Monitor,
729 string_compose ("%1: no roll, use silence = FALSE, monitoring choice %2 recenable %3 sRA %4 autoinput %5\n",
730 name(), enum_2_string (_monitoring),
731 _diskstream->record_enabled(), _session.actively_recording(),
732 _session.config.get_auto_input()));
734 send_silence = false;
736 DEBUG_TRACE (DEBUG::Monitor,
737 string_compose ("%1: no roll, use silence = TRUE, monitoring choice %2 recenable %3 sRA %4 autoinput %5\n",
738 name(), enum_2_string (_monitoring),
739 _diskstream->record_enabled(), _session.actively_recording(),
740 _session.config.get_auto_input()));
749 Track::monitoring_state ()
751 MonitorState ms = MonitoringSilence;
753 if (_session.transport_rolling()) {
757 if (_monitoring & MonitorInput) { // explicitly requested input monitoring
759 ms = MonitoringInput;
761 } else if (_monitoring & MonitorDisk) { // explicitly requested disk monitoring
765 } else if (_diskstream->record_enabled() && _session.actively_recording()) { // Track actually recording
767 ms = MonitoringInput;
769 } else if (_diskstream->record_enabled() && !_session.actively_recording() && _session.config.get_auto_input()) { // Track armed but not recording, with auto input enabled
771 ms = MonitoringInput;
773 } else { // Every other state
783 if (send_silence()) {
785 ms = MonitoringSilence;
788 ms = MonitoringInput;
796 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
798 /* never declick if there is an internal generator - we just want it to
799 keep generating sound without interruption.
801 ditto if we are monitoring inputs.
804 if (_have_internal_generator || monitoring_choice() == MonitorInput) {
809 declick = _pending_declick;
813 Amp::declick (bufs, nframes, declick);
818 Track::check_initial_delay (framecnt_t nframes, framecnt_t& transport_frame)
820 if (_roll_delay > nframes) {
822 _roll_delay -= nframes;
823 silence_unlocked (nframes);
824 /* transport frame is not legal for caller to use */
827 } else if (_roll_delay > 0) {
829 nframes -= _roll_delay;
830 silence_unlocked (_roll_delay);
831 transport_frame += _roll_delay;
833 /* shuffle all the port buffers for things that lead "out" of this Route
834 to reflect that we just wrote _roll_delay frames of silence.
837 Glib::RWLock::ReaderLock lm (_processor_lock);
838 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
839 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
841 iop->increment_port_buffer_offset (_roll_delay);
844 _output->increment_port_buffer_offset (_roll_delay);
854 Track::set_monitoring (MonitorChoice mc)
856 if (mc != _monitoring) {
858 MonitoringChanged (); /* EMIT SIGNAL */