90 lines
3.0 KiB
C++
90 lines
3.0 KiB
C++
#include "GainPlugin.h"
|
|
#include "PluginEditor.h"
|
|
|
|
namespace
|
|
{
|
|
static const juce::String gainParamTag = "gain_db";
|
|
}
|
|
|
|
GainPlugin::GainPlugin()
|
|
: juce::AudioProcessor(BusesProperties()
|
|
.withInput("Input", juce::AudioChannelSet::stereo(), true)
|
|
.withOutput("Output", juce::AudioChannelSet::stereo(), true)),
|
|
vts(*this, nullptr, juce::Identifier("Parameters"), createParameters())
|
|
{
|
|
gainDBParameter = dynamic_cast<ModulatableFloatParameter *>(vts.getParameter(gainParamTag));
|
|
}
|
|
|
|
juce::AudioProcessorValueTreeState::ParameterLayout GainPlugin::createParameters()
|
|
{
|
|
std::vector<std::unique_ptr<juce::RangedAudioParameter>> params;
|
|
|
|
params.push_back(std::make_unique<ModulatableFloatParameter>(
|
|
gainParamTag, "Gain", juce::NormalisableRange<float>{-30.0f, 30.0f}, 0.0f,
|
|
[](float val) {
|
|
juce::String gainStr = juce::String(val, 2, false);
|
|
return gainStr + " dB";
|
|
},
|
|
[](const juce::String &s) { return s.getFloatValue(); }));
|
|
|
|
return {params.begin(), params.end()};
|
|
}
|
|
|
|
bool GainPlugin::isBusesLayoutSupported(const juce::AudioProcessor::BusesLayout &layouts) const
|
|
{
|
|
// only supports mono and stereo
|
|
if (layouts.getMainOutputChannelSet() != juce::AudioChannelSet::mono() &&
|
|
layouts.getMainOutputChannelSet() != juce::AudioChannelSet::stereo())
|
|
return false;
|
|
|
|
// input and output layout must be the same
|
|
if (layouts.getMainOutputChannelSet() != layouts.getMainInputChannelSet())
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
void GainPlugin::prepareToPlay(double sampleRate, int samplesPerBlock)
|
|
{
|
|
gain.prepare(
|
|
{sampleRate, (juce::uint32)samplesPerBlock, (juce::uint32)getMainBusNumOutputChannels()});
|
|
gain.setRampDurationSeconds(0.05);
|
|
}
|
|
|
|
void GainPlugin::processBlock(juce::AudioBuffer<float> &buffer, juce::MidiBuffer &)
|
|
{
|
|
auto &&block = juce::dsp::AudioBlock<float>{buffer};
|
|
|
|
gain.setGainDecibels(gainDBParameter->getCurrentValue());
|
|
gain.process(juce::dsp::ProcessContextReplacing<float>{block});
|
|
}
|
|
|
|
juce::AudioProcessorEditor *GainPlugin::createEditor() { return new PluginEditor(*this); }
|
|
|
|
juce::String GainPlugin::getPluginTypeString() const
|
|
{
|
|
if (wrapperType == juce::AudioProcessor::wrapperType_Undefined && is_clap)
|
|
return "CLAP";
|
|
|
|
return juce::AudioProcessor::getWrapperTypeDescription(wrapperType);
|
|
}
|
|
|
|
void GainPlugin::getStateInformation(juce::MemoryBlock &data)
|
|
{
|
|
auto state = vts.copyState();
|
|
std::unique_ptr<juce::XmlElement> xml(state.createXml());
|
|
copyXmlToBinary(*xml, data);
|
|
}
|
|
|
|
void GainPlugin::setStateInformation(const void *data, int sizeInBytes)
|
|
{
|
|
std::unique_ptr<juce::XmlElement> xmlState(getXmlFromBinary(data, sizeInBytes));
|
|
|
|
if (xmlState != nullptr)
|
|
if (xmlState->hasTagName(vts.state.getType()))
|
|
vts.replaceState(juce::ValueTree::fromXml(*xmlState));
|
|
}
|
|
|
|
// This creates new instances of the plugin
|
|
juce::AudioProcessor *JUCE_CALLTYPE createPluginFilter() { return new GainPlugin(); }
|