Program Listing for File MixMachine.hpp
↰ Return to documentation for file (include/audioRender/MixMachine/MixMachine.hpp
)
#pragma once
#include <unordered_map>
#include <thread>
#include <optional>
#include <sstream>
#include <mutex>
#include "MixTranslator.hpp"
#include "dbRoot.hpp"
#include "EFFECTS.hpp"
#include "Decoder.hpp"
#include "BattleDj.hpp"
#define TRY(CODE)\
try\
{\
CODE\
}\
catch(...)\
{\
return false;\
}
enum InterpolateType{
LINEAR,
COSINE,
CUBIC,
FLAT
};
using ID = long;
struct EightPointValues{
float vals[8] = {0, };
EightPointValues(const std::string& rawData){
std::stringstream sdata(rawData);
std::string token;
int counter = 0;
while(std::getline(sdata, token, ',')){
try
{
vals[counter++] = std::stof(token);
if(counter > 7){
break;
}
}
catch(...)
{
break;
}
}
}
};
#define FLAG_ALL_IS_OK -99
class MixMachine{
private:
// FRAME_POS getMixSize(FRAME_POS frames);
public:
int FLAG_SOMETHING_WRONG_ID = FLAG_ALL_IS_OK; //-99 is ok
std::mutex renderLock;
std::vector<std::thread> renderPool;
std::unordered_map<ID, std::vector<MixStruct>> Memorized;
bool IDsort(const MixTranslator& binary);
bool mix(litedb& db, const BPM& bpms);
std::vector<float> rendered_out;
template<TypeEnum, typename T>
bool TypeWorks(MixStruct& ms, T& data);
template<TypeEnum, typename T>
bool TypeWorks(MixStruct& ms, T& data, litedb& db);
template<TypeEnum, typename T>
bool TypeWorks(MixStruct& ms, T& data, SIMD_FLOAT* Vec);
template<typename FXtype>
bool InterpolateInit(FXtype& FXvec, SIMD_FLOAT*& PCMvec, MixStruct& ms){
FXvec.emplace_back(PCMvec, ms.frame_in, ms.frame_out);
TRY(
FXvec.back().selectInterpolator =
std::stoi(ms.RP.getFirst().cStr());
)
if(FXvec.back().selectInterpolator == InterpolateType::FLAT){
TRY(
FXvec.back().vZero =
std::stof(ms.RP.getSecond().cStr());
)
}
else{
EightPointValues EPV(ms.RP.getSecond().cStr());
FXvec.back().v1 = EPV.vals[0];
FXvec.back().v2 = EPV.vals[1];
FXvec.back().v3 = EPV.vals[2];
FXvec.back().v4 = EPV.vals[3];
FXvec.back().v5 = EPV.vals[4];
FXvec.back().v6 = EPV.vals[5];
FXvec.back().v7 = EPV.vals[6];
FXvec.back().v8 = EPV.vals[7];
}
FXvec.back().frames = ms.frame_out - ms.frame_in;
FXvec.back().timerActive = 0;
return true;
}
MixMachine();
~MixMachine();
};