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 , _rec_enable_control (new RecEnableControllable(*this))
48 _freeze_record.state = NoFreeze;
54 DEBUG_TRACE (DEBUG::Destruction, string_compose ("track %1 destructor\n", _name));
75 Track::get_template ()
81 Track::toggle_monitor_input ()
83 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
84 i->ensure_monitor_input(!i->monitoring_input());
89 Track::update_total_latency ()
91 framecnt_t old = _output->effective_latency();
92 framecnt_t own_latency = _output->user_latency();
94 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
95 if ((*i)->active ()) {
96 own_latency += (*i)->signal_latency ();
100 DEBUG_TRACE (DEBUG::Latency, string_compose ("%1: track: internal redirect latency = %2\n", _name, own_latency));
102 _output->set_port_latency (own_latency);
104 if (old != own_latency) {
105 _output->set_latency_delay (own_latency);
106 signal_latency_changed (); /* EMIT SIGNAL */
109 return _output->effective_latency();
112 Track::FreezeRecord::~FreezeRecord ()
114 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
120 Track::freeze_state() const
122 return _freeze_record.state;
125 Track::RecEnableControllable::RecEnableControllable (Track& s)
126 : Controllable (X_("recenable")), track (s)
131 Track::RecEnableControllable::set_value (double val)
133 bool bval = ((val >= 0.5) ? true: false);
134 track.set_record_enabled (bval, this);
138 Track::RecEnableControllable::get_value (void) const
140 if (track.record_enabled()) { return 1.0; }
145 Track::record_enabled () const
147 return _diskstream && _diskstream->record_enabled ();
153 bool will_record = true;
154 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
163 Track::set_record_enabled (bool yn, void *src)
165 if (!_session.writable()) {
169 if (_freeze_record.state == Frozen) {
173 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_recenable()) {
174 _route_group->apply (&Track::set_record_enabled, yn, _route_group);
178 /* keep track of the meter point as it was before we rec-enabled */
179 if (!_diskstream->record_enabled()) {
180 _saved_meter_point = _meter_point;
183 _diskstream->set_record_enabled (yn);
185 if (_diskstream->record_enabled()) {
186 if (_meter_point != MeterCustom) {
187 set_meter_point (MeterInput);
190 set_meter_point (_saved_meter_point);
193 _rec_enable_control->Changed ();
198 Track::set_name (const string& str)
202 if (record_enabled() && _session.actively_recording()) {
203 /* this messes things up if done while recording */
207 if (_diskstream->set_name (str)) {
211 /* save state so that the statefile fully reflects any filename changes */
213 if ((ret = Route::set_name (str)) == 0) {
214 _session.save_state ("");
221 Track::set_latency_delay (framecnt_t longest_session_latency)
223 Route::set_latency_delay (longest_session_latency);
224 _diskstream->set_roll_delay (_roll_delay);
228 Track::zero_diskstream_id_in_xml (XMLNode& node)
230 if (node.property ("diskstream-id")) {
231 node.add_property ("diskstream-id", "0");
236 Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
237 bool session_state_changing, bool can_record, bool /*rec_monitors_input*/)
239 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
244 if (n_outputs().n_total() == 0) {
253 if (session_state_changing) {
254 if (_session.transport_speed() != 0.0f) {
255 /* we're rolling but some state is changing (e.g. our diskstream contents)
256 so we cannot use them. Be silent till this is over. Don't declick.
258 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
260 passthru_silence (start_frame, end_frame, nframes, 0);
263 /* we're really not rolling, so we're either delivery silence or actually
264 monitoring, both of which are safe to do while session_state_changing is true.
268 _diskstream->check_record_status (start_frame, can_record);
272 if (_have_internal_generator) {
273 /* since the instrument has no input streams,
274 there is no reason to send any signal
279 be_silent = send_silence ();
282 _amp->apply_gain_automation(false);
286 /* if we're sending silence, but we want the meters to show levels for the signal,
290 if (_have_internal_generator) {
291 passthru_silence (start_frame, end_frame, nframes, 0);
293 if (_meter_point == MeterInput) {
294 _input->process_input (_meter, start_frame, end_frame, nframes);
296 passthru_silence (start_frame, end_frame, nframes, 0);
301 /* we're sending signal, but we may still want to meter the input.
304 passthru (start_frame, end_frame, nframes, false);
307 _main_outs->flush_buffers (nframes, end_frame - start_frame - 1);
313 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/,
314 bool can_record, bool rec_monitors_input, bool& need_butler)
316 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
321 if (n_outputs().n_total() == 0 && _processors.empty()) {
331 _amp->apply_gain_automation(false);
335 return _diskstream->process (_session.transport_frame(), nframes, can_record, rec_monitors_input, need_butler);
339 Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
343 ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
344 diskstream_playlist_changed ();
345 ds->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_enable_changed, this));
346 ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
347 ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
351 Track::diskstream_playlist_changed ()
353 PlaylistChanged (); /* EMIT SIGNAL */
357 Track::diskstream_record_enable_changed ()
359 RecordEnableChanged (); /* EMIT SIGNAL */
363 Track::diskstream_speed_changed ()
365 SpeedChanged (); /* EMIT SIGNAL */
369 Track::diskstream_alignment_style_changed ()
371 AlignmentStyleChanged (); /* EMIT SIGNAL */
374 boost::shared_ptr<Playlist>
377 return _diskstream->playlist ();
381 Track::monitor_input (bool m)
383 _diskstream->monitor_input (m);
387 Track::destructive () const
389 return _diskstream->destructive ();
392 list<boost::shared_ptr<Source> > &
393 Track::last_capture_sources ()
395 return _diskstream->last_capture_sources ();
399 Track::set_capture_offset ()
401 _diskstream->set_capture_offset ();
404 list<boost::shared_ptr<Source> >
405 Track::steal_write_sources()
407 return _diskstream->steal_write_sources ();
411 Track::reset_write_sources (bool r, bool force)
413 _diskstream->reset_write_sources (r, force);
417 Track::playback_buffer_load () const
419 return _diskstream->playback_buffer_load ();
423 Track::capture_buffer_load () const
425 return _diskstream->capture_buffer_load ();
431 return _diskstream->do_refill ();
435 Track::do_flush (RunContext c, bool force)
437 return _diskstream->do_flush (c, force);
441 Track::set_pending_overwrite (bool o)
443 _diskstream->set_pending_overwrite (o);
447 Track::seek (framepos_t p, bool complete_refill)
449 return _diskstream->seek (p, complete_refill);
453 Track::hidden () const
455 return _diskstream->hidden ();
459 Track::can_internal_playback_seek (framepos_t p)
461 return _diskstream->can_internal_playback_seek (p);
465 Track::internal_playback_seek (framepos_t p)
467 return _diskstream->internal_playback_seek (p);
471 Track::non_realtime_input_change ()
473 _diskstream->non_realtime_input_change ();
477 Track::non_realtime_locate (framepos_t p)
479 _diskstream->non_realtime_locate (p);
483 Track::non_realtime_set_speed ()
485 _diskstream->non_realtime_set_speed ();
489 Track::overwrite_existing_buffers ()
491 return _diskstream->overwrite_existing_buffers ();
495 Track::get_captured_frames (uint32_t n) const
497 return _diskstream->get_captured_frames (n);
501 Track::set_loop (Location* l)
503 return _diskstream->set_loop (l);
507 Track::transport_looped (framepos_t p)
509 _diskstream->transport_looped (p);
513 Track::realtime_set_speed (double s, bool g)
515 return _diskstream->realtime_set_speed (s, g);
519 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
521 _diskstream->transport_stopped_wallclock (n, t, g);
525 Track::pending_overwrite () const
527 return _diskstream->pending_overwrite ();
531 Track::speed () const
533 return _diskstream->speed ();
537 Track::prepare_to_stop (framepos_t p)
539 _diskstream->prepare_to_stop (p);
543 Track::set_slaved (bool s)
545 _diskstream->set_slaved (s);
551 return _diskstream->n_channels ();
555 Track::get_capture_start_frame (uint32_t n) const
557 return _diskstream->get_capture_start_frame (n);
561 Track::alignment_style () const
563 return _diskstream->alignment_style ();
567 Track::alignment_choice () const
569 return _diskstream->alignment_choice ();
573 Track::current_capture_start () const
575 return _diskstream->current_capture_start ();
579 Track::current_capture_end () const
581 return _diskstream->current_capture_end ();
585 Track::playlist_modified ()
587 _diskstream->playlist_modified ();
591 Track::use_playlist (boost::shared_ptr<Playlist> p)
593 return _diskstream->use_playlist (p);
597 Track::use_copy_playlist ()
599 return _diskstream->use_copy_playlist ();
603 Track::use_new_playlist ()
605 return _diskstream->use_new_playlist ();
609 Track::read_data_count () const
611 return _diskstream->read_data_count ();
615 Track::set_align_style (AlignStyle s)
617 _diskstream->set_align_style (s);
621 Track::set_align_choice (AlignChoice s)
623 _diskstream->set_align_choice (s);
627 Track::write_data_count () const
629 return _diskstream->write_data_count ();
633 Track::diskstream_id () const
635 return _diskstream->id ();
639 Track::set_block_size (pframes_t n)
641 Route::set_block_size (n);
642 _diskstream->set_block_size (n);
646 Track::adjust_playback_buffering ()
649 _diskstream->adjust_playback_buffering ();
654 Track::adjust_capture_buffering ()
657 _diskstream->adjust_capture_buffering ();
662 Track::send_silence () const
665 ADATs work in a strange way..
666 they monitor input always when stopped.and auto-input is engaged.
668 Other machines switch to input on stop if the track is record enabled,
669 regardless of the auto input setting (auto input only changes the
670 monitoring state when the transport is rolling)
675 if (!Config->get_tape_machine_mode()) {
677 ADATs work in a strange way..
678 they monitor input always when stopped.and auto-input is engaged.
680 if ((Config->get_monitoring_model() == SoftwareMonitoring)
681 && (_session.config.get_auto_input () || _diskstream->record_enabled())) {
682 send_silence = false;
688 Other machines switch to input on stop if the track is record enabled,
689 regardless of the auto input setting (auto input only changes the
690 monitoring state when the transport is rolling)
692 if ((Config->get_monitoring_model() == SoftwareMonitoring)
693 && _diskstream->record_enabled()) {
694 send_silence = false;
704 Track::maybe_declick (BufferSet& bufs, framecnt_t nframes, int declick)
706 /* never declick if there is an internal generator - we just want it to
707 keep generating sound without interruption.
710 if (_have_internal_generator) {
715 declick = _pending_declick;
719 Amp::declick (bufs, nframes, declick);