diff options
Diffstat (limited to 'src/crepe/api/AudioSource.h')
-rw-r--r-- | src/crepe/api/AudioSource.h | 69 |
1 files changed, 51 insertions, 18 deletions
diff --git a/src/crepe/api/AudioSource.h b/src/crepe/api/AudioSource.h index 2d26cda..b20e490 100644 --- a/src/crepe/api/AudioSource.h +++ b/src/crepe/api/AudioSource.h @@ -1,41 +1,74 @@ #pragma once -#include <memory> +#include "../Component.h" +#include "../facade/SoundHandle.h" +#include "../types.h" #include "Asset.h" -#include "Component.h" +#include "GameObject.h" namespace crepe { -class Sound; -} -namespace crepe::api { +class AudioSystem; //! Audio source component -class AudioSource : Component { +class AudioSource : public Component { + //! AudioSource components are handled by AudioSystem + friend class AudioSystem; + +protected: + /** + * \param source Sound sample to load + */ + AudioSource(game_object_id_t id, const Asset & source); + //! Only ComponentManager creates components + friend class ComponentManager; + public: - AudioSource(std::unique_ptr<Asset> audio_clip); + // std::unique_ptr needs to be able to destoy this component virtual ~AudioSource() = default; public: - //! Start or resume this audio source - void play(); - void play(bool looping); + //! Start this audio source + void play(bool looping = false); //! Stop this audio source void stop(); public: - //! Sample file location - std::unique_ptr<Asset> audio_clip; - //! TODO: ????? - bool play_on_awake; + //! Play when this component becomes active + bool play_on_awake = false; //! Repeat the current audio clip during playback - bool loop; + bool loop = false; //! Normalized volume (0.0 - 1.0) - float volume; + float volume = 1.0; private: - std::unique_ptr<crepe::Sound> sound; + //! This audio source's clip + const Asset source; + + /** + * \name One-shot state variables + * + * These variables trigger function calls when set to true, and are unconditionally reset on + * every system update. + * + * \{ + */ + //! Play this sample + bool oneshot_play = false; + //! Stop this sample + bool oneshot_stop = false; + //! \} + /** + * \name State diffing variables + * \{ + */ + typeof(active) last_active = false; + typeof(volume) last_volume = volume; + typeof(loop) last_loop = loop; + //! \} + //! This source's voice handle + SoundHandle voice{}; }; -} // namespace crepe::api +} // namespace crepe |