Program Listing for File audioPlayer.cpp

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

#include "audioPlayer.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)){
        STATUS = "Failed to load track";
        return;
    }
    engineDatas.pcmDataPoint = &renderer.rendered_frames.value();
    engineDatas.maxCursor = renderer.rendered_frames->size() / CHANNEL;

    if(ma_device_init(&ctxt, &conf, &player) != MA_SUCCESS){
        STATUS = "Failed to init device";
        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){
        STATUS = "Failed to init device";
    }

}

bool
audioPlayer::Activate()
{
    return ma_device_start(&player) == MA_SUCCESS;
}

bool
audioPlayer::Deactivate()
{
    return ma_device_stop(&player) == MA_SUCCESS;
}


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 std::string& 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{
            return nullptr;
        }
    }
}


MusicControlPannel*
audioPlayer::GetMusicControlPannel()
{
    if(engineDatas.MusCtrPannel.has_value()){
        return &(engineDatas.MusCtrPannel.value());
    }
    else{
        return nullptr;
    }
}