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::read_data_count () const
624 return _diskstream->read_data_count ();
628 Track::set_align_style (AlignStyle s, bool force)
630 _diskstream->set_align_style (s, force);
634 Track::set_align_choice (AlignChoice s, bool force)
636 _diskstream->set_align_choice (s, force);
640 Track::write_data_count () const
642 return _diskstream->write_data_count ();
646 Track::diskstream_id () const
648 return _diskstream->id ();
652 Track::set_block_size (pframes_t n)
654 Route::set_block_size (n);
655 _diskstream->set_block_size (n);
659 Track::adjust_playback_buffering ()
662 _diskstream->adjust_playback_buffering ();
667 Track::adjust_capture_buffering ()
670 _diskstream->adjust_capture_buffering ();
675 Track::send_silence () const
679 if (Config->get_tape_machine_mode()) {
681 /* ADATs work in a strange way..
682 they monitor input always when stopped.and auto-input is engaged.
685 if ((Config->get_monitoring_model() == SoftwareMonitoring)
686 && ((_monitoring & MonitorInput) || (_diskstream->record_enabled()))) {
687 send_silence = false;
695 /* Other machines switch to input on stop if the track is record enabled,
696 regardless of the auto input setting (auto input only changes the
697 monitoring state when the transport is rolling)
700 if ((Config->get_monitoring_model() == SoftwareMonitoring)
701 && ((_monitoring & MonitorInput) ||
702 (!(_monitoring & MonitorDisk) && (_session.config.get_auto_input () || _diskstream->record_enabled())))){
703 send_silence = false;
713 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
715 /* never declick if there is an internal generator - we just want it to
716 keep generating sound without interruption.
719 if (_have_internal_generator) {
724 declick = _pending_declick;
728 Amp::declick (bufs, nframes, declick);
733 Track::check_initial_delay (framecnt_t nframes, framecnt_t& transport_frame)
735 if (_roll_delay > nframes) {
737 _roll_delay -= nframes;
738 silence_unlocked (nframes);
739 /* transport frame is not legal for caller to use */
742 } else if (_roll_delay > 0) {
744 nframes -= _roll_delay;
745 silence_unlocked (_roll_delay);
746 transport_frame += _roll_delay;
748 /* shuffle all the port buffers for things that lead "out" of this Route
749 to reflect that we just wrote _roll_delay frames of silence.
752 Glib::RWLock::ReaderLock lm (_processor_lock);
753 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
754 boost::shared_ptr<IOProcessor> iop = boost::dynamic_pointer_cast<IOProcessor> (*i);
756 iop->increment_port_buffer_offset (_roll_delay);
759 _output->increment_port_buffer_offset (_roll_delay);
769 Track::set_monitoring (MonitorChoice mc)
771 if (mc != _monitoring) {
773 MonitoringChanged (); /* EMIT SIGNAL */
778 Track::monitoring_state ()
780 MonitorState ms = MonitoringSilence;
782 if (_session.transport_rolling()) {
786 if ((_monitoring & MonitorInput) || // explicitly requested input monitoring
787 (!(_monitoring & MonitorDisk) && // disk monitoring not requested
788 (_diskstream->record_enabled() && // record-enabled BUT
789 !_session.actively_recording() && // session NOT rec-armed
790 !_session.config.get_auto_input()))) { // and auto-input is off
792 ms = MonitoringInput;
796 ms = MonitorState (0);
799 if ((_monitoring & MonitorDisk) || // explicitly requested disk monitoring
800 (!(_monitoring & MonitorInput) && // input monitoring not requested
801 (!_diskstream->record_enabled() || // NOT record-enabled OR
802 (_session.actively_recording() || // session rec-armed OR
803 _session.config.get_auto_input())))) { // auto-input is ON (mon-input while rec-rolling
805 ms = MonitorState (ms | MonitoringDisk);
812 if (send_silence()) {
813 ms = MonitoringSilence;
815 ms = MonitoringInput;