Program Listing for File audioPlayer.cpp

Return to documentation for file (include\MainObjects\audioPlayer\audioPlayer.cpp)

#include "audioPlayer.hpp"
#include "PDJE_LOG_SETTER.hpp"

extern void
FullPreRender_callback(ma_device  *pDevice,
                       void       *pOutput,
                       const void *pInput,
                       ma_uint32   frameCount);

extern void
HybridRender_callback(ma_device  *pDevice,
                      void       *pOutput,
                      const void *pInput,
                      ma_uint32   frameCount);
extern void
FullManualRender_callback(ma_device  *pDevice,
                          void       *pOutput,
                          const void *pInput,
                          ma_uint32   frameCount);

#include "MusicControlPannel.hpp"

void
audioPlayer::ContextInit()
{
    auto conf = ma_context_config_init();
    ma_context_init(NULL, 0, &conf, &ctxt);
    ctxt.threadPriority = ma_thread_priority_high;
}

ma_device_config
audioPlayer::DefaultInit(const unsigned int frameBufferSize)
{
    ma_device_config conf   = ma_device_config_init(ma_device_type_playback);
    conf.playback.format    = ma_format_f32;
    conf.playback.channels  = 2;
    conf.sampleRate         = 48000;
    conf.periodSizeInFrames = frameBufferSize;
    conf.performanceProfile = ma_performance_profile_low_latency;
    LFaust.resize(frameBufferSize);
    RFaust.resize(frameBufferSize);
    engineDatas.faustPcmPP[0] = LFaust.data();
    engineDatas.faustPcmPP[1] = RFaust.data();
    conf.pUserData            = reinterpret_cast<void *>(&engineDatas);
    ContextInit();
    return conf;
}

audioPlayer::audioPlayer(litedb            &db,
                         trackdata         &td,
                         const unsigned int frameBufferSize,
                         const bool         hasManual)
{
    auto conf = DefaultInit(frameBufferSize);
    if (hasManual) {
        conf.dataCallback = HybridRender_callback;
        engineDatas.FXManualPannel.emplace(SAMPLERATE);
        engineDatas.MusCtrPannel.emplace(SAMPLERATE);
    } else {
        conf.dataCallback = FullPreRender_callback;
    }

    if (!renderer.LoadTrack(db, td)) {
        critlog("failed to load track. from audioPlayer::audioPlayer(db, td "
                ",fbsize, hasmanual)");
        return;
    }
    engineDatas.pcmDataPoint = &renderer.rendered_frames.value();
    engineDatas.maxCursor    = renderer.rendered_frames->size() / CHANNEL;

    if (ma_device_init(&ctxt, &conf, &player) != MA_SUCCESS) {
        critlog("failed to init device. from audioPlayer::audioPlayer(db, td "
                ",fbsize, hasmanual)");
        return;
    }
}

audioPlayer::audioPlayer(const unsigned int frameBufferSize)
{
    ma_device_config conf = DefaultInit(frameBufferSize);

    conf.dataCallback = FullManualRender_callback;
    engineDatas.FXManualPannel.emplace(SAMPLERATE);
    engineDatas.MusCtrPannel.emplace(SAMPLERATE);

    if (ma_device_init(&ctxt, &conf, &player) != MA_SUCCESS) {
        critlog("failed to init device. from audioPlayer::audioPlayer(fbsize)");
    }
}

bool
audioPlayer::Activate()
{
    bool Res = ma_device_start(&player) == MA_SUCCESS;
    if (!Res) {
        critlog("failed to activate audioPlayer. from audioPlayer Activate");
    }
    return Res;
}

bool
audioPlayer::Deactivate()
{
    bool Res = ma_device_stop(&player) == MA_SUCCESS;
    if (!Res) {
        critlog(
            "failed to deactivate audioPlayer. from audioPlayer Deactivate");
    }
    return Res;
}

audioPlayer::~audioPlayer()
{
    ma_device_uninit(&player);
    ma_context_uninit(&ctxt);
}

void
audioPlayer::ChangeCursorPos(unsigned long long pos)
{
    engineDatas.nowCursor = pos;
}

unsigned long long
audioPlayer::GetConsumedFrames()
{
    return engineDatas.consumedFrames;
}

FXControlPannel *
audioPlayer::GetFXControlPannel(const UNSANITIZED &title)
{
    if (title == "__PDJE__MAIN__") {
        if (!engineDatas.FXManualPannel.has_value()) {
            engineDatas.FXManualPannel.emplace(48000);
        }
        return &engineDatas.FXManualPannel.value();
    } else {
        if (engineDatas.MusCtrPannel.has_value()) {
            return engineDatas.MusCtrPannel->getFXHandle(title);
        } else {
            critlog("failed to return fx control pannel. from audioPlayer "
                    "GetFXControlPannel");
            return nullptr;
        }
    }
}

MusicControlPannel *
audioPlayer::GetMusicControlPannel()
{
    if (engineDatas.MusCtrPannel.has_value()) {
        return &(engineDatas.MusCtrPannel.value());
    } else {
        critlog("failed to return music control pannel. from audioPlayer "
                "GetMusicControlPannel");
        return nullptr;
    }
}

PDJE_CORE_DATA_LINE
audioPlayer::PullOutDataLine()
{
    PDJE_CORE_DATA_LINE dline;
    dline.used_frame = &engineDatas.consumedFrames;
    dline.nowCursor  = &engineDatas.nowCursor;
    dline.maxCursor  = &engineDatas.maxCursor;
    if (!engineDatas.pcmDataPoint->empty()) {
        dline.preRenderedData = engineDatas.pcmDataPoint->data();
    }
    if (engineDatas.FXManualPannel.has_value()) {
        dline.fx = &engineDatas.FXManualPannel.value();
    }
    if (engineDatas.MusCtrPannel.has_value()) {
        dline.musp = &engineDatas.MusCtrPannel.value();
    }
    return dline;
}