Program Listing for File MixMachine.cpp

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

#include "MixMachine.hpp"
#include "MixMachine-inl.h"
#include "PDJE_LOG_SETTER.hpp"

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 (std::exception &e) {
        critlog("failed to sort memorized datas. From MixMachine IDsort. "
                "logException: ");
        critlog(e.what());
        return false;
    }
}

HWY_EXPORT(INTEGRATE_PCM_SIMD);

bool
MixMachine::mix(litedb &db, const BPM &bpms)
{
    auto                                      num_threads = Memorized.size();
    std::vector<std::unique_ptr<std::thread>> renderPool;
    // renderPool.clear();
    renderPool.reserve(num_threads);
    for (auto &i : Memorized) {
        renderPool.emplace_back(
            std::make_unique<std::thread>([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);
                if (!result.has_value()) {
                    FLAG_SOMETHING_WRONG_ID = i.first;
                    critlog(
                        "result has no value. From MixMachine mix. ErrID: ");
                    std::string logTemp = std::to_string(i.first);
                    critlog(logTemp);
                    return;
                }
                FX->consumeAll();

                HWY_DYNAMIC_DISPATCH(INTEGRATE_PCM_SIMD)(
                    tempVec, renderLock, rendered_out, MC);
                delete MC;
                delete DJ;
                delete FX;
            }));
    }
    for (auto &pool : renderPool) {
        pool->join();
    }
    if (FLAG_SOMETHING_WRONG_ID != FLAG_ALL_IS_OK) {
        critlog("mix failed because something is broken. From MixMachine mix");
        return false;
    }
    return true;
}

MixMachine::~MixMachine()
{
}