| #ifdef WITH_RIVE_AUDIO | |
| #ifndef _RIVE_AUDIO_ENGINE_HPP_ | |
| #define _RIVE_AUDIO_ENGINE_HPP_ | |
| #include "rive/refcnt.hpp" | |
| #include "rive/span.hpp" | |
| #include <vector> | |
| #include <stdio.h> | |
| #include <cstdint> | |
| typedef struct ma_engine ma_engine; | |
| typedef struct ma_sound ma_sound; | |
| typedef struct ma_device ma_device; | |
| typedef struct ma_node_base ma_node_base; | |
| namespace rive | |
| { | |
| class AudioSound; | |
| class AudioSource; | |
| class LevelsNode; | |
| class AudioEngine : public RefCnt<AudioEngine> | |
| { | |
| friend class AudioSound; | |
| friend class AudioSource; | |
| friend class LevelsNode; | |
| public: | |
| static const uint32_t defaultNumChannels = 2; | |
| static const uint32_t defaultSampleRate = 48000; | |
| static rcp<AudioEngine> Make(uint32_t numChannels, uint32_t sampleRate); | |
| ma_device* device() { return m_device; } | |
| ma_engine* engine() { return m_engine; } | |
| uint32_t channels() const; | |
| uint32_t sampleRate() const; | |
| uint64_t timeInFrames(); | |
| ~AudioEngine(); | |
| rcp<AudioSound> play(rcp<AudioSource> source, | |
| uint64_t startTime, | |
| uint64_t endTime, | |
| uint64_t soundStartTime); | |
| static rcp<AudioEngine> RuntimeEngine(); | |
| #ifdef EXTERNAL_RIVE_AUDIO_ENGINE | |
| bool readAudioFrames(float* frames, uint64_t numFrames, uint64_t* framesRead = nullptr); | |
| bool sumAudioFrames(float* frames, uint64_t numFrames); | |
| #endif | |
| #ifdef WITH_RIVE_AUDIO_TOOLS | |
| void initLevelMonitor(); | |
| void levels(Span<float> levels); | |
| float level(uint32_t channel); | |
| #endif | |
| private: | |
| AudioEngine(ma_engine* engine); | |
| ma_device* m_device; | |
| ma_engine* m_engine; | |
| std::vector<rcp<AudioSound>> m_completedSounds; | |
| rcp<AudioSound> m_playingSoundsHead; | |
| static void SoundCompleted(void* pUserData, ma_sound* pSound); | |
| #ifdef WITH_RIVE_AUDIO_TOOLS | |
| void measureLevels(const float* frames, uint32_t frameCount); | |
| std::vector<float> m_levels; | |
| LevelsNode* m_levelMonitor = nullptr; | |
| #endif | |
| #ifdef EXTERNAL_RIVE_AUDIO_ENGINE | |
| std::vector<float> m_readFrames; | |
| #endif | |
| }; | |
| } // namespace rive | |
| #endif | |
| #endif |