Skip to content

File Engine.h

File List > Amplitude > Core > Engine.h

Go to the documentation of this file

// Copyright (c) 2021-present Sparky Studios. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#pragma once

#ifndef _AM_CORE_ENGINE_H
#define _AM_CORE_ENGINE_H

#include <SparkyStudios/Audio/Amplitude/Core/Common.h>

#include <SparkyStudios/Audio/Amplitude/Core/Device.h>
#include <SparkyStudios/Audio/Amplitude/Core/Entity.h>
#include <SparkyStudios/Audio/Amplitude/Core/Environment.h>
#include <SparkyStudios/Audio/Amplitude/Core/Event.h>
#include <SparkyStudios/Audio/Amplitude/Core/Listener.h>
#include <SparkyStudios/Audio/Amplitude/Core/Memory.h>
#include <SparkyStudios/Audio/Amplitude/Core/Playback/Bus.h>
#include <SparkyStudios/Audio/Amplitude/Core/Playback/Channel.h>
#include <SparkyStudios/Audio/Amplitude/Core/Room.h>
#include <SparkyStudios/Audio/Amplitude/Core/Version.h>

#include <SparkyStudios/Audio/Amplitude/HRTF/HRIRSphere.h>

#include <SparkyStudios/Audio/Amplitude/Mixer/Amplimix.h>
#include <SparkyStudios/Audio/Amplitude/Mixer/Pipeline.h>

#include <SparkyStudios/Audio/Amplitude/Sound/Attenuation.h>
#include <SparkyStudios/Audio/Amplitude/Sound/Collection.h>
#include <SparkyStudios/Audio/Amplitude/Sound/Effect.h>
#include <SparkyStudios/Audio/Amplitude/Sound/Rtpc.h>
#include <SparkyStudios/Audio/Amplitude/Sound/Sound.h>
#include <SparkyStudios/Audio/Amplitude/Sound/SoundObject.h>
#include <SparkyStudios/Audio/Amplitude/Sound/Switch.h>
#include <SparkyStudios/Audio/Amplitude/Sound/SwitchContainer.h>

#if !defined(AM_BUILDSYSTEM_BUILDING_PLUGIN) && !defined(AM_BUILDSYSTEM_BUILDING_AMPLITUDE)

#define amEngine SparkyStudios::Audio::Amplitude::Engine::GetInstance()

#endif // AM_BUILDSYSTEM_BUILDING_PLUGIN

namespace SparkyStudios::Audio::Amplitude
{
    typedef SwitchContainer* SwitchContainerHandle;
    typedef Collection* CollectionHandle;
    typedef Sound* SoundHandle;
    typedef SoundObject* SoundObjectHandle;
    typedef Event* EventHandle;
    typedef Pipeline* PipelineHandle;
    typedef Attenuation* AttenuationHandle;
    typedef Switch* SwitchHandle;
    typedef Rtpc* RtpcHandle;
    typedef Effect* EffectHandle;

    class AM_API_PUBLIC Engine
    {
    public:
        virtual ~Engine() = default;

#pragma region Miscellaneous

        [[nodiscard]] virtual const AmVersion* Version() const = 0;

#pragma endregion

#pragma region Initialization

        virtual bool Initialize(const AmOsString& configFile) = 0;

        virtual bool Deinitialize() = 0;

        [[nodiscard]] virtual bool IsInitialized() const = 0;

#pragma endregion

#pragma region FileSystem Management

        virtual void SetFileSystem(std::shared_ptr<FileSystem> fs) = 0;

        [[nodiscard]] virtual std::shared_ptr<const FileSystem> GetFileSystem() const = 0;

        virtual void StartOpenFileSystem() = 0;

        virtual bool TryFinalizeOpenFileSystem() = 0;

        virtual void StartCloseFileSystem() = 0;

        virtual bool TryFinalizeCloseFileSystem() = 0;

#pragma endregion

#pragma region Runtime Loop

        virtual void AdvanceFrame(AmTime delta) const = 0;

        virtual void OnNextFrame(std::function<void(AmTime delta)> callback) const = 0;

        virtual void WaitUntilNextFrame() const = 0;

        virtual void WaitUntilFrames(AmUInt64 frameCount) const = 0;

        [[nodiscard]] virtual AmTime GetTotalTime() const = 0;

#pragma endregion

#pragma region Sound Bank Management

        virtual bool LoadSoundBank(const AmOsString& filename) = 0;

        virtual bool LoadSoundBank(const AmOsString& filename, AmBankID& outID) = 0;

        virtual bool LoadSoundBankFromMemoryView(AmConstVoidPtr ptr, AmSize size) = 0;

        virtual bool LoadSoundBankFromMemoryView(AmConstVoidPtr ptr, AmSize size, AmBankID& outID) = 0;

