Program Listing for File MixMachine.cpp

Return to documentation for file (include/audioRender/MixMachine/MixMachine.cpp)

#include "MixMachine.hpp"

#include "MixMachine-inl.h"

MixMachine::MixMachine()
{
}



bool
MixMachine::IDsort(const MixTranslator& tr)
{
    try
    {
        for(auto i : tr.mixs.value().mixVec){
            long id = i.RP.getId();

            if(Memorized.find(id) == Memorized.end()){
                Memorized[id] = std::vector<MixStruct>();
            }
            Memorized[id].push_back(i);
        }

        return true;
    }
    catch(...)
    {

        return false;
    }
}


HWY_EXPORT(INTEGRATE_PCM_SIMD);

bool
MixMachine::mix(litedb& db, const BPM& bpms)
{
    auto num_threads = Memorized.size();
    for(auto& i: Memorized){
        renderPool.emplace_back([i, this, &db, &bpms](){

            auto MC = new MUSIC_CTR();
            auto DJ = new BattleDj();
            auto FX = new FaustEffects(SAMPLERATE);

            SIMD_FLOAT tempVec;
            DJ->GetDataFrom(*MC);
            for(auto j : i.second){
                switch (j.RP.getType()){

                case TypeEnum::BATTLE_DJ:
                    if(TypeWorks<TypeEnum::BATTLE_DJ>(j, *DJ)) break;
                    else continue;

                case TypeEnum::LOAD:
                    if(TypeWorks<TypeEnum::LOAD>(j, *MC, db)
                        && TypeWorks<TypeEnum::LOAD>(j, *DJ)) break;
                    else continue;

                case TypeEnum::CONTROL:
                    if(TypeWorks<TypeEnum::CONTROL>(j, *MC)) break;
                    else continue;

                case TypeEnum::UNLOAD:
                    if(TypeWorks<TypeEnum::UNLOAD>(j, *MC)) break;
                    else continue;

                case TypeEnum::EQ:
                    if(TypeWorks<TypeEnum::EQ>(j, *FX, &tempVec)) break;
                    else continue;

                case TypeEnum::COMPRESSOR:
                    if(TypeWorks<TypeEnum::COMPRESSOR>(j, *FX, &tempVec)) break;
                    else continue;

                case TypeEnum::FILTER:
                    if(TypeWorks<TypeEnum::FILTER>(j, *FX, &tempVec)) break;
                    else continue;

                case TypeEnum::DISTORTION:
                    if(TypeWorks<TypeEnum::DISTORTION>(j, *FX, &tempVec)) break;
                    else continue;

                case TypeEnum::ECHO:
                    if(TypeWorks<TypeEnum::ECHO>(j, *FX, &tempVec)) break;
                    else continue;

                case TypeEnum::FLANGER:
                    if(TypeWorks<TypeEnum::FLANGER>(j, *FX, &tempVec)) break;
                    else continue;

                case TypeEnum::OSC_FILTER:
                    if(TypeWorks<TypeEnum::OSC_FILTER>(j, *FX, &tempVec)) break;
                    else continue;

                case TypeEnum::PANNER:
                    if(TypeWorks<TypeEnum::PANNER>(j, *FX, &tempVec)) break;
                    else continue;

                case TypeEnum::PHASER:
                    if(TypeWorks<TypeEnum::PHASER>(j, *FX, &tempVec)) break;
                    else continue;

                case TypeEnum::ROLL:
                    if(TypeWorks<TypeEnum::ROLL>(j, *FX, &tempVec)) break;
                    else continue;

                case TypeEnum::TRANCE:
                    if(TypeWorks<TypeEnum::TRANCE>(j, *FX, &tempVec)) break;
                    else continue;

                case TypeEnum::ROBOT:
                    if(TypeWorks<TypeEnum::ROBOT>(j, *FX, &tempVec)) break;
                    else continue;

                case TypeEnum::VOL:
                    if(TypeWorks<TypeEnum::VOL>(j, *FX, &tempVec)) break;
                    else continue;

                default:
                    break;
                }
            }

            auto result = (*DJ) << MC->Execute(bpms, &tempVec, db.getRoot());
            if(!result.has_value()){
                FLAG_SOMETHING_WRONG_ID = i.first;
                return;
            }
            FX->consumeAll();

            HWY_DYNAMIC_DISPATCH(INTEGRATE_PCM_SIMD)(
                tempVec,
                renderLock,
                rendered_out,
                MC
            );

            // const hn::ScalableTag<float> hwyFTag;
            // auto laneSize = hn::Lanes(hwyFTag);
            // auto times = tempVec.size() / laneSize;
            // auto remained = tempVec.size() % laneSize;

            // auto Tptr = tempVec.data();
            // {
            //     std::lock_guard<std::mutex> locks(renderLock);
            //     if(rendered_out.size() < (MC->QDatas.pos.back().Gidx * CHANNEL)){
            //         rendered_out.resize((MC->QDatas.pos.back().Gidx * CHANNEL));
            //     }
            //     auto Rptr = rendered_out.data() + (MC->QDatas.pos.front().Gidx * CHANNEL);

            //     for(size_t L = 0; L < times; ++L){
            //         auto Tsimd = hn::Load(hwyFTag, Tptr);
            //         auto Rsimd = hn::LoadU(hwyFTag, Rptr);
            //         hn::StoreU(Rsimd + Tsimd, hwyFTag, Rptr);
            //         Tptr += laneSize;
            //         Rptr += laneSize;
            //     }
            //     for(size_t REM = 0; REM < remained; ++REM){
            //         (*(Rptr++)) += (*(Tptr++));
            //     }
            // }
            delete MC;
            delete DJ;
            delete FX;
        });
    }
    for(auto& pool: renderPool){
        pool.join();
    }
    if(FLAG_SOMETHING_WRONG_ID != FLAG_ALL_IS_OK){
        return false;
    }
    return true;
}

MixMachine::~MixMachine()
{

}