| #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_decoder.outputSampleRate; } | |
| 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 |