Program Listing for File EFFECTS.hpp
↰ Return to documentation for file (include/audioRender/MixMachine/EFFECT/EFFECTS.hpp
)
#pragma once
#include <thread>
#include "DeckData.hpp"
#include "FrameCalc.hpp"
#include "FAUST_COMPRESSOR.hpp"
#include "FAUST_DISTORTION.hpp"
#include "FAUST_ECHO.hpp"
#include "FAUST_EQ.hpp"
#include "FAUST_FILTERS.hpp"
#include "FAUST_FLANGER.hpp"
#include "FAUST_OCS_FILTER.hpp"
#include "FAUST_PANNER.hpp"
#include "FAUST_PHASER.hpp"
#include "FAUST_ROLL.hpp"
#include "FAUST_TRANCE.hpp"
#include "FAUST_VOL.hpp"
#include "FAUST_ROBOT.hpp"
template<typename Fclass>
class FaustDType : public Fclass{
private:
std::vector<float> L;
std::vector<float> R;
SIMD_FLOAT* originVec;
unsigned long long startPos;
public:
int count;
FAUSTFLOAT* PTR[CHANNEL];
FaustDType(
SIMD_FLOAT* vec,
unsigned long long start,
unsigned long long end):
startPos(start),
originVec(vec)
{
count = end - start;
L.resize(count);
R.resize(count);
PTR[0] = L.data();
PTR[1] = R.data();
}
void CopyToFaust(){
float* lp = L.data();
float* rp = R.data();
float* op = originVec->data();
op += startPos * CHANNEL;
for(int i=0; i<count; ++i){
*(lp++) = *(op++);
*(rp++) = *(op++);
}
}
void WriteToOrigin()
{
float* lp = L.data();
float* rp = R.data();
float* op = originVec->data();
op+= startPos * CHANNEL;
for(int i=0; i<count; ++i){
*(op++) = *(lp++);
*(op++) = *(rp++);
}
}
};
template<typename FaustClass>
class FaustObject{
public:
FaustClass managingClass;
template<typename FClass>
// __attribute__((optimize("O2")))
void consume(std::vector<FaustDType<FClass>>& jobs)
{
for(auto& i : jobs){
i.CopyToFaust();
i.template copySetting<FClass>(managingClass);
managingClass.instanceClear();
managingClass.compute(i.count, i.PTR, i.PTR);
i.WriteToOrigin();
}
}
};
class FaustEffects {
public:
FaustObject<CompressorFAUST>compressor;
FaustObject<DistortionFAUST>distortion;
FaustObject<EchoFAUST> echo;
FaustObject<EQFAUST> eq;
FaustObject<FilterFAUST> filter;
FaustObject<FlangerFAUST> flanger;
FaustObject<OcsFilterFAUST> ocsFilter;
FaustObject<PannerFAUST> panner;
FaustObject<PhaserFAUST> phaser;
FaustObject<RollFAUST> roll;
FaustObject<TranceFAUST> trance;
FaustObject<VolFAUST> vol;
FaustObject<RobotFAUST> robot;
// public:
std::vector<FaustDType<Compressor_PDJE>> compressorData;
std::vector<FaustDType<FaustInterpolate>> distortionData;
std::vector<FaustDType<Echo_PDJE>> echoData;
std::vector<FaustDType<EQ_PDJE>> eqData;
std::vector<FaustDType<Filter_PDJE>> filterData;
std::vector<FaustDType<Flanger_PDJE>> flangerData;
std::vector<FaustDType<OcsFilter_PDJE>> ocsFilterData;
std::vector<FaustDType<Panner_PDJE>> pannerData;
std::vector<FaustDType<Phaser_PDJE>> phaserData;
std::vector<FaustDType<Roll_PDJE>> rollData;
std::vector<FaustDType<Trance_PDJE>> tranceData;
std::vector<FaustDType<FaustInterpolate>> volData;
std::vector<FaustDType<Robot_PDJE>> robotData;
FaustEffects(int initSampleRate);
void consumeAll();
};