Skip to content

File Engine.h

File List > audio > Engine.h

Go to the documentation of this file

#pragma once

#include "dalia/core/Result.h"
#include "dalia/core/LogLevel.h"

#include "dalia/audio/PlaybackControl.h"
#include "dalia/audio/SoundControl.h"
#include "dalia/audio/EffectControl.h"

namespace dalia {

    struct EngineInternalState;

    struct EngineConfig {
        LogLevel logLevel = LogLevel::Warning;
        LogCallback logCallback = nullptr;

        CoordinateSystem coordinateSystem = CoordinateSystem::RightHanded;

        uint32_t residentSoundCapacity = 256; // Maybe this should be higher?
        uint32_t streamSoundCapacity = 256;

        uint32_t voiceCapacity      = 128;
        uint32_t maxActiveVoices    = 64;
        uint32_t streamCapacity     = 32;
        uint32_t busCapacity        = 64;
        uint32_t biquadCapacity     = 32;

        uint32_t listenerCapacity   = 1; // Min 1, max 4

        size_t rtCommandQueueCapacity       = 1024;
        size_t rtEventQueueCapacity         = 1024;
        size_t ioStreamRequestQueueCapacity = 256;
        size_t ioLoadRequestQueueCapacity   = 64;
        size_t ioLoadEventQueueCapacity     = 64;
    };

    class Engine {
    public:
        Engine();
        ~Engine();

        Engine(const Engine&) = delete;
        Engine& operator=(const Engine&) = delete;

        // ============================================================================
        // [ ENGINE LIFECYCLE ]
        // Core methods for initializing, ticking, shutting down the engine.
        // ============================================================================
#pragma region ENGINE_LIFECYCLE

        Result Init(const EngineConfig& config = EngineConfig{});

        Result Shutdown();

        void Update();

#pragma endregion ENGINE_LIFECYCLE

        // ============================================================================
        // [ ENGINE SETTINGS ]
        // Core methods for setting engine attributes.
        // ============================================================================
#pragma region ENGINE_SETTINGS

        Result SetGlobalDopplerFactor(float globalDopplerFactor);

#pragma endregion ENGINE_SETTINGS

        // ============================================================================
        // [ ASSET MANAGEMENT ]
        // Lifecycle methods for loading, tracking, and freeing raw audio memory
        // and soundbanks.
        // ============================================================================
#pragma region ASSET_MANAGEMENT

        Result LoadSoundAsync(SoundHandle& sound, SoundType type, const char* filepath,
            AssetLoadCallback callback = nullptr, uint32_t* outRequestId = nullptr);

        Result UnloadSound(SoundHandle soundHandle);

#pragma endregion ASSET_MANAGEMENT

        // ============================================================================
        // [ BUS MANAGEMENT ]
        // Lifecycle methods for creating, destroying, routing and modifying buses.
        // ============================================================================
#pragma region BUS_MANAGEMENT

        Result CreateBus(const char* identifier, const char* parentIdentifier = "Master");

        Result DestroyBus(const char* identifier);

        Result RouteBus(const char* identifier, const char* parentIdentifier);

        Result SetBusVolumeDb(const char* identifier, float volumeDb);

#pragma endregion BUS_MANAGEMENT

        // ============================================================================
        // [ EFFECTS MANAGEMENT ]
        // Lifecycle methods for creating, destroying, attaching, detaching and
        // modifying effects.
        // ============================================================================
#pragma region EFFECTS_MANAGEMENT

        Result CreateBiquadFilter(EffectHandle& effect, BiquadFilterType type, const BiquadConfig& config);

        Result SetBiquadParams(EffectHandle effect, const BiquadConfig& config);

        Result AttachEffect(EffectHandle effect, const char* busIdentifier, uint32_t effectSlot);

        Result DetachEffect(EffectHandle effect);

        Result DestroyEffect(EffectHandle effect);

#pragma endregion EFFECTS_MANAGEMENT

        // ============================================================================
        // [ PLAYBACK MANAGEMENT ]
        // Methods for creating and modifying playback instances in terms of state
        // and parameters.
        // ============================================================================
#pragma region PLAYBACK_MANAGEMENT

        Result CreatePlayback(PlaybackHandle& playback, SoundHandle sound,
                              PlaybackExitCallback callback = nullptr);

        Result RoutePlayback(PlaybackHandle playback, const char* busIdentifier);

        Result PlayPlayback(PlaybackHandle playback);

        Result PausePlayback(PlaybackHandle playback);

        Result StopPlayback(PlaybackHandle playback);

        Result SeekPlayback(PlaybackHandle playback, double timeInSeconds);

        Result SetPlaybackVolumeDb(PlaybackHandle playback, float volumeDb);

        Result SetPlaybackPitch(PlaybackHandle playback, float pitch);

        Result SetPlaybackStereoPan(PlaybackHandle playback, float pan);

        Result SetPlaybackLooping(PlaybackHandle playback, bool looping);

        Result SetPlaybackSpatial(PlaybackHandle playback, bool spatial);

        Result SetPlaybackDistanceMode(PlaybackHandle playback, DistanceMode mode);

        Result SetPlaybackAttenuationCurve(PlaybackHandle playback, AttenuationCurve curve);

        Result SetPlaybackPosition(PlaybackHandle playback, const Vec3& position);

        Result SetPlaybackMinMaxDistance(PlaybackHandle playback, float minDistance, float maxDistance);

        Result SetPlaybackUseDoppler(PlaybackHandle playback, bool useDoppler);

        Result SetPlaybackDopplerFactor(PlaybackHandle playback, float dopplerFactor);

        Result SetPlaybackVelocity(PlaybackHandle playback, const Vec3& velocity);

        Result SetPlaybackListenerMask(PlaybackHandle playback, ListenerMask mask);

#pragma endregion PLAYBACK_MANAGEMENT

        // ============================================================================
        // [ LISTENER MANAGEMENT ]
        // Methods for activating, deactivating and modifying listeners.
        // ============================================================================
#pragma region LISTENER_MANAGEMENT

        Result SetListenerActive(uint32_t listenerIndex, bool active);

        Result SetListener3DAttributes(uint32_t listenerIndex, const Listener3DAttributes& attributes);

        Result SetListenerPosition(uint32_t listenerIndex, const Vec3& position);

        Result SetListenerDistanceProbePosition(uint32_t listenerIndex, const Vec3& distanceProbePosition);

        Result SetListenerOrientation(uint32_t listenerIndex, const Vec3& forward, const Vec3& up);

        Result SetListenerVelocity(uint32_t listenerIndex, const Vec3& velocity);

#pragma endregion LISTENER_MANAGEMENT

    private:
        void TeardownInternal();

        EngineInternalState* m_state = nullptr;

    };
}