Skip to content

File SoundControl.h

File List > audio > SoundControl.h

Go to the documentation of this file

#pragma once

#include "dalia/core/Result.h"

#include <cstdint>
#include <functional>

namespace dalia {

    enum class SoundType : uint8_t {
        None     = 0,
        Resident = 1,
        Stream   = 2
    };

    struct SoundHandle {
    public:
        SoundHandle() = default;
        explicit SoundHandle(uint64_t rawId) : m_rawId(rawId) {}

        bool IsValid() const { return m_rawId != 0; }
        bool operator==(const SoundHandle& other) const { return m_rawId == other.m_rawId; }
        bool operator!=(const SoundHandle& other) const { return m_rawId != other.m_rawId; }

        SoundType GetType() const { return static_cast<SoundType>(m_rawId >> 56); }

        uint64_t GetRawId() const { return m_rawId; }

    private:
        friend struct EngineInternalState;
        friend class AssetRegistry;
        friend class IoLoadSystem;

        static SoundHandle Create(uint32_t index, uint32_t generation, SoundType type) {
            SoundHandle handle;
            uint64_t typeBits = static_cast<uint64_t>(type) << 56;
            uint64_t generationBits = (static_cast<uint64_t>(generation) & 0xFFFFFF) << 32;
            uint64_t indexBits = static_cast<uint64_t>(index);

            handle.m_rawId = typeBits | generationBits | indexBits;
            return handle;
        }

        static SoundHandle FromRawId(uint64_t rawId) {
            SoundHandle handle;
            handle.m_rawId = rawId;
            return handle;
        }

        uint32_t GetIndex() const { return static_cast<uint32_t>(m_rawId & 0xFFFFFFFF); }
        uint32_t GetGeneration() const { return static_cast<uint32_t>((m_rawId >> 32) & 0xFFFFFF); }

        uint64_t m_rawId = 0;
    };

    constexpr uint32_t INVALID_REQUEST_ID = 0;

    using AssetLoadCallback = std::function<void(uint32_t requestId, Result result)>;
}