        virtual void UnloadSoundBank(const AmOsString& filename) = 0;

        virtual void UnloadSoundBank(AmBankID id) = 0;

        virtual void UnloadSoundBanks() = 0;

        virtual void EnsureSoundBankLoaded(const AmOsString& filename) = 0;

        [[nodiscard]] virtual bool HasLoadedSoundBank(const AmOsString& filename) const = 0;

        [[nodiscard]] virtual bool HasLoadedSoundBank(AmBankID id) const = 0;

        [[nodiscard]] virtual bool HasLoadedSoundBanks() const = 0;

        virtual void StartLoadSoundFiles() = 0;

        virtual bool TryFinalizeLoadSoundFiles() = 0;

#pragma endregion

#pragma region Handles

        [[nodiscard]] virtual SwitchContainerHandle GetSwitchContainerHandle(const AmString& name) const = 0;

        [[nodiscard]] virtual SwitchContainerHandle GetSwitchContainerHandle(AmSwitchContainerID id) const = 0;

        [[nodiscard]] virtual SwitchContainerHandle GetSwitchContainerHandleFromFile(const AmOsString& filename) const = 0;

        [[nodiscard]] virtual CollectionHandle GetCollectionHandle(const AmString& name) const = 0;

        [[nodiscard]] virtual CollectionHandle GetCollectionHandle(AmCollectionID id) const = 0;

        [[nodiscard]] virtual CollectionHandle GetCollectionHandleFromFile(const AmOsString& filename) const = 0;

        [[nodiscard]] virtual SoundHandle GetSoundHandle(const AmString& name) const = 0;

        [[nodiscard]] virtual SoundHandle GetSoundHandle(AmSoundID id) const = 0;

        [[nodiscard]] virtual SoundHandle GetSoundHandleFromFile(const AmOsString& filename) const = 0;

        [[nodiscard]] virtual SoundObjectHandle GetSoundObjectHandle(const AmString& name) const = 0;

        [[nodiscard]] virtual SoundObjectHandle GetSoundObjectHandle(AmSoundID id) const = 0;

        [[nodiscard]] virtual SoundObjectHandle GetSoundObjectHandleFromFile(const AmOsString& filename) const = 0;

        [[nodiscard]] virtual EventHandle GetEventHandle(const AmString& name) const = 0;

        [[nodiscard]] virtual EventHandle GetEventHandle(AmEventID id) const = 0;

        [[nodiscard]] virtual EventHandle GetEventHandleFromFile(const AmOsString& filename) const = 0;

        [[nodiscard]] virtual AttenuationHandle GetAttenuationHandle(const AmString& name) const = 0;

        [[nodiscard]] virtual AttenuationHandle GetAttenuationHandle(AmAttenuationID id) const = 0;

        [[nodiscard]] virtual AttenuationHandle GetAttenuationHandleFromFile(const AmOsString& filename) const = 0;

        [[nodiscard]] virtual SwitchHandle GetSwitchHandle(const AmString& name) const = 0;

        [[nodiscard]] virtual SwitchHandle GetSwitchHandle(AmSwitchID id) const = 0;

        [[nodiscard]] virtual SwitchHandle GetSwitchHandleFromFile(const AmOsString& filename) const = 0;

        [[nodiscard]] virtual RtpcHandle GetRtpcHandle(const AmString& name) const = 0;

        [[nodiscard]] virtual RtpcHandle GetRtpcHandle(AmRtpcID id) const = 0;

        [[nodiscard]] virtual RtpcHandle GetRtpcHandleFromFile(const AmOsString& filename) const = 0;

        [[nodiscard]] virtual EffectHandle GetEffectHandle(const AmString& name) const = 0;

        [[nodiscard]] virtual EffectHandle GetEffectHandle(AmEffectID id) const = 0;

        [[nodiscard]] virtual EffectHandle GetEffectHandleFromFile(const AmOsString& filename) const = 0;

        [[nodiscard]] virtual PipelineHandle GetPipelineHandle() const = 0;

#pragma endregion

#pragma region Master Gain and Mute State

        virtual void SetMasterGain(AmReal32 gain) const = 0;

        [[nodiscard]] virtual AmReal32 GetMasterGain() const = 0;

        virtual void SetMute(bool mute) const = 0;

        [[nodiscard]] virtual bool IsMuted() const = 0;

        virtual void Pause(bool pause) const = 0;

        [[nodiscard]] virtual bool IsPaused() const = 0;

#pragma endregion

#pragma region Listeners Management

        virtual void SetDefaultListener(const Listener* listener) = 0;

        virtual void SetDefaultListener(AmListenerID id) = 0;

        [[nodiscard]] virtual Listener GetDefaultListener() const = 0;

        [[nodiscard]] virtual Listener AddListener(AmListenerID id) const = 0;

        [[nodiscard]] virtual Listener GetListener(AmListenerID id) const = 0;

