-void
-Track::set_latency_compensation (framecnt_t longest_session_latency)
-{
- Route::set_latency_compensation (longest_session_latency);
- _disk_reader->set_roll_delay (_roll_delay);
-}
-
-int
-Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool session_state_changing)
-{
- Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
-
- if (!lm.locked()) {
- return 0;
- }
-
- bool can_record = _session.actively_recording ();
-
- /* no outputs? nothing to do ... what happens if we have sends etc. ? */
-
- if (n_outputs().n_total() == 0 && !ARDOUR::Profile->get_mixbus()) {
- //Note: Mixbus has its own output mechanism, so we should operate even if no explicit outputs are assigned
- return 0;
- }
-
- /* not active ... do the minimum possible by just outputting silence */
-
- if (!_active) {
- silence (nframes);
- if (_meter_point == MeterInput && ((_monitoring_control->monitoring_choice() & MonitorInput) || _disk_writer->record_enabled())) {
- _meter->reset();
- }
- return 0;
- }
-
- if (session_state_changing) {
- if (_session.transport_speed() != 0.0f) {
- /* we're rolling but some state is changing (e.g. our
- disk reader contents) so we cannot use them. Be
- silent till this is over. Don't declick.
-
- XXX note the absurdity of ::no_roll() being called when we ARE rolling!
- */
- passthru_silence (start_frame, end_frame, nframes, 0);
- return 0;
- }
- /* we're really not rolling, so we're either delivery silence or actually
- monitoring, both of which are safe to do while session_state_changing is true.
- */
- }
-
- _disk_writer->check_record_status (start_frame, can_record);
-
- bool be_silent;
-
- MonitorState const s = monitoring_state ();
- /* we are not rolling, so be silent even if we are monitoring disk, as there
- will be no disk data coming in.
- */
- switch (s) {
- case MonitoringSilence:
- be_silent = true;
- break;
- case MonitoringDisk:
- be_silent = true;
- break;
- case MonitoringInput:
- be_silent = false;
- break;
- default:
- be_silent = false;
- break;
- }
-
- //if we have an internal generator, let it play regardless of monitoring state
- if (_have_internal_generator) {
- be_silent = false;
- }
-
- _amp->apply_gain_automation (false);
-
- /* if have_internal_generator, or .. */
-
- if (be_silent) {
-
- if (_meter_point == MeterInput) {
- /* still need input monitoring and metering */
-
- bool const track_rec = _disk_writer->record_enabled ();
- bool const auto_input = _session.config.get_auto_input ();
- bool const software_monitor = Config->get_monitoring_model() == SoftwareMonitoring;
- bool const tape_machine_mode = Config->get_tape_machine_mode ();
- bool no_meter = false;
-
- /* this needs a proper K-map
- * and should be separated into a function similar to monitoring_state()
- * that also handles roll() states in audio_track.cc, midi_track.cc and route.cc
- *
- * see http://www.oofus.co.uk/ardour/Ardour3MonitorModesV3.pdf
- */
- if (!auto_input && !track_rec) {
- no_meter=true;
- }
- else if (tape_machine_mode && !track_rec && auto_input) {
- no_meter=true;
- }
- else if (!software_monitor && tape_machine_mode && !track_rec) {
- no_meter=true;
- }
- else if (!software_monitor && !tape_machine_mode && !track_rec && !auto_input) {
- no_meter=true;
- }
-
- if (no_meter) {
- BufferSet& bufs (_session.get_silent_buffers (n_process_buffers()));
- _meter->run (bufs, start_frame, end_frame, 1.0, nframes, true);
- _input->process_input (boost::shared_ptr<Processor>(), start_frame, end_frame, _session.transport_speed(), nframes);
- } else {
- _input->process_input (_meter, start_frame, end_frame, _session.transport_speed(), nframes);
- }
- }
-
- passthru_silence (start_frame, end_frame, nframes, 0);
-
- } else {
-
- BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
-
- fill_buffers_with_input (bufs, _input, nframes);
-
- if (_meter_point == MeterInput) {
- _meter->run (bufs, start_frame, end_frame, _session.transport_speed(), nframes, true);
- }
-
- passthru (bufs, start_frame, end_frame, nframes, false);
- }
-
- flush_processor_buffers_locked (nframes);
-
- return 0;
-}
-
-int
-Track::silent_roll (pframes_t nframes, framepos_t /*start_frame*/, framepos_t /*end_frame*/, bool& need_butler)
-{
- Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK);
- if (!lm.locked()) {
- // XXX DISK reader needs to seek ahead the correct distance ?? OR DOES IT ?
- //framecnt_t playback_distance = _disk_reader->calculate_playback_distance(nframes);
- //if (can_internal_playback_seek(playback_distance)) {
- // internal_playback_seek(playback_distance);
- //}
- return 0;
- }
-
- if (n_outputs().n_total() == 0 && _processors.empty()) {
- return 0;
- }
-
- if (!_active) {
- silence (nframes);
- return 0;
- }
-
- _silent = true;
- _amp->apply_gain_automation(false);
-
- silence (nframes);
- flush_processor_buffers_locked (nframes);
-
- //BufferSet& bufs (_session.get_route_buffers (n_process_buffers(), true));
- // XXXX DISKWRITER/READER ADVANCE, SET need_butler
- return 0;
-}
-