blob: 24f7b42055dfb1f93f0bec798dd524437b9746f0 [file]
#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.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;
}
// A fade set before a sound starts runs late and is cut off at its stop.
// The clock trails the mix, so a sound already mixed still fades.
if (fadeTimeInFrames == 0 ||
(ma_node_get_time(&m_sound) == 0 &&
ma_node_get_state_time(&m_sound, ma_node_state_started) >
ma_engine_get_time_in_pcm_frames(ma_sound_get_engine(&m_sound))))
{
ma_sound_stop(&m_sound);
}
else
{
ma_sound_stop_with_fade_in_pcm_frames(&m_sound, fadeTimeInFrames);
}
}
void AudioSound::play()
{
if (m_isDisposed)
{
return;
}
ma_sound_seek_to_pcm_frame(&m_sound, 0);
ma_sound_start(&m_sound);
}
void AudioSound::pause() { stop(0); }
void AudioSound::resume()
{
if (m_isDisposed)
{
return;
}
ma_sound_start(&m_sound);
}
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;
}
bool AudioSound::seekSeconds(float timeInSeconds)
{
if (m_isDisposed)
{
return false;
}
return ma_sound_seek_to_second(&m_sound, timeInSeconds) == MA_SUCCESS;
}
uint64_t AudioSound::timeInFrames()
{
if (m_isDisposed)
{
return 0;
}
return ma_sound_get_time_in_pcm_frames(&m_sound);
}
float AudioSound::timeInSeconds()
{
if (m_isDisposed)
{
return 0.0f;
}
return ma_sound_get_time_in_milliseconds(&m_sound) / 1000.0f;
}
#endif