| #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 |