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

using namespace rive;

AudioReader::AudioReader(rcp<AudioSource> audioSource, uint32_t channels) :
    m_source(std::move(audioSource)), m_channels(channels), m_decoder({})
{}

AudioReader::~AudioReader() { ma_decoder_uninit(&m_decoder); }

uint32_t AudioReader::channels() const { return m_channels; }
uint32_t AudioReader::sampleRate() const { return m_source->sampleRate(); }
ma_decoder* AudioReader::decoder() { return &m_decoder; }

uint64_t AudioReader::lengthInFrames()
{
    ma_uint64 length;

    ma_result result = ma_data_source_get_length_in_pcm_frames(&m_decoder, &length);
    if (result != MA_SUCCESS)
    {
        fprintf(stderr,
                "AudioReader::lengthInFrames - audioSourceLength failed to determine length\n");
        return 0;
    }
    return (uint64_t)length;
}

Span<float> AudioReader::read(uint64_t frameCount)
{
    m_readBuffer.resize(frameCount * m_channels);

    ma_uint64 framesRead;
    if (ma_data_source_read_pcm_frames(&m_decoder,
                                       m_readBuffer.data(),
                                       (ma_uint64)frameCount,
                                       &framesRead) != MA_SUCCESS)
    {
        return Span<float>(nullptr, 0);
    }
    return Span<float>(m_readBuffer.data(), framesRead * m_channels);
}
#endif