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));
73 Track::get_template ()
79 Track::toggle_monitor_input ()
81 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end(); ++i) {
82 i->ensure_monitor_input(!i->monitoring_input());
87 Track::update_total_latency ()
89 nframes_t old = _output->effective_latency();
90 nframes_t own_latency = _output->user_latency();
92 for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
93 if ((*i)->active ()) {
94 own_latency += (*i)->signal_latency ();
100 cerr << _name << ": internal redirect (final) latency = " << own_latency << endl;
103 _output->set_port_latency (own_latency);
105 if (old != own_latency) {
106 _output->set_latency_delay (own_latency);
107 signal_latency_changed (); /* EMIT SIGNAL */
110 return _output->effective_latency();
113 Track::FreezeRecord::~FreezeRecord ()
115 for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
121 Track::freeze_state() const
123 return _freeze_record.state;
126 Track::RecEnableControllable::RecEnableControllable (Track& s)
127 : Controllable (X_("recenable")), track (s)
132 Track::RecEnableControllable::set_value (float val)
134 bool bval = ((val >= 0.5f) ? true: false);
135 track.set_record_enable (bval, this);
139 Track::RecEnableControllable::get_value (void) const
141 if (track.record_enabled()) { return 1.0f; }
146 Track::record_enabled () const
148 return _diskstream && _diskstream->record_enabled ();
154 bool will_record = true;
155 for (PortSet::iterator i = _input->ports().begin(); i != _input->ports().end() && will_record; ++i) {
164 Track::set_record_enable (bool yn, void *src)
166 if (!_session.writable()) {
170 if (_freeze_record.state == Frozen) {
174 if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_recenable()) {
175 _route_group->apply (&Track::set_record_enable, yn, _route_group);
179 /* keep track of the meter point as it was before we rec-enabled */
180 if (!_diskstream->record_enabled()) {
181 _saved_meter_point = _meter_point;
184 _diskstream->set_record_enabled (yn);
186 if (_diskstream->record_enabled()) {
187 if (_meter_point != MeterCustom) {
188 set_meter_point (MeterInput);
191 set_meter_point (_saved_meter_point);
194 _rec_enable_control->Changed ();
199 Track::set_name (const string& str)
203 if (record_enabled() && _session.actively_recording()) {
204 /* this messes things up if done while recording */
208 if (_diskstream->set_name (str)) {
212 /* save state so that the statefile fully reflects any filename changes */
214 if ((ret = Route::set_name (str)) == 0) {
215 _session.save_state ("");
222 Track::set_latency_delay (nframes_t longest_session_latency)
224 Route::set_latency_delay (longest_session_latency);
225 _diskstream->set_roll_delay (_roll_delay);
229 Track::zero_diskstream_id_in_xml (XMLNode& node)
231 if (node.property ("diskstream-id")) {
232 node.add_property ("diskstream-id", "0");
237 Track::no_roll (nframes_t nframes, framepos_t start_frame, framepos_t end_frame,
238 bool session_state_changing, bool can_record, bool /*rec_monitors_input*/)
240 if (n_outputs().n_total() == 0) {
249 if (session_state_changing) {
250 if (_session.transport_speed() != 0.0f) {
251 /* we're rolling but some state is changing (e.g. our diskstream contents)
252 so we cannot use them. Be silent till this is over. Don't declick.
254 XXX note the absurdity of ::no_roll() being called when we ARE rolling!
256 passthru_silence (start_frame, end_frame, nframes, 0);
259 /* we're really not rolling, so we're either delivery silence or actually
260 monitoring, both of which are safe to do while session_state_changing is true.
264 _diskstream->check_record_status (start_frame, nframes, can_record);
268 if (_have_internal_generator) {
269 /* since the instrument has no input streams,
270 there is no reason to send any signal
275 if (!Config->get_tape_machine_mode()) {
277 ADATs work in a strange way..
278 they monitor input always when stopped.and auto-input is engaged.
280 if ((Config->get_monitoring_model() == SoftwareMonitoring)
281 && (_session.config.get_auto_input () || _diskstream->record_enabled())) {
282 send_silence = false;
288 Other machines switch to input on stop if the track is record enabled,
289 regardless of the auto input setting (auto input only changes the
290 monitoring state when the transport is rolling)
292 if ((Config->get_monitoring_model() == SoftwareMonitoring)
293 && _diskstream->record_enabled()) {
294 send_silence = false;
301 _amp->apply_gain_automation(false);
305 /* if we're sending silence, but we want the meters to show levels for the signal,
309 if (_have_internal_generator) {
310 passthru_silence (start_frame, end_frame, nframes, 0);
312 if (_meter_point == MeterInput) {
313 _input->process_input (_meter, start_frame, end_frame, nframes);
315 passthru_silence (start_frame, end_frame, nframes, 0);
320 /* we're sending signal, but we may still want to meter the input.
323 passthru (start_frame, end_frame, nframes, false);
326 _main_outs->flush (nframes, end_frame - start_frame - 1);
332 Track::silent_roll (nframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/,
333 bool can_record, bool rec_monitors_input, bool& need_butler)
335 if (n_outputs().n_total() == 0 && _processors.empty()) {
345 _amp->apply_gain_automation(false);
349 return _diskstream->process (_session.transport_frame(), nframes, can_record, rec_monitors_input, need_butler);
353 Track::input_streams () const
355 ChanCount cc = _input->n_ports ();
357 if (cc.n_total() == 0 && _diskstream) {
358 return cc = _diskstream->n_channels();
365 Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
369 ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
370 diskstream_playlist_changed ();
371 ds->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_enable_changed, this));
372 ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
373 ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
377 Track::diskstream_playlist_changed ()
379 PlaylistChanged (); /* EMIT SIGNAL */
383 Track::diskstream_record_enable_changed ()
385 RecordEnableChanged (); /* EMIT SIGNAL */
389 Track::diskstream_speed_changed ()
391 SpeedChanged (); /* EMIT SIGNAL */
395 Track::diskstream_alignment_style_changed ()
397 AlignmentStyleChanged (); /* EMIT SIGNAL */
400 boost::shared_ptr<Playlist>
403 return _diskstream->playlist ();
407 Track::monitor_input (bool m)
409 _diskstream->monitor_input (m);
413 Track::destructive () const
415 return _diskstream->destructive ();
418 list<boost::shared_ptr<Region> > &
419 Track::last_capture_regions ()
421 return _diskstream->last_capture_regions ();
425 Track::set_capture_offset ()
427 _diskstream->set_capture_offset ();
431 Track::reset_write_sources (bool r, bool force)
433 _diskstream->reset_write_sources (r, force);
437 Track::playback_buffer_load () const
439 return _diskstream->playback_buffer_load ();
443 Track::capture_buffer_load () const
445 return _diskstream->capture_buffer_load ();
451 return _diskstream->do_refill ();
455 Track::do_flush (RunContext c, bool force)
457 return _diskstream->do_flush (c, force);
461 Track::set_pending_overwrite (bool o)
463 _diskstream->set_pending_overwrite (o);
467 Track::seek (nframes_t s, bool complete_refill)
469 return _diskstream->seek (s, complete_refill);
473 Track::hidden () const
475 return _diskstream->hidden ();
479 Track::can_internal_playback_seek (nframes_t d)
481 return _diskstream->can_internal_playback_seek (d);
485 Track::internal_playback_seek (nframes_t d)
487 return _diskstream->internal_playback_seek (d);
491 Track::non_realtime_input_change ()
493 _diskstream->non_realtime_input_change ();
497 Track::non_realtime_locate (nframes_t p)
499 _diskstream->non_realtime_locate (p);
503 Track::non_realtime_set_speed ()
505 _diskstream->non_realtime_set_speed ();
509 Track::overwrite_existing_buffers ()
511 return _diskstream->overwrite_existing_buffers ();
515 Track::get_captured_frames (uint32_t n)
517 return _diskstream->get_captured_frames (n);
521 Track::set_loop (Location* l)
523 return _diskstream->set_loop (l);
527 Track::transport_looped (nframes_t f)
529 _diskstream->transport_looped (f);
533 Track::realtime_set_speed (double s, bool g)
535 return _diskstream->realtime_set_speed (s, g);
539 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
541 _diskstream->transport_stopped_wallclock (n, t, g);
545 Track::pending_overwrite () const
547 return _diskstream->pending_overwrite ();
551 Track::speed () const
553 return _diskstream->speed ();
557 Track::prepare_to_stop (framepos_t p)
559 _diskstream->prepare_to_stop (p);
563 Track::set_slaved (bool s)
565 _diskstream->set_slaved (s);
571 return _diskstream->n_channels ();
575 Track::get_capture_start_frame (uint32_t n)
577 return _diskstream->get_capture_start_frame (n);
581 Track::alignment_style () const
583 return _diskstream->alignment_style ();
587 Track::set_record_enabled (bool r)
589 _diskstream->set_record_enabled (r);
593 Track::current_capture_start () const
595 return _diskstream->current_capture_start ();
599 Track::current_capture_end () const
601 return _diskstream->current_capture_end ();
605 Track::playlist_modified ()
607 _diskstream->playlist_modified ();
611 Track::use_playlist (boost::shared_ptr<Playlist> p)
613 return _diskstream->use_playlist (p);
617 Track::use_copy_playlist ()
619 return _diskstream->use_copy_playlist ();
623 Track::use_new_playlist ()
625 return _diskstream->use_new_playlist ();
629 Track::read_data_count () const
631 return _diskstream->read_data_count ();
635 Track::set_align_style (AlignStyle s)
637 _diskstream->set_align_style (s);
641 Track::write_data_count () const
643 return _diskstream->write_data_count ();
647 Track::diskstream_id () const
649 return _diskstream->id ();
653 Track::set_block_size (nframes_t n)
655 Route::set_block_size (n);
656 _diskstream->set_block_size (n);