From bda0f938fbf640ad60b6f1d3bc7ed18bcb2a0c2b Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 26 Dec 2011 15:37:14 +0000 Subject: [PATCH] Tidy up monitoring slightly so that it matches oofus' truth table for the various different states. Should fix #4533. git-svn-id: svn://localhost/ardour2/branches/3.0@11073 d708f5d6-7413-0410-9779-e7cbd77b26cf --- doc/monitor_modes.pdf | Bin 0 -> 18019 bytes libs/ardour/ardour/midi_track.h | 3 - libs/ardour/ardour/route.h | 4 +- libs/ardour/ardour/track.h | 6 +- libs/ardour/ardour/types.h | 5 ++ libs/ardour/midi_track.cc | 12 --- libs/ardour/route.cc | 51 ++++++----- libs/ardour/track.cc | 144 ++++++++++++-------------------- 8 files changed, 94 insertions(+), 131 deletions(-) create mode 100644 doc/monitor_modes.pdf diff --git a/doc/monitor_modes.pdf b/doc/monitor_modes.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d4c423258015f31680be1f7603c9d4b1a5a664e3 GIT binary patch literal 18019 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 ht;sEA#yv^nM93E*=I629G;JSxvdZb?>ME>@ _amp; diff --git a/libs/ardour/ardour/track.h b/libs/ardour/ardour/track.h index 8f68f63d05..08bf170985 100644 --- a/libs/ardour/ardour/track.h +++ b/libs/ardour/ardour/track.h @@ -50,9 +50,11 @@ class Track : public Route, public PublicDiskstream virtual void set_monitoring (MonitorChoice); MonitorChoice monitoring_choice() const { return _monitoring; } - MonitorState monitoring_state(); + MonitorState monitoring_state () const; PBD::Signal0 MonitoringChanged; + MeterState metering_state () const; + virtual int no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool state_changing); @@ -213,8 +215,6 @@ class Track : public Route, public PublicDiskstream void maybe_declick (BufferSet&, framecnt_t, int); - virtual bool send_silence () const; - boost::shared_ptr _rec_enable_control; framecnt_t check_initial_delay (framecnt_t nframes, framecnt_t&); diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index ef2e51e70f..7d5c5626e3 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -371,6 +371,11 @@ namespace ARDOUR { MonitoringDisk = 0x4, }; + enum MeterState { + MeteringInput, ///< meter the input IO, regardless of what is going through the route + MeteringRoute ///< meter what is going through the route + }; + enum PFLPosition { /** PFL signals come from before pre-fader processors */ PFLFromBeforeProcessors, diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index 6048cb7e16..f5743f4992 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -652,18 +652,6 @@ MidiTrack::diskstream_data_recorded (boost::weak_ptr src) DataRecorded (src); /* EMIT SIGNAL */ } -bool -MidiTrack::ardour_should_monitor () const -{ - return true; -} - -bool -MidiTrack::send_silence () const -{ - return false; -} - bool MidiTrack::input_active () const { diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 10806767d3..18ee909689 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -400,8 +400,6 @@ Route::process_output_buffers (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, int declick, bool gain_automation_ok) { - bool monitor = ardour_should_monitor (); - bufs.set_is_silent (false); /* figure out if we're going to use gain automation */ @@ -411,8 +409,11 @@ Route::process_output_buffers (BufferSet& bufs, _amp->apply_gain_automation (false); } - /* tell main outs what to do about monitoring */ - _main_outs->no_outs_cuz_we_no_monitor (!monitor); + /* Tell main outs what to do about monitoring. We do this so that + on a transition between monitoring states we get a de-clicking gain + change in the _main_outs delivery. + */ + _main_outs->no_outs_cuz_we_no_monitor (monitoring_state () == MonitoringSilence); /* ------------------------------------------------------------------------------------------- @@ -478,12 +479,20 @@ Route::process_output_buffers (BufferSet& bufs, and go .... ----------------------------------------------------------------------------------------- */ + /* set this to be true if the meter will already have been ::run() earlier */ + bool const meter_already_run = metering_state() == MeteringInput; + for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { if (boost::dynamic_pointer_cast (*i)) { break; } + if (boost::dynamic_pointer_cast (*i) && meter_already_run) { + /* don't ::run() the meter, otherwise it will have its previous peak corrupted */ + continue; + } + #ifndef NDEBUG /* if it has any inputs, make sure they match */ if ((*i)->input_streams() != ChanCount::ZERO) { @@ -3846,22 +3855,6 @@ Route::setup_invisible_processors () } } -/** @return true if Ardour should provide monitoring for this route */ -bool -Route::ardour_should_monitor () const -{ - switch (Config->get_monitoring_model()) { - case HardwareMonitoring: - case ExternalMonitoring: - return !record_enabled() || (_session.config.get_auto_input() && !_session.actively_recording()); - break; - default: - break; - } - - return true; -} - void Route::unpan () { @@ -3919,3 +3912,21 @@ Route::processor_by_id (PBD::ID id) const return boost::shared_ptr (); } + +/** @return the monitoring state, or in other words what data we are pushing + * into the route (data from the inputs, data from disk or silence) + */ +MonitorState +Route::monitoring_state () const +{ + return MonitoringInput; +} + +/** @return what we should be metering; either the data coming from the input + * IO or the data that is flowing through the route. + */ +MeterState +Route::metering_state () const +{ + return MeteringRoute; +} diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index fa19c3ddcc..7d1f7930a6 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -375,25 +375,25 @@ Track::no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, */ be_silent = true; } else { - be_silent = send_silence (); + 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. + */ + be_silent = (s == MonitoringSilence || s == MonitoringDisk); + } + + if (!_have_internal_generator && metering_state() == MeteringInput) { + _input->process_input (_meter, start_frame, end_frame, nframes); } _amp->apply_gain_automation(false); + /* if have_internal_generator, or .. */ + //_input->process_input (_meter, start_frame, end_frame, nframes); + if (be_silent) { - /* if we're sending silence, but we want the meters to show levels for the signal, - meter right here. - */ - - if (_have_internal_generator) { - passthru_silence (start_frame, end_frame, nframes, 0); - } else { - if (_meter_point == MeterInput) { - _input->process_input (_meter, start_frame, end_frame, nframes); - } - passthru_silence (start_frame, end_frame, nframes, 0); - } + passthru_silence (start_frame, end_frame, nframes, 0); } else { @@ -774,101 +774,57 @@ Track::adjust_capture_buffering () } } -bool -Track::send_silence () const -{ - bool send_silence; - - if (Config->get_tape_machine_mode()) { - - /* ADATs work in a strange way.. - they monitor input always when stopped.and auto-input is engaged. - */ - - if ((Config->get_monitoring_model() == SoftwareMonitoring) - && ((_monitoring & MonitorInput) || (_diskstream->record_enabled()))) { - send_silence = false; - } else { - send_silence = true; - } - - - } else { - - /* Other machines switch to input on stop if the track is record enabled, - regardless of the auto input setting (auto input only changes the - monitoring state when the transport is rolling) - */ - - if ((Config->get_monitoring_model() == SoftwareMonitoring) - && ((_monitoring & MonitorInput) || - (!(_monitoring & MonitorDisk) && (_session.config.get_auto_input () || _diskstream->record_enabled())))){ - - DEBUG_TRACE (DEBUG::Monitor, - string_compose ("%1: no roll, use silence = FALSE, monitoring choice %2 recenable %3 sRA %4 autoinput %5\n", - name(), enum_2_string (_monitoring), - _diskstream->record_enabled(), _session.actively_recording(), - _session.config.get_auto_input())); - - send_silence = false; - } else { - DEBUG_TRACE (DEBUG::Monitor, - string_compose ("%1: no roll, use silence = TRUE, monitoring choice %2 recenable %3 sRA %4 autoinput %5\n", - name(), enum_2_string (_monitoring), - _diskstream->record_enabled(), _session.actively_recording(), - _session.config.get_auto_input())); - send_silence = true; - } - } - - return send_silence; -} - MonitorState -Track::monitoring_state () +Track::monitoring_state () const { - MonitorState ms = MonitoringSilence; - - if (_session.transport_rolling()) { + /* Explicit requests */ + + if (_monitoring & MonitorInput) { + return MonitoringInput; + } - /* roll case */ - - if (_monitoring & MonitorInput) { // explicitly requested input monitoring - - ms = MonitoringInput; + if (_monitoring & MonitorDisk) { + return MonitoringDisk; + } - } else if (_monitoring & MonitorDisk) { // explicitly requested disk monitoring - - ms = MonitoringDisk; + /* This is an implementation of the truth table in doc/monitor_modes.pdf; + I don't think it's ever going to be too pretty too look at. + */ - } else if (_diskstream->record_enabled() && _session.actively_recording()) { // Track actually recording - - ms = MonitoringInput; + bool const roll = _session.transport_rolling (); + bool const track_rec = _diskstream->record_enabled (); + bool const session_rec = _session.get_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 (); - } else if (_diskstream->record_enabled() && !_session.actively_recording() && _session.config.get_auto_input()) { // Track armed but not recording, with auto input enabled - - ms = MonitoringInput; - - } else { // Every other state - - ms = MonitoringDisk; + if (track_rec) { + if (!session_rec && roll && auto_input) { + return MonitoringDisk; + } else { + return software_monitor ? MonitoringInput : MonitoringSilence; } } else { - /* no-roll case */ + if (tape_machine_mode) { + + return MonitoringDisk; - if (send_silence()) { - - ms = MonitoringSilence; } else { + + if (!roll && auto_input) { + return software_monitor ? MonitoringInput : MonitoringSilence; + } else { + return MonitoringDisk; + } - ms = MonitoringInput; } } - return ms; + /* NOTREACHED */ + return MonitoringSilence; } void @@ -954,4 +910,8 @@ Track::parameter_changed (string p) } } - +MeterState +Track::metering_state () const +{ + return _diskstream->record_enabled() ? MeteringInput : MeteringRoute; +}