// Copyright (c) 2023 Dominic Masters // // This software is released under the MIT License. // https://opensource.org/licenses/MIT #pragma once #include "dawnopenal.hpp" #include "scene/SceneItemComponent.hpp" #include "asset/assets/AudioAsset.hpp" #define AUDIO_SOURCE_BUFFER_COUNT 3 #define AUDIO_SOURCE_BUFFER_SIZE 8192 namespace Dawn { enum AudioSourceState { AUDIO_SOURCE_STATE_STOPPED, AUDIO_SOURCE_STATE_PLAYING, AUDIO_SOURCE_STATE_PAUSED }; enum AudioSourcePlayMode { AUDIO_PLAY_MODE_ALWAYS, AUDIO_PLAY_MODE_UNPAUSED }; class AudioSource : public SceneItemComponent { private: ALuint source; bool_t ready = false; ALuint buffers[AUDIO_SOURCE_BUFFER_COUNT]; size_t bufferPosition = 0; // Settings enum AudioSourceState internalState = AUDIO_SOURCE_STATE_STOPPED; int32_t layer = 0; AudioAsset *data = nullptr; /** * Internally update the audio's state based on the current settings. */ void updateAudioSource(); void fillBuffer(ALuint buffer); void detatchBuffers(); void attachBuffers(); // Events void onSceneUpdate(); public: bool_t loop = false; enum AudioSourceState state = AUDIO_SOURCE_STATE_STOPPED; AudioSourcePlayMode playMode; Event<> eventPlaying; Event<> eventResumed; Event<> eventPaused; Event<> eventStopped; Event<> eventFinished; Event<> eventLooped; /** * Creates an Audio Source item component. * * @param item SceneItem that this audio source is attached to. */ AudioSource(SceneItem *item); /** * Returns the real current state of the sound. Refer to getPlayingState * but basically the actually requested play state and what the hardware * and internal logic is doing may result in the actual state being a * little different. You cannot control this, but you can read it. * * @return The actual current playing state. */ AudioSourceState getRealState(); /** * Rewinds the audio source. At the time of writing this comment (23017) I * am unsure of the behaviour when rewinding whilst the source is active. */ void rewind(); /** * Returns the current audio data for this source. * * @return Audio data that is atached to this source. */ AudioAsset * getAudioData(); /** * Sets the audio data for this source. Currently switching between the * audio data during playback may have undefined behavior. * * @param data Data to set. */ void setAudioData(AudioAsset *data); /** * Stop playing this audio source. Shorthand for setting the state. */ void stop(); /** * Play this audio source. Shorthand for state setting. */ void play(); /** * Pause this audio source. Shorthand for state setting. */ void pause(); void onStart() override; void onDispose() override; }; }