Program Listing for File PDJE_interface.cpp

Return to documentation for file (include/interface/PDJE_interface.cpp)

#include "PDJE_interface.hpp"
#include "PDJE_LOG_SETTER.hpp"
PDJE::PDJE(const DONT_SANITIZE &rootPath)
{
    startlog();
    DBROOT = std::make_shared<litedb>();
    DBROOT->openDB(rootPath);
}

TRACK_VEC
PDJE::SearchTrack(const UNSANITIZED &Title)
{
    trackdata td;
    auto      safeTitle = PDJE_Name_Sanitizer::sanitizeFileName(Title);
    if (!safeTitle) {
        critlog("failed to make sanitized filename in PDJE SearchTrack. "
                "Errtitle: ");
        critlog(Title);
        return TRACK_VEC();
    }
    td.trackTitle = safeTitle.value();
    auto dbres    = (*DBROOT) << td;
    if (dbres.has_value()) {
        return dbres.value();
    } else {
        warnlog("failed to find trackdata from PDJE database. Errtitle: ");
        warnlog(Title);
        return TRACK_VEC();
    }
}

MUS_VEC
PDJE::SearchMusic(const UNSANITIZED &Title,
                  const UNSANITIZED &composer,
                  const double       bpm)
{
    musdata md;
    auto    safeTitle    = PDJE_Name_Sanitizer::sanitizeFileName(Title);
    auto    safeComposer = PDJE_Name_Sanitizer::sanitizeFileName(composer);
    if (!safeTitle || !safeComposer) {
        critlog("failed to sanitize filename in PDJE SearchMusic. Errs: ");
        critlog(Title);
        critlog(composer);
        return MUS_VEC();
    }
    md.title    = safeTitle.value();
    md.composer = safeComposer.value();
    md.bpm      = bpm;
    auto dbres  = (*DBROOT) << md;
    if (dbres.has_value()) {
        return dbres.value();
    } else {
        warnlog("failed to find music from PDJE database. ErrTitle: ");
        warnlog(Title);
        warnlog(composer);
        return MUS_VEC();
    }
}

bool
PDJE::InitPlayer(PLAY_MODE          mode,
                 trackdata         &td,
                 const unsigned int FrameBufferSize)
{
    switch (mode) {
    case PLAY_MODE::FULL_PRE_RENDER:
        player = std::make_shared<audioPlayer>(
            (*DBROOT), td, FrameBufferSize, false);
        break;
    case PLAY_MODE::HYBRID_RENDER:
        player =
            std::make_shared<audioPlayer>((*DBROOT), td, FrameBufferSize, true);
        break;
    case PLAY_MODE::FULL_MANUAL_RENDER:
        player = std::make_shared<audioPlayer>(FrameBufferSize);
        break;

    default:
        break;
    }

    if (!player) {
        critlog("failed to init player on PDJE initPlayer.");
        return false;
    } else {
        if (player->STATUS != "OK") {
            critlog("PDJE initPlayer failed. STATUS not OK. ErrStatus: ");
            critlog(player->STATUS);
            return false;
        } else {
            return true;
        }
    }
}

bool
PDJE::GetNoteObjects(trackdata &td, OBJ_SETTER_CALLBACK &ObjectSetCallback)
{
    CapReader<NoteBinaryCapnpData> notereader;
    CapReader<MixBinaryCapnpData>  mixreader;

    if (!notereader.open(td.noteBinary)) {
        warnlog("failed to read notebinary from trackdata from PDJE "
                "GetNoteObjects");
        return false;
    }
    if (!mixreader.open(td.mixBinary)) {
        warnlog(
            "failed to read mixBinary from trackdata from PDJE GetNoteObjects");
        return false;
    }

    auto noteTrans = new NoteTranslator();
    auto mixTrans  = new MixTranslator();

    if (mixTrans->bpms.has_value()) {
        noteTrans->Read(
            notereader, mixTrans->bpms.value().bpmVec, ObjectSetCallback);
    } else {
        critlog("failed to emplace optional object from PDJE GetNoteObjects");
        delete noteTrans;
        delete mixTrans;
        return false;
    }
    delete noteTrans;
    delete mixTrans;
    return true;
}

bool
PDJE::InitEditor(const DONT_SANITIZE &auth_name,
                 const DONT_SANITIZE &auth_email,
                 const DONT_SANITIZE &projectRoot)
{
    editor = std::make_shared<editorObject>(auth_name, auth_email);
    return editor->Open(projectRoot);
}

PDJE_CORE_DATA_LINE
PDJE::PullOutDataLine()
{
    if (player) {
        return player->PullOutDataLine();
    } else {
        PDJE_CORE_DATA_LINE errline;
        return errline;
    }
}