Tidy up FluidGain

nix
Owen Green 7 years ago
parent b5aab8dca5
commit 0ae62c4503

@ -1,4 +1,3 @@
// FD_BufNMF, an NRT buffer NMF Processor
// A tool from the FluCoMa project, funded by the European Research Council (ERC) under the European Unions Horizon 2020 research and innovation programme (grant agreement No 725899)
#include "SC_PlugIn.hpp"
@ -7,98 +6,55 @@
#include "clients/common/FluidParams.hpp"
//Using statements for fluidtensor
using fluid::FluidTensor;
using fluid::FluidTensorView;
using fluid::audio::GainAudioClient;
static InterfaceTable *ft;
using client_type = GainAudioClient<double, float>;
using signal_type = client_type::signal_type;
using audio_signal= client_type::audio_signal;
using scalar_signal = client_type::scalar_signal;
class FDGain: public SCUnit
{
using AudioClient = fluid::audio::GainAudioClient<double, float>;
using ClientPointer = std::unique_ptr<AudioClient>;
using SignalWrapper = AudioClient::Signal;
using AudioSignal= AudioClient::AudioSignal;
using ControlSignal = AudioClient::ScalarSignal;
using SignalPointer = std::unique_ptr<SignalWrapper>;
template <size_t N>
using SignalArray = std::array<SignalPointer, N>;
public:
FDGain()
{
//Same calc function, all day, every day
//Get the chunk size, as we need that set buffers
const float chunk_size = in0(1);
//Oh NO! Heap allocation! Make client object
// if(chunk_size)
m_client = new client_type(65536);
// else
// m_client = new client_type(1024,1024);
fluid::parameter::lookupParam("winsize", m_client->getParams()).setLong(in0(1));
fluid::parameter::lookupParam("hopsize", m_client->getParams()).setLong(in0(1));
fluid::parameter::lookupParam("gain", m_client->getParams()).setFloat(1);
m_client->set_host_buffer_size(bufferSize());
m_client->reset();
//Work out what signals we need. For now keep it simple:
//in 0 => only audio
//out 0 => only audio
//in 1 => a or k
input_signals[0] = new audio_signal();
output_signals[0] = new audio_signal();
if(isAudioRateIn(2))
input_signals[1] = new audio_signal();
else
input_signals[1] = new scalar_signal();
// set_calc_function<FDGain,&FDGain::next>();
mCalcFunc = make_calc_function<FDGain,&FDGain::next>();
//
Unit* unit = this;
ClearUnitOutputs(unit,1);
}
FDGain()
{
mClient = ClientPointer(new AudioClient(65536));
mClient->set_host_buffer_size(bufferSize());
mClient->reset();
~FDGain()
{
delete input_signals[0];
delete input_signals[1];
delete output_signals[0];
delete m_client;
}
inputSignals[0] = SignalPointer(new AudioSignal());
outputSignals[0] = SignalPointer(new AudioSignal());
private:
if(isAudioRateIn(2))
inputSignals[1] = SignalPointer(new AudioSignal());
else
inputSignals[1] = SignalPointer(new ControlSignal());
mCalcFunc = make_calc_function<FDGain,&FDGain::next>();
Unit* unit = this;
ClearUnitOutputs(unit,1);
}
~FDGain() {}
private:
void next(int numsamples)
{
//TODO: Remove const_cast code smell by making input_signal type for const
inputSignals[0]->set(const_cast<float*>(in(0)), in0(0));
inputSignals[1]->set(const_cast<float*>(in(2)), in0(2));
outputSignals[0]->set(out(0), out0(0));
mClient->do_process(inputSignals.begin(),inputSignals.end(),outputSignals.begin(),outputSignals.end(),numsamples,2,1);
}
void next(int numsamples)
{
//TODO: Remove const_cast code smell by making input_signal type for const
input_signals[0]->set(const_cast<float*>(in(0)), in0(0));
input_signals[1]->set(const_cast<float*>(in(2)), in0(2));
output_signals[0]->set(out(0), out0(0));
m_client->do_process(std::begin(input_signals),std::end(input_signals),std::begin(output_signals),std::end(output_signals),numsamples,2,1);
}
client_type* m_client;
signal_type* input_signals[2];
signal_type* output_signals[1];
ClientPointer mClient;
SignalArray<2> inputSignals;
SignalArray<1> outputSignals;
};
PluginLoad(BoringMixer2UGens) {
ft = inTable;
registerUnit<FDGain>(ft, "FluidGain");
ft = inTable;
registerUnit<FDGain>(ft, "FluidGain");
}

Loading…
Cancel
Save