Program Listing for File Decoder.cpp

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

#include "Decoder.hpp"
#include "PDJE_LOG_SETTER.hpp"
#include <filesystem>
#include <fstream>

Decoder::Decoder()
{
    ;
}

bool
Decoder::init(litedb &db, const SANITIZED_ORNOT &KeyOrPath)
{
    ma_decoder_config dconf =
        ma_decoder_config_init(ma_format_f32, CHANNEL, SAMPLERATE);

    if (KeyOrPath.find(".") != std::string::npos or
        KeyOrPath.find("/") != std::string::npos) {
        fs::path songPath = fs::path(KeyOrPath).lexically_normal();
        if (!fs::exists(songPath)) {
            critlog("failed to find music in findpath mode. Err from Decoder "
                    "init. ErrPath: ");
            critlog(KeyOrPath);
            return false;
        }
        std::ifstream        musicFile(songPath, std::ios::binary);
        std::vector<uint8_t> fileData{ std::istreambuf_iterator<char>(
                                           musicFile),
                                       std::istreambuf_iterator<char>() };

        if (fileData.empty()) {
            critlog("failed to read music binary data in findpath mode. Err "
                    "from Decoder init. ErrPath: ");
            critlog(KeyOrPath);
            return false;
        }
        musicBinary = std::move(fileData);
    } else {
        std::string tempBinary;
        if (!db.KVGet(KeyOrPath, tempBinary)) {
            critlog("failed to get music from rocksdb. Err from Decoder init. "
                    "ErrKey: ");
            critlog(KeyOrPath);
            return false;
        }

        musicBinary =
            std::vector<uint8_t>(tempBinary.begin(), tempBinary.end());
    }
    return ma_decoder_init_memory(
               musicBinary.data(), musicBinary.size(), &dconf, &dec) ==
           MA_SUCCESS;
}

bool
Decoder::changePos(FRAME_POS Pos)
{
    bool chposRes = ma_decoder_seek_to_pcm_frame(&dec, Pos) == MA_SUCCESS;
    if (!chposRes) {
        critlog(
            "failed to change music play position. from Decoder changePos. ");
    }
    return chposRes;
}

bool
Decoder::getPos(FRAME_POS &pos)
{
    bool getPosRes =
        ma_decoder_get_cursor_in_pcm_frames(&dec, &pos) == MA_SUCCESS;
    if (!getPosRes) {
        critlog("failed to get music play position. from Decoder getPos");
    }
    return getPosRes;
}

bool
Decoder::getRange(FRAME_POS numFrames, std::vector<float> &buffer)
{
    FRAME_POS BufferSize = numFrames * CHANNEL;
    if (buffer.size() < BufferSize) {
        buffer.resize(BufferSize);
    }
    if (ma_decoder_read_pcm_frames(&dec, buffer.data(), numFrames, NULL) !=
        MA_SUCCESS) {
        critlog(
            "failed to read pcm frames from musicData. from Decoder getRange");
        return false;
    }
    return true;
}

Decoder::~Decoder()
{
    ma_decoder_uninit(&dec);
}