        virtual void RemoveListener(AmListenerID id) const = 0;

        virtual void RemoveListener(const Listener* listener) const = 0;

#pragma endregion

#pragma region Entities Management

        [[nodiscard]] virtual Entity AddEntity(AmEntityID id) const = 0;

        [[nodiscard]] virtual Entity GetEntity(AmEntityID id) const = 0;

        virtual void RemoveEntity(const Entity* entity) const = 0;

        virtual void RemoveEntity(AmEntityID id) const = 0;

#pragma endregion

#pragma region Environments Management

        [[nodiscard]] virtual Environment AddEnvironment(AmEnvironmentID id) const = 0;

        [[nodiscard]] virtual Environment GetEnvironment(AmEnvironmentID id) const = 0;

        virtual void RemoveEnvironment(const Environment* environment) const = 0;

        virtual void RemoveEnvironment(AmEnvironmentID id) const = 0;

#pragma endregion

#pragma region Rooms Management

        [[nodiscard]] virtual Room AddRoom(AmRoomID id) const = 0;

        [[nodiscard]] virtual Room GetRoom(AmRoomID id) const = 0;

        virtual void RemoveRoom(const Room* room) const = 0;

        virtual void RemoveRoom(AmRoomID id) const = 0;

#pragma endregion

#pragma region Buses Management

        [[nodiscard]] virtual Bus FindBus(const AmString& name) const = 0;

        [[nodiscard]] virtual Bus FindBus(AmBusID id) const = 0;

#pragma endregion

#pragma region Playback

        [[nodiscard]] virtual Channel Play(SwitchContainerHandle handle) const = 0;

        [[nodiscard]] virtual Channel Play(SwitchContainerHandle handle, const AmVector3& location) const = 0;

        [[nodiscard]] virtual Channel Play(SwitchContainerHandle handle, const AmVector3& location, AmReal32 userGain) const = 0;

        [[nodiscard]] virtual Channel Play(SwitchContainerHandle handle, const Entity& entity) const = 0;

        [[nodiscard]] virtual Channel Play(SwitchContainerHandle handle, const Entity& entity, AmReal32 userGain) const = 0;

        [[nodiscard]] virtual Channel Play(CollectionHandle handle) const = 0;

        [[nodiscard]] virtual Channel Play(CollectionHandle handle, const AmVector3& location) const = 0;

        [[nodiscard]] virtual Channel Play(CollectionHandle handle, const AmVector3& location, AmReal32 userGain) const = 0;

        [[nodiscard]] virtual Channel Play(CollectionHandle handle, const Entity& entity) const = 0;

        [[nodiscard]] virtual Channel Play(CollectionHandle handle, const Entity& entity, AmReal32 userGain) const = 0;

        [[nodiscard]] virtual Channel Play(SoundHandle handle) const = 0;

        [[nodiscard]] virtual Channel Play(SoundHandle handle, const AmVector3& location) const = 0;

        [[nodiscard]] virtual Channel Play(SoundHandle handle, const AmVector3& location, AmReal32 userGain) const = 0;

        [[nodiscard]] virtual Channel Play(SoundHandle handle, const Entity& entity) const = 0;

        [[nodiscard]] virtual Channel Play(SoundHandle handle, const Entity& entity, AmReal32 userGain) const = 0;

        [[nodiscard]] virtual Channel Play(const AmString& name) const = 0;

        [[nodiscard]] virtual Channel Play(const AmString& name, const AmVector3& location) const = 0;

        [[nodiscard]] virtual Channel Play(const AmString& name, const AmVector3& location, AmReal32 userGain) const = 0;

        [[nodiscard]] virtual Channel Play(const AmString& name, const Entity& entity) const = 0;

        [[nodiscard]] virtual Channel Play(const AmString& name, const Entity& entity, AmReal32 userGain) const = 0;

        [[nodiscard]] virtual Channel Play(AmObjectID id) const = 0;

        [[nodiscard]] virtual Channel Play(AmObjectID id, const AmVector3& location) const = 0;

        [[nodiscard]] virtual Channel Play(AmObjectID id, const AmVector3& location, AmReal32 userGain) const = 0;

        [[nodiscard]] virtual Channel Play(AmObjectID id, const Entity& entity) const = 0;

        [[nodiscard]] virtual Channel Play(AmObjectID id, const Entity& entity, AmReal32 userGain) const = 0;

        virtual void StopAll() const = 0;

#pragma endregion

#pragma region Events

        [[nodiscard]] virtual EventCanceler Trigger(EventHandle handle, const Entity& entity) const = 0;

        [[nodiscard]] virtual EventCanceler Trigger(const AmString& name, const Entity& entity) const = 0;

        [[nodiscard]] virtual EventCanceler Trigger(AmEventID id, const Entity& entity) const = 0;

