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 "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_ROBOT.hpp"
#include "FAUST_ROLL.hpp"
#include "FAUST_TRANCE.hpp"
#include "FAUST_VOL.hpp"
#include "FrameCalc.hpp"

#include "PDJE_EXPORT_SETTER.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>
    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();
};