16template <
typename SampleType>
29 m_initialGainLinear (initialGainLinear),
30 m_gainLinear (initialGainLinear)
34 void prepare (
double , size_t , size_t , size_t )
override {}
38 const size_t numInputChannels = input.getNumChannels();
39 const size_t numOutputChannels = output.getNumChannels();
40 hassert (output.getNumFrames() == input.getNumFrames());
45 const bool hasGainEnvelope = ! envelopeBuffers.empty() &&
contains (envelopeBuffers
, (
int)
Params::gainLinear
);
46 const bool multiplexerMode = numInputChannels != numOutputChannels;
60 processConstantGainAsMultiplexer (input, output);
62 processConstantGainAsMultiChannel (input, output);
71 if (id ==
Params::gainLinear)
79 if (id ==
Params::gainLinear)
88 if (numInputChannels == numOutputChannels)
91 if (numInputChannels == 1)
97 virtual void represent (std::ostream& stream)
const override
99 stream <<
dbPrecision <<
"GainLinear (" << m_initialGainLinear <<
")";
106 return id ==
Params::gainLinear;
112 double m_initialGainLinear;
115 void processConstantGainAsMultiChannel (
const AudioBuffer<SampleType>& input,
AudioBuffer<SampleType>& output)
117 for (size_t channel = 0; channel < input.getNumChannels(); ++channel)
118 for (size_t frame = 0; frame < input.getNumFrames(); ++frame)
119 output[channel][frame] = input[channel][frame] * (SampleType) m_gainLinear;
122 void processConstantGainAsMultiplexer (
const AudioBuffer<SampleType>& input,
AudioBuffer<SampleType>& output)
124 for (size_t channel = 0; channel < output.getNumChannels(); ++channel)
125 for (size_t frame = 0; frame < input.getNumFrames(); ++frame)
126 output[channel][frame] = input[0][frame] * (SampleType) m_gainLinear;
129 void processEnvelopedGainAsMultiChannel (
const AudioBuffer<SampleType>& input,
AudioBuffer<SampleType>& output,
const std::vector<
double>& gainEnvelopeValues)
131 for (size_t channel = 0; channel < input.getNumChannels(); ++channel)
132 for (size_t frame = 0; frame < input.getNumFrames(); ++frame)
133 output[channel][frame] = input[channel][frame] * (SampleType) gainEnvelopeValues[frame];
136 void processEnvelopedGainAsMultiplexer (
const AudioBuffer<SampleType>& input,
AudioBuffer<SampleType>& output,
const std::vector<
double>& gainEnvelopeValues)
138 for (size_t channel = 0; channel < output.getNumChannels(); ++channel)
139 for (size_t frame = 0; frame < input.getNumFrames(); ++frame)
140 output[channel][frame] = input[0][frame] * (SampleType) gainEnvelopeValues[frame];
Applies linear gain (not decibels) to the signal.
virtual bool supportsChannelLayout(size_t numInputChannels, size_t numOutputChannels) const override
void prepare(double, size_t, size_t, size_t) override
Prepare for processing.
double getValue(int id) const override
void process(const AudioBuffer< SampleType > &input, AudioBuffer< SampleType > &output, const EnvelopeBuffers &envelopeBuffers) override
Processes the audio.
virtual void represent(std::ostream &stream) const override
Makes a text representation of this DSP effect for test failure outputs.
void setValue(int id, double value) override
bool supportsEnvelopeFor(int id) const override
void reset() override
Resets to initial state.
GainLinear(double initialGainLinear=1.0)
Constructor.
#define HART_DSP_DEFINE_COPY_AND_MOVE(ClassName)
Defines hart::DSP::copy() and hart::DSP::move() methods.
std::ostream & dbPrecision(std::ostream &stream)
Sets number of decimal places for values in decibels.
static bool contains(const std::unordered_map< KeyType, ValueType > &map, const KeyType &key)
std::unordered_map::contains() replacement for C++11
#define HART_DSP_DECLARE_ALIASES_FOR(ClassName)
#define HART_THROW_OR_RETURN_VOID(ExceptionType, message)
#define hassert(condition)