Refactor Effect processing (#7484)
* Move common effect processing code to wrapper method
- Introduce `processImpl` and `sleepImpl` methods, and adapt each effect
plugin to use them
- Use double for RMS out sum in Compressor and LOMM
- Run `checkGate` for GranularPitchShifterEffect
- Minor changes to LadspaEffect
- Remove dynamic allocations and VLAs from VstEffect's process method
- Some minor style/formatting fixes
* Fix VstEffect regression
* GranularPitchShifterEffect should not call `checkGate`
* Apply suggestions from code review
Co-authored-by: saker <sakertooth@gmail.com>
* Follow naming convention for local variables
* Add `MAXIMUM_BUFFER_SIZE` and use it in VstEffect
* Revert "GranularPitchShifterEffect should not call `checkGate`"
This reverts commit 67526f0ffe.
* VstEffect: Simplify setting "Don't Run" state
* Rename `sleepImpl` to `processBypassedImpl`
* Use `MAXIMUM_BUFFER_SIZE` in SetupDialog
* Pass `outSum` as out parameter; Fix LadspaEffect mutex
* Move outSum calculations to wrapper method
* Fix Linux build
* Oops
* Apply suggestions from code review
Co-authored-by: Johannes Lorenz <1042576+JohannesLorenz@users.noreply.github.com>
* Apply suggestions from code review
Co-authored-by: saker <sakertooth@gmail.com>
---------
Co-authored-by: saker <sakertooth@gmail.com>
Co-authored-by: Johannes Lorenz <1042576+JohannesLorenz@users.noreply.github.com>
This commit is contained in:
@@ -50,14 +50,15 @@ class AudioPort;
|
||||
class AudioEngineWorkerThread;
|
||||
|
||||
|
||||
const fpp_t MINIMUM_BUFFER_SIZE = 32;
|
||||
const fpp_t DEFAULT_BUFFER_SIZE = 256;
|
||||
constexpr fpp_t MINIMUM_BUFFER_SIZE = 32;
|
||||
constexpr fpp_t DEFAULT_BUFFER_SIZE = 256;
|
||||
constexpr fpp_t MAXIMUM_BUFFER_SIZE = 4096;
|
||||
|
||||
const int BYTES_PER_SAMPLE = sizeof( sample_t );
|
||||
const int BYTES_PER_INT_SAMPLE = sizeof( int_sample_t );
|
||||
const int BYTES_PER_FRAME = sizeof( SampleFrame );
|
||||
constexpr int BYTES_PER_SAMPLE = sizeof(sample_t);
|
||||
constexpr int BYTES_PER_INT_SAMPLE = sizeof(int_sample_t);
|
||||
constexpr int BYTES_PER_FRAME = sizeof(SampleFrame);
|
||||
|
||||
const float OUTPUT_SAMPLE_MULTIPLIER = 32767.0f;
|
||||
constexpr float OUTPUT_SAMPLE_MULTIPLIER = 32767.0f;
|
||||
|
||||
class LMMS_EXPORT AudioEngine : public QObject
|
||||
{
|
||||
|
||||
@@ -98,6 +98,7 @@ public:
|
||||
m_originalPluginData( originalPluginData )
|
||||
{
|
||||
setName();
|
||||
setDontRun(true);
|
||||
}
|
||||
|
||||
~DummyEffect() override = default;
|
||||
@@ -107,9 +108,9 @@ public:
|
||||
return &m_controls;
|
||||
}
|
||||
|
||||
bool processAudioBuffer( SampleFrame*, const fpp_t ) override
|
||||
ProcessStatus processImpl(SampleFrame*, const fpp_t) override
|
||||
{
|
||||
return false;
|
||||
return ProcessStatus::Sleep;
|
||||
}
|
||||
|
||||
const QDomElement& originalPluginData() const
|
||||
|
||||
@@ -63,9 +63,8 @@ public:
|
||||
return "effect";
|
||||
}
|
||||
|
||||
|
||||
virtual bool processAudioBuffer( SampleFrame* _buf,
|
||||
const fpp_t _frames ) = 0;
|
||||
//! Returns true if audio was processed and should continue being processed
|
||||
bool processAudioBuffer(SampleFrame* buf, const fpp_t frames);
|
||||
|
||||
inline ch_cnt_t processorCount() const
|
||||
{
|
||||
@@ -174,14 +173,29 @@ public:
|
||||
|
||||
|
||||
protected:
|
||||
/**
|
||||
Effects should call this at the end of audio processing
|
||||
enum class ProcessStatus
|
||||
{
|
||||
//! Unconditionally continue processing
|
||||
Continue,
|
||||
|
||||
//! Calculate the RMS out sum and call `checkGate` to determine whether to stop processing
|
||||
ContinueIfNotQuiet,
|
||||
|
||||
//! Do not continue processing
|
||||
Sleep
|
||||
};
|
||||
|
||||
/**
|
||||
* The main audio processing method that runs when plugin is not asleep
|
||||
*/
|
||||
virtual ProcessStatus processImpl(SampleFrame* buf, const fpp_t frames) = 0;
|
||||
|
||||
/**
|
||||
* Optional method that runs when plugin is sleeping (not enabled,
|
||||
* not running, not in the Okay state, or in the Don't Run state)
|
||||
*/
|
||||
virtual void processBypassedImpl() {}
|
||||
|
||||
If the setting "Keep effects running even without input" is disabled,
|
||||
after "decay" ms of a signal below "gate", the effect is turned off
|
||||
and won't be processed again until it receives new audio input
|
||||
*/
|
||||
void checkGate( double _out_sum );
|
||||
|
||||
gui::PluginView* instantiateView( QWidget * ) override;
|
||||
|
||||
@@ -212,6 +226,14 @@ protected:
|
||||
|
||||
|
||||
private:
|
||||
/**
|
||||
If the setting "Keep effects running even without input" is disabled,
|
||||
after "decay" ms of a signal below "gate", the effect is turned off
|
||||
and won't be processed again until it receives new audio input
|
||||
*/
|
||||
void checkGate(double outSum);
|
||||
|
||||
|
||||
EffectChain * m_parent;
|
||||
void resample( int _i, const SampleFrame* _src_buf,
|
||||
sample_rate_t _src_sr,
|
||||
|
||||
Reference in New Issue
Block a user