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 be_silent = send_silence ();
285 _amp->apply_gain_automation(false);
289 /* if we're sending silence, but we want the meters to show levels for the signal,
293 if (_have_internal_generator) {
294 passthru_silence (start_frame, end_frame, nframes, 0);
296 if (_meter_point == MeterInput) {
297 _input->process_input (_meter, start_frame, end_frame, nframes);
299 passthru_silence (start_frame, end_frame, nframes, 0);
304 /* we're sending signal, but we may still want to meter the input.
307 passthru (start_frame, end_frame, nframes, false);
310 _main_outs->flush_buffers (nframes, end_frame - start_frame - 1);
316 Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/,
317 bool can_record, bool rec_monitors_input, bool& need_butler)
319 Glib::RWLock::ReaderLock lm (_processor_lock, Glib::TRY_LOCK);
324 if (n_outputs().n_total() == 0 && _processors.empty()) {
334 _amp->apply_gain_automation(false);
338 return _diskstream->process (_session.transport_frame(), nframes, can_record, rec_monitors_input, need_butler);
342 Track::set_diskstream (boost::shared_ptr<Diskstream> ds)
346 ds->PlaylistChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_playlist_changed, this));
347 diskstream_playlist_changed ();
348 ds->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_record_enable_changed, this));
349 ds->SpeedChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_speed_changed, this));
350 ds->AlignmentStyleChanged.connect_same_thread (*this, boost::bind (&Track::diskstream_alignment_style_changed, this));
354 Track::diskstream_playlist_changed ()
356 PlaylistChanged (); /* EMIT SIGNAL */
360 Track::diskstream_record_enable_changed ()
362 RecordEnableChanged (); /* EMIT SIGNAL */
366 Track::diskstream_speed_changed ()
368 SpeedChanged (); /* EMIT SIGNAL */
372 Track::diskstream_alignment_style_changed ()
374 AlignmentStyleChanged (); /* EMIT SIGNAL */
377 boost::shared_ptr<Playlist>
380 return _diskstream->playlist ();
384 Track::monitor_input (bool m)
386 _diskstream->monitor_input (m);
390 Track::destructive () const
392 return _diskstream->destructive ();
395 list<boost::shared_ptr<Source> > &
396 Track::last_capture_sources ()
398 return _diskstream->last_capture_sources ();
402 Track::set_capture_offset ()
404 _diskstream->set_capture_offset ();
407 list<boost::shared_ptr<Source> >
408 Track::steal_write_sources()
410 return _diskstream->steal_write_sources ();
414 Track::reset_write_sources (bool r, bool force)
416 _diskstream->reset_write_sources (r, force);
420 Track::playback_buffer_load () const
422 return _diskstream->playback_buffer_load ();
426 Track::capture_buffer_load () const
428 return _diskstream->capture_buffer_load ();
434 return _diskstream->do_refill ();
438 Track::do_flush (RunContext c, bool force)
440 return _diskstream->do_flush (c, force);
444 Track::set_pending_overwrite (bool o)
446 _diskstream->set_pending_overwrite (o);
450 Track::seek (framepos_t p, bool complete_refill)
452 return _diskstream->seek (p, complete_refill);
456 Track::hidden () const
458 return _diskstream->hidden ();
462 Track::can_internal_playback_seek (framepos_t p)
464 return _diskstream->can_internal_playback_seek (p);
468 Track::internal_playback_seek (framepos_t p)
470 return _diskstream->internal_playback_seek (p);
474 Track::non_realtime_input_change ()
476 _diskstream->non_realtime_input_change ();
480 Track::non_realtime_locate (framepos_t p)
482 _diskstream->non_realtime_locate (p);
486 Track::non_realtime_set_speed ()
488 _diskstream->non_realtime_set_speed ();
492 Track::overwrite_existing_buffers ()
494 return _diskstream->overwrite_existing_buffers ();
498 Track::get_captured_frames (uint32_t n) const
500 return _diskstream->get_captured_frames (n);
504 Track::set_loop (Location* l)
506 return _diskstream->set_loop (l);
510 Track::transport_looped (framepos_t p)
512 _diskstream->transport_looped (p);
516 Track::realtime_set_speed (double s, bool g)
518 return _diskstream->realtime_set_speed (s, g);
522 Track::transport_stopped_wallclock (struct tm & n, time_t t, bool g)
524 _diskstream->transport_stopped_wallclock (n, t, g);
528 Track::pending_overwrite () const
530 return _diskstream->pending_overwrite ();
534 Track::speed () const
536 return _diskstream->speed ();
540 Track::prepare_to_stop (framepos_t p)
542 _diskstream->prepare_to_stop (p);
546 Track::set_slaved (bool s)
548 _diskstream->set_slaved (s);
554 return _diskstream->n_channels ();
558 Track::get_capture_start_frame (uint32_t n) const
560 return _diskstream->get_capture_start_frame (n);
564 Track::alignment_style () const
566 return _diskstream->alignment_style ();
570 Track::current_capture_start () const
572 return _diskstream->current_capture_start ();
576 Track::current_capture_end () const
578 return _diskstream->current_capture_end ();
582 Track::playlist_modified ()
584 _diskstream->playlist_modified ();
588 Track::use_playlist (boost::shared_ptr<Playlist> p)
590 return _diskstream->use_playlist (p);
594 Track::use_copy_playlist ()
596 return _diskstream->use_copy_playlist ();
600 Track::use_new_playlist ()
602 return _diskstream->use_new_playlist ();
606 Track::read_data_count () const
608 return _diskstream->read_data_count ();
612 Track::set_align_style (AlignStyle s)
614 _diskstream->set_align_style (s);
618 Track::write_data_count () const
620 return _diskstream->write_data_count ();
624 Track::diskstream_id () const
626 return _diskstream->id ();
630 Track::set_block_size (pframes_t n)
632 Route::set_block_size (n);
633 _diskstream->set_block_size (n);
637 Track::adjust_playback_buffering ()
640 _diskstream->adjust_playback_buffering ();
645 Track::adjust_capture_buffering ()
648 _diskstream->adjust_capture_buffering ();
653 Track::send_silence () const
656 ADATs work in a strange way..
657 they monitor input always when stopped.and auto-input is engaged.
659 Other machines switch to input on stop if the track is record enabled,
660 regardless of the auto input setting (auto input only changes the
661 monitoring state when the transport is rolling)
666 if (!Config->get_tape_machine_mode()) {
668 ADATs work in a strange way..
669 they monitor input always when stopped.and auto-input is engaged.
671 if ((Config->get_monitoring_model() == SoftwareMonitoring)
672 && (_session.config.get_auto_input () || _diskstream->record_enabled())) {
673 send_silence = false;
679 Other machines switch to input on stop if the track is record enabled,
680 regardless of the auto input setting (auto input only changes the
681 monitoring state when the transport is rolling)
683 if ((Config->get_monitoring_model() == SoftwareMonitoring)
684 && _diskstream->record_enabled()) {
685 send_silence = false;