        virtual void CancelEvents(const Entity& entity) const = 0;

        virtual void CancelAllEvents() const = 0;

#pragma endregion

#pragma region Switches

        virtual void SetSwitchState(SwitchHandle handle, AmObjectID stateId) const = 0;

        virtual void SetSwitchState(SwitchHandle handle, const AmString& stateName) const = 0;

        virtual void SetSwitchState(SwitchHandle handle, const SwitchState& state) const = 0;

        virtual void SetSwitchState(AmSwitchID id, AmObjectID stateId) const = 0;

        virtual void SetSwitchState(AmSwitchID id, const AmString& stateName) const = 0;

        virtual void SetSwitchState(AmSwitchID id, const SwitchState& state) const = 0;

        virtual void SetSwitchState(const AmString& name, AmObjectID stateId) const = 0;

        virtual void SetSwitchState(const AmString& name, const AmString& stateName) const = 0;

        virtual void SetSwitchState(const AmString& name, const SwitchState& state) const = 0;

#pragma endregion

#pragma region RTPC

        virtual void SetRtpcValue(RtpcHandle handle, double value) const = 0;

        virtual void SetRtpcValue(AmRtpcID id, double value) const = 0;

        virtual void SetRtpcValue(const AmString& name, double value) const = 0;

#pragma endregion

#pragma region Driver

        [[nodiscard]] virtual std::shared_ptr<Driver> GetDriver() const = 0;

#pragma endregion

#pragma region Amplimix

        [[nodiscard]] virtual Amplimix* GetMixer() const = 0;

#pragma endregion

#pragma region Engine State and Configuration

        [[nodiscard]] virtual const AmOsString& GetConfigurationPath() const = 0;

        [[nodiscard]] virtual AmReal32 GetSoundSpeed() const = 0;

        [[nodiscard]] virtual AmReal32 GetDopplerFactor() const = 0;

        [[nodiscard]] virtual AmUInt32 GetActiveEntitiesCount() const = 0;

        [[nodiscard]] virtual AmUInt32 GetActiveListenersCount() const = 0;

        [[nodiscard]] virtual AmUInt32 GetActiveEnvironmentsCount() const = 0;

        [[nodiscard]] virtual AmUInt32 GetActiveRoomsCount() const = 0;

        [[nodiscard]] virtual AmUInt32 GetSamplesPerStream() const = 0;

        [[nodiscard]] virtual bool IsGameTrackingEnvironmentAmounts() const = 0;

        [[nodiscard]] virtual AmUInt32 GetMaxListenersCount() const = 0;

        [[nodiscard]] virtual AmUInt32 GetMaxEntitiesCount() const = 0;

        [[nodiscard]] virtual AmUInt32 GetMaxEnvironmentsCount() const = 0;

        [[nodiscard]] virtual AmUInt32 GetMaxRoomsCount() const = 0;

        [[nodiscard]] virtual const Curve& GetOcclusionCoefficientCurve() const = 0;

        [[nodiscard]] virtual const Curve& GetOcclusionGainCurve() const = 0;

        [[nodiscard]] virtual const Curve& GetObstructionCoefficientCurve() const = 0;

        [[nodiscard]] virtual const Curve& GetObstructionGainCurve() const = 0;

        [[nodiscard]] virtual ePanningMode GetPanningMode() const = 0;

        [[nodiscard]] virtual eHRIRSphereSamplingMode GetHRIRSphereSamplingMode() const = 0;

        [[nodiscard]] virtual std::shared_ptr<const HRIRSphere> GetHRIRSphere() const = 0;

        [[nodiscard]] virtual Channel GetChannel(AmChannelID channelID) const = 0;

        [[nodiscard]] virtual bool IsStopping() const = 0;

#pragma endregion

#pragma region Plugins Management

        static AmVoidPtr LoadPlugin(const AmOsString& pluginLibraryName);

        static void AddPluginSearchPath(const AmOsString& path);

        static void RemovePluginSearchPath(const AmOsString& path);

        static bool RegisterDefaultExtensions();

        static bool UnregisterDefaultExtensions();

        template<typename T, class... Args>
        static std::shared_ptr<T> RegisterExtension(Args&&... args)
        {
            auto extension = AmSharedPtr<T, eMemoryPoolKind_Engine>::Make(std::forward<Args>(args)...);
            T::Register(extension);

            return extension;
        }

        template<typename T>
        static void UnregisterExtension(std::shared_ptr<T>& extension)
        {
            T::Unregister(extension);
            extension.reset();
        }

#pragma endregion

#pragma region Singleton Implementation

        [[nodiscard]] static Engine* GetInstance();

        static void DestroyInstance();

#pragma endregion
    };

} // namespace SparkyStudios::Audio::Amplitude

#endif // _AM_CORE_ENGINE_H