From ed574e5dde5fa7aaaeb8901ff38485b104f175c6 Mon Sep 17 00:00:00 2001 From: dfranx Date: Sun, 12 Dec 2021 01:30:36 +0100 Subject: [PATCH] Update AudioPlayer --- src/SHADERed/Engine/AudioPlayer.cpp | 60 +++++++++++++++++++++++------ src/SHADERed/Engine/AudioPlayer.h | 38 +++++------------- 2 files changed, 57 insertions(+), 41 deletions(-) diff --git a/src/SHADERed/Engine/AudioPlayer.cpp b/src/SHADERed/Engine/AudioPlayer.cpp index cbc655e2..96b7f291 100644 --- a/src/SHADERed/Engine/AudioPlayer.cpp +++ b/src/SHADERed/Engine/AudioPlayer.cpp @@ -49,11 +49,12 @@ void audioPlayerCallback(ma_device* pDevice, void* pOutput, const void* pInput, ma_pcm_rb_acquire_read(player->GetRingBuffer(), &framesToRead, &pReadBuffer); { - memcpy(pRunningOutput, pReadBuffer, framesToRead * ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels)); + memcpy(pRunningOutput, pReadBuffer, + static_cast(framesToRead) * ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels)); } ma_pcm_rb_commit_read(player->GetRingBuffer(), framesToRead, pReadBuffer); - pRunningOutput += framesToRead * ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels); + pRunningOutput += static_cast(framesToRead) * ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels); pcmFramesProcessed += framesToRead; } else { /* @@ -85,17 +86,23 @@ namespace ed { { m_loaded = false; m_paused = true; + m_audioBuffer[0] = 0; + + memset(&m_decoderConfig, 0, sizeof(ma_decoder_config)); + memset(&m_decoder, 0, sizeof(ma_decoder)); + memset(&m_deviceConfig, 0, sizeof(ma_device_config)); + memset(&m_device, 0, sizeof(ma_device)); + memset(&m_rb, 0, sizeof(ma_pcm_rb)); } + AudioPlayer::~AudioPlayer() { - if (m_loaded) - m_clean(); + m_clean(); } bool AudioPlayer::LoadFromFile(const std::string& filename) { - if (m_loaded) - m_clean(); + m_clean(); m_loaded = false; @@ -127,28 +134,57 @@ namespace ed { void AudioPlayer::Start() { m_paused = false; - if (ma_device_start(&m_device) != MA_SUCCESS) { - m_loaded = false; + + if (ma_device_start(&m_device) != MA_SUCCESS) m_clean(); - } } void AudioPlayer::Stop() { m_paused = true; - if (ma_device_stop(&m_device) != MA_SUCCESS) { - m_loaded = false; + + if (ma_device_stop(&m_device) != MA_SUCCESS) m_clean(); - } } void AudioPlayer::m_clean() { + if (!m_loaded) return; + ma_device_uninit(&m_device); ma_decoder_uninit(&m_decoder); ma_pcm_rb_uninit(&m_rb); m_paused = true; m_loaded = false; } + + void AudioPlayer::SeekFrame(unsigned int frameIndex) + { + ma_decoder_seek_to_pcm_frame(&m_decoder, frameIndex); + } + + uint64_t AudioPlayer::GetCurrentFrame() + { + ma_uint64 ret = 0; + ma_decoder_get_cursor_in_pcm_frames(&m_decoder, &ret); + return ret; + } + + uint64_t AudioPlayer::GetTotalFrameCount() + { + return ma_decoder_get_length_in_pcm_frames(&m_decoder); + } + + float AudioPlayer::GetVolume() + { + float ret = 0.0f; + ma_device_get_master_volume(&m_device, &ret); + return ret; + } + + void AudioPlayer::SetVolume(float volume) + { + ma_device_set_master_volume(&m_device, volume); + } } } \ No newline at end of file diff --git a/src/SHADERed/Engine/AudioPlayer.h b/src/SHADERed/Engine/AudioPlayer.h index 70856995..e754d8bd 100644 --- a/src/SHADERed/Engine/AudioPlayer.h +++ b/src/SHADERed/Engine/AudioPlayer.h @@ -11,46 +11,26 @@ namespace ed { ~AudioPlayer(); bool LoadFromFile(const std::string& filename); - void Start(); - void Stop(); - // read last 512 samples (x2 == 1024, because stereo) + // Read last 512 samples (x2 == 1024, because stereo) inline void GetSamples(short* out) { memcpy(out, m_audioBuffer, 1024 * sizeof(short)); } - inline short* GetAudioBuffer() { return m_audioBuffer; } + void SeekFrame(unsigned int frameIndex); + uint64_t GetCurrentFrame(); + uint64_t GetTotalFrameCount(); + + float GetVolume(); + void SetVolume(float volume); + + inline short* GetAudioBuffer() { return m_audioBuffer; } inline ma_decoder* GetDecoder() { return &m_decoder; } inline ma_pcm_rb* GetRingBuffer() { return &m_rb; } - inline void SeekFrame(unsigned int frameIndex) - { - ma_decoder_seek_to_pcm_frame(&m_decoder, frameIndex); - } - inline uint64_t GetCurrentFrame() - { - ma_uint64 ret = 0; - ma_decoder_get_cursor_in_pcm_frames(&m_decoder, &ret); - return ret; - } - inline uint64_t GetTotalFrameCount() - { - return ma_decoder_get_length_in_pcm_frames(&m_decoder); - } - inline float GetVolume() - { - float ret = 0.0f; - ma_device_get_master_volume(&m_device, &ret); - return ret; - } - inline void SetVolume(float volume) - { - ma_device_set_master_volume(&m_device, volume); - } - private: void m_clean();