1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*!********************************************************************
Audacity: A Digital Audio Editor
DownwardMeterValueProvider.h
Matthieu Hodgkinson
**********************************************************************/
#pragma once
#include "DynamicRangeProcessorTypes.h"
#include "MeterValueProvider.h"
#include <memory>
#include <utility>
#include <vector>
class DYNAMIC_RANGE_PROCESSOR_API DownwardMeterValueProvider :
public MeterValueProvider
{
public:
DownwardMeterValueProvider(float upperValue = 0.f);
~DownwardMeterValueProvider() = default;
void Update(float value, bool alsoFiveSecondMax) override;
float GetGlobalMax() const override;
float GetFiveSecMax() const override;
float GetCurrentMax() const override;
Direction GetDirection() const override;
bool IsInvisible() const override;
private:
//! The display tends to be earlier than the audio playback. We delay the
//! former by (approximately) this amount, for a tighter audiovisual
//! experience.
static constexpr auto displayDelayMs = 100;
static constexpr auto ringBufferLength =
displayDelayMs / compressorMeterUpdatePeriodMs;
const float mUpperValue;
float mGlobalMin;
float mCurrentMin;
float mFiveSecMinState;
std::vector<std::pair<int /*tick count*/, float>> mLastFiveSeconds;
std::array<float, ringBufferLength> mRingBuffer;
size_t mRingBufferIndex = 0;
int mTimerCount = 0;
};
|