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 if (Route::set_state (node, version)) {
94 if (version >= 3000) {
95 if ((child = find_named_node (node, X_("Diskstream"))) != 0) {
96 boost::shared_ptr<Diskstream> ds = diskstream_factory (*child);
97 ds->do_refill_with_alloc ();
102 /* set rec-enable control *AFTER* setting up diskstream, because it may
103 want to operate on the diskstream as it sets its own state
106 XMLNodeList nlist = node.children();
107 for (XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); ++niter) {
111 if (child->name() == Controllable::xml_node_name && (prop = child->property ("name")) != 0) {
112 if (prop->value() == X_("recenable")) {
113 _rec_enable_control->set_state (*child, version);
118 const XMLProperty* prop;
120 if ((prop = node.property (X_("monitoring"))) != 0) {
121 _monitoring = MonitorChoice (string_2_enum (prop->value(), _monitoring));
123 _monitoring = MonitorAuto;
126 if ((prop = node.property (X_("saved-meter-point"))) != 0) {
127 _saved_meter_point = MeterPoint (string_2_enum (prop->value(), _saved_meter_point));
129 _saved_meter_point = _meter_point;
136 Track::get_template ()
138 return state (false);
142 Track::toggle_monitor_input ()
144 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
145 i->ensure_monitor_input(!i->monitoring_input());
149 Track::FreezeRecord::~FreezeRecord ()
151 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
157 Track::freeze_state() const
159 return _freeze_record.state;
162 Track::RecEnableControllable::RecEnableControllable (Track& s)
163 : Controllable (X_("recenable")), track (s)
168 Track::RecEnableControllable::set_value (double val)
170 bool bval = ((val >= 0.5) ? true: false);
171 track.set_record_enabled (bval, this);
175 Track::RecEnableControllable::get_value (void) const
177 if (track.record_enabled()) { return 1.0; }
182 Track::record_enabled () const
184 return _diskstream && _diskstream->record_enabled ();
190 bool will_record = true;
191 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
200 Track::set_record_enabled (bool yn, void *src)
202 if (!_session.writable()) {
206 if (_freeze_record.state == Frozen) {
210 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_recenable()) {
211 _route_group->apply (&Track::set_record_enabled, yn, _route_group);
215 /* keep track of the meter point as it was before we rec-enabled */
216 if (!_diskstream->record_enabled()) {
217 _saved_meter_point = _meter_point;
220 _diskstream->set_record_enabled (yn);
222 if (_diskstream->record_enabled()) {
223 if (_meter_point != MeterCustom) {
224 set_meter_point (MeterInput);
227 set_meter_point (_saved_meter_point);
230 _rec_enable_control->Changed ();
235 Track::set_name (const string& str)
239 if (record_enabled() && _session.actively_recording()) {
240 /* this messes things up if done while recording */
244 _diskstream->set_name (str);
246 /* save state so that the statefile fully reflects any filename changes */
248 if ((ret = Route::set_name (str)) == 0) {
249 _session.save_state ("");
256 Track::set_latency_compensation (framecnt_t longest_session_latency)
258 Route::set_latency_compensation (longest_session_latency);
259 _diskstream->set_roll_delay (_roll_delay);
263 Track::zero_diskstream_id_in_xml (XMLNode& node)
265 if (node.property ("diskstream-id")) {
266 node.add_property ("diskstream-id", "0");
271 Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
273 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
278 bool can_record = _session.actively_recording ();
280 if (n_outputs().n_total() == 0) {
289 if (session_state_changing) {
290 if (_session.transport_speed() != 0.0f) {
291 /* we're rolling but some state is changing (e.g. our diskstream contents)
292 so we cannot use them. Be silent till this is over. Don't declick.
294 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
296 passthru_silence (start_frame, end_frame, nframes, 0);
299 /* we're really not rolling, so we're either delivery silence or actually
300 monitoring, both of which are safe to do while session_state_changing is true.
304 _diskstream->check_record_status (start_frame, can_record);
308 if (_have_internal_generator) {
309 /* since the instrument has no input streams,
310 there is no reason to send any signal
315 be_silent = send_silence ();
318 _amp->apply_gain_automation(false);
322 /* if we're sending silence, but we want the meters to show levels for the signal,
326 if (_have_internal_generator) {
327 passthru_silence (start_frame, end_frame, nframes, 0);
329 if (_meter_point == MeterInput) {
330 _input->process_input (_meter, start_frame, end_frame, nframes);
332 passthru_silence (start_frame, end_frame, nframes, 0);
337 /* we're sending signal, but we may still want to meter the input.
340 passthru (start_frame, end_frame, nframes, false);
343 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
344 boost::shared_ptr<Delivery> d = boost::dynamic_pointer_cast<Delivery> (*i);
346 d->flush_buffers (nframes, end_frame - start_frame - 1);
354 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler)
356 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
361 if (n_outputs().n_total() == 0 && _processors.empty()) {
371 _amp->apply_gain_automation(false);
375 framecnt_t playback_distance;
376 int const dret = _diskstream->process (_session.transport_frame(), nframes, playback_distance);
377 need_butler = _diskstream->commit (playback_distance);
382 Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
386 ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
387 diskstream_playlist_changed ();
388 ds->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_enable_changed, this));
389 ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
390 ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
394 Track::diskstream_playlist_changed ()
396 PlaylistChanged (); /* EMIT SIGNAL */
400 Track::diskstream_record_enable_changed ()
402 RecordEnableChanged (); /* EMIT SIGNAL */
406 Track::diskstream_speed_changed ()
408 SpeedChanged (); /* EMIT SIGNAL */
412 Track::diskstream_alignment_style_changed ()
414 AlignmentStyleChanged (); /* EMIT SIGNAL */
417 boost::shared_ptr<Playlist>
420 return _diskstream->playlist ();
424 Track::monitor_input (bool m)
426 _diskstream->monitor_input (m);
430 Track::destructive () const
432 return _diskstream->destructive ();
435 list<boost::shared_ptr<Source> > &
436 Track::last_capture_sources ()
438 return _diskstream->last_capture_sources ();
442 Track::set_capture_offset ()
444 _diskstream->set_capture_offset ();
447 list<boost::shared_ptr<Source> >
448 Track::steal_write_sources()
450 return _diskstream->steal_write_sources ();
454 Track::reset_write_sources (bool r, bool force)
456 _diskstream->reset_write_sources (r, force);
460 Track::playback_buffer_load () const
462 return _diskstream->playback_buffer_load ();
466 Track::capture_buffer_load () const
468 return _diskstream->capture_buffer_load ();
474 return _diskstream->do_refill ();
478 Track::do_flush (RunContext c, bool force)
480 return _diskstream->do_flush (c, force);
484 Track::set_pending_overwrite (bool o)
486 _diskstream->set_pending_overwrite (o);
490 Track::seek (framepos_t p, bool complete_refill)
492 return _diskstream->seek (p, complete_refill);
496 Track::hidden () const
498 return _diskstream->hidden ();
502 Track::can_internal_playback_seek (framepos_t p)
504 return _diskstream->can_internal_playback_seek (p);
508 Track::internal_playback_seek (framepos_t p)
510 return _diskstream->internal_playback_seek (p);
514 Track::non_realtime_input_change ()
516 _diskstream->non_realtime_input_change ();
520 Track::non_realtime_locate (framepos_t p)
522 _diskstream->non_realtime_locate (p);
526 Track::non_realtime_set_speed ()
528 _diskstream->non_realtime_set_speed ();
532 Track::overwrite_existing_buffers ()
534 return _diskstream->overwrite_existing_buffers ();
538 Track::get_captured_frames (uint32_t n) const
540 return _diskstream->get_captured_frames (n);
544 Track::set_loop (Location* l)
546 return _diskstream->set_loop (l);
550 Track::transport_looped (framepos_t p)
552 _diskstream->transport_looped (p);
556 Track::realtime_set_speed (double s, bool g)
558 return _diskstream->realtime_set_speed (s, g);
562 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
564 _diskstream->transport_stopped_wallclock (n, t, g);
568 Track::pending_overwrite () const
570 return _diskstream->pending_overwrite ();
574 Track::speed () const
576 return _diskstream->speed ();
580 Track::prepare_to_stop (framepos_t p)
582 _diskstream->prepare_to_stop (p);
586 Track::set_slaved (bool s)
588 _diskstream->set_slaved (s);
594 return _diskstream->n_channels ();
598 Track::get_capture_start_frame (uint32_t n) const
600 return _diskstream->get_capture_start_frame (n);
604 Track::alignment_style () const
606 return _diskstream->alignment_style ();
610 Track::alignment_choice () const
612 return _diskstream->alignment_choice ();
616 Track::current_capture_start () const
618 return _diskstream->current_capture_start ();
622 Track::current_capture_end () const
624 return _diskstream->current_capture_end ();
628 Track::playlist_modified ()
630 _diskstream->playlist_modified ();
634 Track::use_playlist (boost::shared_ptr<Playlist> p)
636 return _diskstream->use_playlist (p);
640 Track::use_copy_playlist ()
642 return _diskstream->use_copy_playlist ();
646 Track::use_new_playlist ()
648 return _diskstream->use_new_playlist ();
652 Track::set_align_style (AlignStyle s, bool force)
654 _diskstream->set_align_style (s, force);
658 Track::set_align_choice (AlignChoice s, bool force)
660 _diskstream->set_align_choice (s, force);
664 Track::diskstream_id () const
666 return _diskstream->id ();
670 Track::set_block_size (pframes_t n)
672 Route::set_block_size (n);
673 _diskstream->set_block_size (n);
677 Track::adjust_playback_buffering ()
680 _diskstream->adjust_playback_buffering ();
685 Track::adjust_capture_buffering ()
688 _diskstream->adjust_capture_buffering ();
693 Track::send_silence () const
697 if (Config->get_tape_machine_mode()) {
699 /* ADATs work in a strange way..
700 they monitor input always when stopped.and auto-input is engaged.
703 if ((Config->get_monitoring_model() == SoftwareMonitoring)
704 && ((_monitoring & MonitorInput) || (_diskstream->record_enabled()))) {
705 send_silence = false;
713 /* Other machines switch to input on stop if the track is record enabled,
714 regardless of the auto input setting (auto input only changes the
715 monitoring state when the transport is rolling)
718 if ((Config->get_monitoring_model() == SoftwareMonitoring)
719 && ((_monitoring & MonitorInput) ||
720 (!(_monitoring & MonitorDisk) && (_session.config.get_auto_input () || _diskstream->record_enabled())))){
722 DEBUG_TRACE (DEBUG::Monitor,
723 string_compose ("%1: no roll, use silence = FALSE, monitoring choice %2 recenable %3 sRA %4 autoinput %5\n",
724 name(), enum_2_string (_monitoring),
725 _diskstream->record_enabled(), _session.actively_recording(),
726 _session.config.get_auto_input()));
728 send_silence = false;
730 DEBUG_TRACE (DEBUG::Monitor,
731 string_compose ("%1: no roll, use silence = TRUE, monitoring choice %2 recenable %3 sRA %4 autoinput %5\n",
732 name(), enum_2_string (_monitoring),
733 _diskstream->record_enabled(), _session.actively_recording(),
734 _session.config.get_auto_input()));
743 Track::monitoring_state ()
745 MonitorState ms = MonitoringSilence;
747 if (_session.transport_rolling()) {
751 if (_monitoring & MonitorInput) { // explicitly requested input monitoring
753 ms = MonitoringInput;
755 } else if (_monitoring & MonitorDisk) { // explicitly requested disk monitoring
759 } else if (_diskstream->record_enabled() && _session.actively_recording()) { // Track actually recording
761 ms = MonitoringInput;
763 } else if (_diskstream->record_enabled() && !_session.actively_recording() && _session.config.get_auto_input()) { // Track armed but not recording, with auto input enabled
765 ms = MonitoringInput;
767 } else { // Every other state
777 if (send_silence()) {
779 ms = MonitoringSilence;
782 ms = MonitoringInput;
790 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
792 /* never declick if there is an internal generator - we just want it to
793 keep generating sound without interruption.
795 ditto if we are monitoring inputs.
798 if (_have_internal_generator || monitoring_choice() == MonitorInput) {
803 declick = _pending_declick;
807 Amp::declick (bufs, nframes, declick);
812 Track::check_initial_delay (framecnt_t nframes, framecnt_t& transport_frame)
814 if (_roll_delay > nframes) {
816 _roll_delay -= nframes;
817 silence_unlocked (nframes);
818 /* transport frame is not legal for caller to use */
821 } else if (_roll_delay > 0) {
823 nframes -= _roll_delay;
824 silence_unlocked (_roll_delay);
825 transport_frame += _roll_delay;
827 /* shuffle all the port buffers for things that lead "out" of this Route
828 to reflect that we just wrote _roll_delay frames of silence.
831 Glib::RWLock::ReaderLock lm (_processor_lock);
832 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
833 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
835 iop->increment_port_buffer_offset (_roll_delay);
838 _output->increment_port_buffer_offset (_roll_delay);
848 Track::set_monitoring (MonitorChoice mc)
850 if (mc != _monitoring) {
852 MonitoringChanged (); /* EMIT SIGNAL */