#ifdef WITH_RIVE_AUDIO
#include "rive/audio/audio_sound.hpp"
#include "rive/audio/audio_engine.hpp"
#include "rive/audio/audio_reader.hpp"
#include "rive/audio/audio_source.hpp"

using namespace rive;

AudioSound::AudioSound(AudioEngine* engine, rcp<AudioSource> source, Artboard* artboard) :
    m_decoder({}),
    m_buffer({}),
    m_sound({}),
    m_source(std::move(source)),
    m_isDisposed(false),
    m_engine(engine),
    m_artboard(artboard)
{}

void AudioSound::dispose()
{
    if (m_isDisposed)
    {
        return;
    }
    m_isDisposed = true;
    ma_sound_uninit(&m_sound);
    ma_decoder_uninit(&m_decoder);
    ma_audio_buffer_uninit(&m_buffer);
}

float AudioSound::volume() { return ma_sound_get_volume(&m_sound); }
void AudioSound::volume(float value) { ma_sound_set_volume(&m_sound, value); }

bool AudioSound::completed() const
{
    if (m_isDisposed)
    {
        return true;
    }
    return (bool)ma_sound_at_end(&m_sound);
}

AudioSound::~AudioSound() { dispose(); }

void AudioSound::stop(uint64_t fadeTimeInFrames)
{
    if (m_isDisposed)
    {
        return;
    }
    if (fadeTimeInFrames == 0)
    {
        ma_sound_stop(&m_sound);
    }
    else
    {
        ma_sound_stop_with_fade_in_pcm_frames(&m_sound, fadeTimeInFrames);
    }
}

bool AudioSound::seek(uint64_t timeInFrames)
{
    if (m_isDisposed)
    {
        return false;
    }
    return ma_sound_seek_to_pcm_frame(&m_sound, (ma_uint64)timeInFrames) == MA_SUCCESS;
}

#endif