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 ();
102 cerr << _name << ": internal redirect (final) latency = " << own_latency << endl;
105 _output->set_port_latency (own_latency);
107 if (old != own_latency) {
108 _output->set_latency_delay (own_latency);
109 signal_latency_changed (); /* EMIT SIGNAL */
112 return _output->effective_latency();
115 Track::FreezeRecord::~FreezeRecord ()
117 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
123 Track::freeze_state() const
125 return _freeze_record.state;
128 Track::RecEnableControllable::RecEnableControllable (Track& s)
129 : Controllable (X_("recenable")), track (s)
134 Track::RecEnableControllable::set_value (double val)
136 bool bval = ((val >= 0.5) ? true: false);
137 track.set_record_enabled (bval, this);
141 Track::RecEnableControllable::get_value (void) const
143 if (track.record_enabled()) { return 1.0; }
148 Track::record_enabled () const
150 return _diskstream && _diskstream->record_enabled ();
156 bool will_record = true;
157 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
166 Track::set_record_enabled (bool yn, void *src)
168 if (!_session.writable()) {
172 if (_freeze_record.state == Frozen) {
176 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_recenable()) {
177 _route_group->apply (&Track::set_record_enabled, yn, _route_group);
181 /* keep track of the meter point as it was before we rec-enabled */
182 if (!_diskstream->record_enabled()) {
183 _saved_meter_point = _meter_point;
186 _diskstream->set_record_enabled (yn);
188 if (_diskstream->record_enabled()) {
189 if (_meter_point != MeterCustom) {
190 set_meter_point (MeterInput);
193 set_meter_point (_saved_meter_point);
196 _rec_enable_control->Changed ();
201 Track::set_name (const string& str)
205 if (record_enabled() && _session.actively_recording()) {
206 /* this messes things up if done while recording */
210 if (_diskstream->set_name (str)) {
214 /* save state so that the statefile fully reflects any filename changes */
216 if ((ret = Route::set_name (str)) == 0) {
217 _session.save_state ("");
224 Track::set_latency_delay (framecnt_t longest_session_latency)
226 Route::set_latency_delay (longest_session_latency);
227 _diskstream->set_roll_delay (_roll_delay);
231 Track::zero_diskstream_id_in_xml (XMLNode& node)
233 if (node.property ("diskstream-id")) {
234 node.add_property ("diskstream-id", "0");
239 Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame,
240 bool session_state_changing, bool can_record, bool /*rec_monitors_input*/)
242 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
247 if (n_outputs().n_total() == 0) {
256 if (session_state_changing) {
257 if (_session.transport_speed() != 0.0f) {
258 /* we're rolling but some state is changing (e.g. our diskstream contents)
259 so we cannot use them. Be silent till this is over. Don't declick.
261 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
263 passthru_silence (start_frame, end_frame, nframes, 0);
266 /* we're really not rolling, so we're either delivery silence or actually
267 monitoring, both of which are safe to do while session_state_changing is true.
271 _diskstream->check_record_status (start_frame, can_record);
275 if (_have_internal_generator) {
276 /* since the instrument has no input streams,
277 there is no reason to send any signal
282 if (!Config->get_tape_machine_mode()) {
284 ADATs work in a strange way..
285 they monitor input always when stopped.and auto-input is engaged.
287 if ((Config->get_monitoring_model() == SoftwareMonitoring)
288 && (_session.config.get_auto_input () || _diskstream->record_enabled())) {
289 send_silence = false;
295 Other machines switch to input on stop if the track is record enabled,
296 regardless of the auto input setting (auto input only changes the
297 monitoring state when the transport is rolling)
299 if ((Config->get_monitoring_model() == SoftwareMonitoring)
300 && _diskstream->record_enabled()) {
301 send_silence = false;
308 _amp->apply_gain_automation(false);
312 /* if we're sending silence, but we want the meters to show levels for the signal,
316 if (_have_internal_generator) {
317 passthru_silence (start_frame, end_frame, nframes, 0);
319 if (_meter_point == MeterInput) {
320 _input->process_input (_meter, start_frame, end_frame, nframes);
322 passthru_silence (start_frame, end_frame, nframes, 0);
327 /* we're sending signal, but we may still want to meter the input.
330 passthru (start_frame, end_frame, nframes, false);
333 _main_outs->flush_buffers (nframes, end_frame - start_frame - 1);
339 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/,
340 bool can_record, bool rec_monitors_input, bool& need_butler)
342 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
347 if (n_outputs().n_total() == 0 && _processors.empty()) {
357 _amp->apply_gain_automation(false);
361 return _diskstream->process (_session.transport_frame(), nframes, can_record, rec_monitors_input, need_butler);
365 Track::input_streams () const
367 ChanCount cc = _input->n_ports ();
369 if (cc.n_total() == 0 && _diskstream) {
370 return cc = _diskstream->n_channels();
377 Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
381 ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
382 diskstream_playlist_changed ();
383 ds->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_enable_changed, this));
384 ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
385 ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
389 Track::diskstream_playlist_changed ()
391 PlaylistChanged (); /* EMIT SIGNAL */
395 Track::diskstream_record_enable_changed ()
397 RecordEnableChanged (); /* EMIT SIGNAL */
401 Track::diskstream_speed_changed ()
403 SpeedChanged (); /* EMIT SIGNAL */
407 Track::diskstream_alignment_style_changed ()
409 AlignmentStyleChanged (); /* EMIT SIGNAL */
412 boost::shared_ptr<Playlist>
415 return _diskstream->playlist ();
419 Track::monitor_input (bool m)
421 _diskstream->monitor_input (m);
425 Track::destructive () const
427 return _diskstream->destructive ();
430 list<boost::shared_ptr<Source> > &
431 Track::last_capture_sources ()
433 return _diskstream->last_capture_sources ();
437 Track::set_capture_offset ()
439 _diskstream->set_capture_offset ();
442 list<boost::shared_ptr<Source> >
443 Track::steal_write_sources()
445 return _diskstream->steal_write_sources ();
449 Track::reset_write_sources (bool r, bool force)
451 _diskstream->reset_write_sources (r, force);
455 Track::playback_buffer_load () const
457 return _diskstream->playback_buffer_load ();
461 Track::capture_buffer_load () const
463 return _diskstream->capture_buffer_load ();
469 return _diskstream->do_refill ();
473 Track::do_flush (RunContext c, bool force)
475 return _diskstream->do_flush (c, force);
479 Track::set_pending_overwrite (bool o)
481 _diskstream->set_pending_overwrite (o);
485 Track::seek (framepos_t p, bool complete_refill)
487 return _diskstream->seek (p, complete_refill);
491 Track::hidden () const
493 return _diskstream->hidden ();
497 Track::can_internal_playback_seek (framepos_t p)
499 return _diskstream->can_internal_playback_seek (p);
503 Track::internal_playback_seek (framepos_t p)
505 return _diskstream->internal_playback_seek (p);
509 Track::non_realtime_input_change ()
511 _diskstream->non_realtime_input_change ();
515 Track::non_realtime_locate (framepos_t p)
517 _diskstream->non_realtime_locate (p);
521 Track::non_realtime_set_speed ()
523 _diskstream->non_realtime_set_speed ();
527 Track::overwrite_existing_buffers ()
529 return _diskstream->overwrite_existing_buffers ();
533 Track::get_captured_frames (uint32_t n) const
535 return _diskstream->get_captured_frames (n);
539 Track::set_loop (Location* l)
541 return _diskstream->set_loop (l);
545 Track::transport_looped (framepos_t p)
547 _diskstream->transport_looped (p);
551 Track::realtime_set_speed (double s, bool g)
553 return _diskstream->realtime_set_speed (s, g);
557 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
559 _diskstream->transport_stopped_wallclock (n, t, g);
563 Track::pending_overwrite () const
565 return _diskstream->pending_overwrite ();
569 Track::speed () const
571 return _diskstream->speed ();
575 Track::prepare_to_stop (framepos_t p)
577 _diskstream->prepare_to_stop (p);
581 Track::set_slaved (bool s)
583 _diskstream->set_slaved (s);
589 return _diskstream->n_channels ();
593 Track::get_capture_start_frame (uint32_t n) const
595 return _diskstream->get_capture_start_frame (n);
599 Track::alignment_style () const
601 return _diskstream->alignment_style ();
605 Track::current_capture_start () const
607 return _diskstream->current_capture_start ();
611 Track::current_capture_end () const
613 return _diskstream->current_capture_end ();
617 Track::playlist_modified ()
619 _diskstream->playlist_modified ();
623 Track::use_playlist (boost::shared_ptr<Playlist> p)
625 return _diskstream->use_playlist (p);
629 Track::use_copy_playlist ()
631 return _diskstream->use_copy_playlist ();
635 Track::use_new_playlist ()
637 return _diskstream->use_new_playlist ();
641 Track::read_data_count () const
643 return _diskstream->read_data_count ();
647 Track::set_align_style (AlignStyle s)
649 _diskstream->set_align_style (s);
653 Track::write_data_count () const
655 return _diskstream->write_data_count ();
659 Track::diskstream_id () const
661 return _diskstream->id ();
665 Track::set_block_size (pframes_t n)
667 Route::set_block_size (n);
668 _diskstream->set_block_size (n);
672 Track::adjust_playback_buffering ()
675 _diskstream->adjust_playback_buffering ();
680 Track::adjust_capture_buffering ()
683 _diskstream->adjust_capture_buffering ();