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