|
|
@@ -403,28 +403,45 @@ public: |
|
|
|
void playTestSound();
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Turns on level-measuring for input channels.
|
|
|
|
@see getCurrentInputLevel()
|
|
|
|
*/
|
|
|
|
void enableInputLevelMeasurement (bool enableMeasurement) noexcept;
|
|
|
|
/**
|
|
|
|
A simple reference-counted struct that holds a level-meter value that can be read
|
|
|
|
using getCurrentLevel().
|
|
|
|
|
|
|
|
This is used to ensure that the level processing code is only executed when something
|
|
|
|
holds a reference to one of these objects and will be bypassed otherwise.
|
|
|
|
|
|
|
|
/** Turns on level-measuring for output channels.
|
|
|
|
@see getCurrentOutputLevel()
|
|
|
|
@see getInputLevelGetter, getOutputLevelGetter
|
|
|
|
*/
|
|
|
|
void enableOutputLevelMeasurement (bool enableMeasurement) noexcept;
|
|
|
|
struct LevelMeter : public ReferenceCountedObject
|
|
|
|
{
|
|
|
|
typedef ReferenceCountedObjectPtr<LevelMeter> Ptr;
|
|
|
|
|
|
|
|
LevelMeter() noexcept;
|
|
|
|
|
|
|
|
double getCurrentLevel() const noexcept;
|
|
|
|
|
|
|
|
private:
|
|
|
|
friend class AudioDeviceManager;
|
|
|
|
|
|
|
|
Atomic<float> level { 0 };
|
|
|
|
void updateLevel (const float* const*, int numChannels, int numSamples) noexcept;
|
|
|
|
};
|
|
|
|
|
|
|
|
/** Returns a reference-counted object that can be used to get the current input level.
|
|
|
|
|
|
|
|
/** Returns the current input level.
|
|
|
|
To use this, you must first enable it by calling enableInputLevelMeasurement().
|
|
|
|
@see enableInputLevelMeasurement()
|
|
|
|
You need to store this object locally to ensure that the reference count is incremented
|
|
|
|
and decremented properly. The current input level value can be read using getCurrentLevel().
|
|
|
|
*/
|
|
|
|
double getCurrentInputLevel() const noexcept;
|
|
|
|
LevelMeter::Ptr getInputLevelGetter() noexcept { return inputLevelGetter; }
|
|
|
|
|
|
|
|
/** Returns a reference-counted object that can be used to get the current input level.
|
|
|
|
|
|
|
|
/** Returns the current output level.
|
|
|
|
To use this, you must first enable it by calling enableOutputLevelMeasurement().
|
|
|
|
@see enableOutputLevelMeasurement()
|
|
|
|
You need to store this object locally to ensure that the reference count is incremented
|
|
|
|
and decremented properly. The current input level value can be read using getCurrentLevel().
|
|
|
|
*/
|
|
|
|
double getCurrentOutputLevel() const noexcept;
|
|
|
|
LevelMeter::Ptr getOutputLevelGetter() noexcept { return outputLevelGetter; }
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
/** Returns the a lock that can be used to synchronise access to the audio callback.
|
|
|
|
Obviously while this is locked, you're blocking the audio thread from running, so
|
|
|
|
it must only be used for very brief periods when absolutely necessary.
|
|
|
@@ -481,18 +498,8 @@ private: |
|
|
|
double cpuUsageMs = 0, timeToCpuScale = 0, msPerBlock = 0;
|
|
|
|
int xruns = 0;
|
|
|
|
|
|
|
|
struct LevelMeter
|
|
|
|
{
|
|
|
|
LevelMeter() noexcept;
|
|
|
|
void updateLevel (const float* const*, int numChannels, int numSamples) noexcept;
|
|
|
|
void setEnabled (bool) noexcept;
|
|
|
|
double getCurrentLevel() const noexcept;
|
|
|
|
|
|
|
|
Atomic<int> enabled;
|
|
|
|
Atomic<float> level;
|
|
|
|
};
|
|
|
|
|
|
|
|
LevelMeter inputLevelMeter, outputLevelMeter;
|
|
|
|
LevelMeter::Ptr inputLevelGetter { new LevelMeter() },
|
|
|
|
outputLevelGetter { new LevelMeter() };
|
|
|
|
|
|
|
|
//==============================================================================
|
|
|
|
class CallbackHandler;
|
|
|
|