From 1532724a5d3dfbb4f5b622dab87b8d74f3e5f302 Mon Sep 17 00:00:00 2001 From: Antoine Pilote Date: Sun, 2 Apr 2023 22:35:40 -0400 Subject: [PATCH] Started work on audio manager Implemented soloud --- Editor/src/Windows/EditorInterface.cpp | 2 +- Nuake/Engine.cpp | 8 +++- Nuake/dependencies/soloud_p5.lua | 39 +++++++++++++++++ Nuake/src/Audio/AudioManager.cpp | 44 ++++++++++++++++++++ Nuake/src/Audio/AudioManager.h | 46 +++++++++++++++++++++ Nuake/src/Core/Physics/PhysicsManager.h | 7 ++-- Nuake/src/Resource/Project.cpp | 4 +- Nuake/src/Scene/Scene.cpp | 4 +- Nuake/src/Scene/Systems/PhysicsSystem.cpp | 14 +++---- Nuake/src/Scripting/Modules/PhysicsModule.h | 2 +- premake5.lua | 16 ++++--- 11 files changed, 164 insertions(+), 22 deletions(-) create mode 100644 Nuake/dependencies/soloud_p5.lua create mode 100644 Nuake/src/Audio/AudioManager.cpp create mode 100644 Nuake/src/Audio/AudioManager.h diff --git a/Editor/src/Windows/EditorInterface.cpp b/Editor/src/Windows/EditorInterface.cpp index be67b55f..92e37e56 100644 --- a/Editor/src/Windows/EditorInterface.cpp +++ b/Editor/src/Windows/EditorInterface.cpp @@ -1389,7 +1389,7 @@ namespace Nuake { if (ImGui::MenuItem("Draw collisions", NULL, m_DebugCollisions)) { m_DebugCollisions = !m_DebugCollisions; - PhysicsManager::Get()->SetDrawDebug(m_DebugCollisions); + PhysicsManager::Get().SetDrawDebug(m_DebugCollisions); } if (ImGui::MenuItem("Settings", NULL)) {} diff --git a/Nuake/Engine.cpp b/Nuake/Engine.cpp index ef474bcd..b873b9f3 100644 --- a/Nuake/Engine.cpp +++ b/Nuake/Engine.cpp @@ -5,6 +5,7 @@ #include "src/Core/Input.h" #include "src/Core/FileSystem.h" #include "src/Scripting/ScriptingEngine.h" +#include "src/Audio/AudioManager.h" #include "src/Rendering/Renderer.h" #include "src/Rendering/Renderer2D.h" @@ -29,7 +30,12 @@ namespace Nuake { Logger::Log("Nuake initializing"); - PhysicsManager::Get()->Init(); + AudioManager::Get().Initialize(); + Logger::Log("Audio engine initialized"); + + AudioManager::Get().PlayTTS("Nuake Engine debug"); + + PhysicsManager::Get().Init(); Logger::Log("Physics initialized"); // Creates the window diff --git a/Nuake/dependencies/soloud_p5.lua b/Nuake/dependencies/soloud_p5.lua new file mode 100644 index 00000000..a9467c35 --- /dev/null +++ b/Nuake/dependencies/soloud_p5.lua @@ -0,0 +1,39 @@ +project 'Soloud' + location "soloud" + + kind "StaticLib" + staticruntime "on" + warnings 'Off' + optimize 'Speed' + + targetdir ("soloud/bin/" .. outputdir .. "/%{prj.name}") + objdir ("soloud/bin-obj/" .. outputdir .. "/%{prj.name}") + + defines { + "WITH_WASAPI" + } + + includedirs { + "soloud/include" + } + + files { + "soloud/src/**.h", + "soloud/src/core/**.cpp", + "soloud/src/audiosource/**.c*", + "soloud/src/backend/wasapi/**.c*" + } + + prebuildcommands { + + } + + filter "configurations:Debug" + cppdialect "C++17" + runtime "Debug" + symbols "on" + + filter "configurations:Release" + cppdialect "C++17" + runtime "Release" + optimize "on" \ No newline at end of file diff --git a/Nuake/src/Audio/AudioManager.cpp b/Nuake/src/Audio/AudioManager.cpp new file mode 100644 index 00000000..65f48572 --- /dev/null +++ b/Nuake/src/Audio/AudioManager.cpp @@ -0,0 +1,44 @@ +#include "AudioManager.h" + +#include +#include "soloud_speech.h" +#include "soloud_thread.h" + +namespace Nuake +{ + void AudioManager::Initialize() + { + _soloud = CreateRef(); + _soloud->init(); + + _audioThreadRunning = true; + _audioThread = std::thread(&AudioManager::AudioThreadLoop, this); + } + + void AudioManager::Deinitialize() + { + _soloud->deinit(); + } + + void AudioManager::PlayTTS(const std::string& text) + { + SoLoud::Speech speech; + speech.setText(text.c_str()); + _soloud->play(speech); + + // Wait until sounds have finished + while (_soloud->getActiveVoiceCount() > 0) + { + // Still going, sleep for a bit + SoLoud::Thread::sleep(100); + } + } + + void AudioManager::AudioThreadLoop() + { + while(_audioThreadRunning) + { + + } + } +} \ No newline at end of file diff --git a/Nuake/src/Audio/AudioManager.h b/Nuake/src/Audio/AudioManager.h new file mode 100644 index 00000000..53f3ec4b --- /dev/null +++ b/Nuake/src/Audio/AudioManager.h @@ -0,0 +1,46 @@ +#pragma once +#include "src/Core/Core.h" + +#include +#include + +namespace SoLoud +{ + class Soloud; +} + +namespace Nuake +{ + // This is a singleton that manages everything for audio. + class AudioManager + { + private: + Ref _soloud; + + bool _audioThreadRunning; + std::thread _audioThread; + std::mutex _audioMutex; + + public: + AudioManager() = default; + ~AudioManager() = default; + + static AudioManager& Get() + { + static AudioManager instance; + return instance; + } + + void Initialize(); + void Deinitialize(); + + // Volume + float GetVolume() const; + void SetVolume(float volume); + + void PlayTTS(const std::string& text); + + private: + void AudioThreadLoop(); + }; +} diff --git a/Nuake/src/Core/Physics/PhysicsManager.h b/Nuake/src/Core/Physics/PhysicsManager.h index fa917139..4a854340 100644 --- a/Nuake/src/Core/Physics/PhysicsManager.h +++ b/Nuake/src/Core/Physics/PhysicsManager.h @@ -17,11 +17,10 @@ namespace Nuake bool m_DrawDebug = false; static PhysicsManager* m_Instance; public: - static PhysicsManager* Get() + static PhysicsManager& Get() { - if (!m_Instance) - m_Instance = new PhysicsManager(); - return m_Instance; + static PhysicsManager instance; + return instance; } Physics::DynamicWorld* GetWorld() { return m_World; } diff --git a/Nuake/src/Resource/Project.cpp b/Nuake/src/Resource/Project.cpp index 63f81cb1..8cefc2f8 100644 --- a/Nuake/src/Resource/Project.cpp +++ b/Nuake/src/Resource/Project.cpp @@ -70,13 +70,13 @@ namespace Nuake i >> j; // validation - std::string projectName = ""; + std::string projectName; if (!j.contains("ProjectName")) return nullptr; projectName = j["ProjectName"]; - std::string description = ""; + std::string description; if (j.contains("Description")) description = j["Description"]; diff --git a/Nuake/src/Scene/Scene.cpp b/Nuake/src/Scene/Scene.cpp index 1858cc46..3ee984ca 100644 --- a/Nuake/src/Scene/Scene.cpp +++ b/Nuake/src/Scene/Scene.cpp @@ -166,13 +166,15 @@ namespace Nuake { { std::vector allEntities; auto view = m_Registry.view(); - for (auto e : view) + for (auto& e : view) { Entity newEntity(e, this); // Check if valid for deleted entities. if (newEntity.IsValid()) + { allEntities.push_back(newEntity); + } } return allEntities; } diff --git a/Nuake/src/Scene/Systems/PhysicsSystem.cpp b/Nuake/src/Scene/Systems/PhysicsSystem.cpp index f5330892..dbd4d179 100644 --- a/Nuake/src/Scene/Systems/PhysicsSystem.cpp +++ b/Nuake/src/Scene/Systems/PhysicsSystem.cpp @@ -37,7 +37,7 @@ namespace Nuake Ref boxShape = CreateRef(boxComponent.Size); rigidBody = CreateRef(rigidBodyComponent.Mass, transform.GetGlobalPosition(), transform.GetGlobalTransform(), boxShape, ent); - PhysicsManager::Get()->RegisterBody(rigidBody); + PhysicsManager::Get().RegisterBody(rigidBody); } if (ent.HasComponent()) @@ -48,7 +48,7 @@ namespace Nuake auto capsuleShape = CreateRef(radius, height); rigidBody = CreateRef(rigidBodyComponent.Mass, transform.GetGlobalPosition(), transform.GetGlobalTransform(), capsuleShape, ent); - PhysicsManager::Get()->RegisterBody(rigidBody); + PhysicsManager::Get().RegisterBody(rigidBody); } if (ent.HasComponent()) @@ -59,7 +59,7 @@ namespace Nuake auto shape = CreateRef(component.Radius); rigidBody = CreateRef(rigidBodyComponent.Mass, transform.GetGlobalPosition(), transform.GetGlobalTransform(), shape, ent); - PhysicsManager::Get()->RegisterBody(rigidBody); + PhysicsManager::Get().RegisterBody(rigidBody); } if (ent.HasComponent()) @@ -82,7 +82,7 @@ namespace Nuake Ref mesh = submeshes[subMeshId]; auto shape = CreateRef(mesh); rigidBody = CreateRef(rigidBodyComponent.Mass, transform.GetGlobalPosition(), transform.GetGlobalTransform(), shape, ent); - PhysicsManager::Get()->RegisterBody(rigidBody); + PhysicsManager::Get().RegisterBody(rigidBody); } } } @@ -123,7 +123,7 @@ namespace Nuake btRigidbody->SetEntityID(Entity{ e, m_Scene }); brush.Rigidbody.push_back(btRigidbody); - PhysicsManager::Get()->RegisterBody(btRigidbody); + PhysicsManager::Get().RegisterBody(btRigidbody); } } @@ -209,11 +209,11 @@ namespace Nuake if (!Engine::IsPlayMode) return; - PhysicsManager::Get()->Step(ts); + PhysicsManager::Get().Step(ts); } void PhysicsSystem::Exit() { - PhysicsManager::Get()->Reset(); + PhysicsManager::Get().Reset(); } } diff --git a/Nuake/src/Scripting/Modules/PhysicsModule.h b/Nuake/src/Scripting/Modules/PhysicsModule.h index 6614f65e..ae211dd6 100644 --- a/Nuake/src/Scripting/Modules/PhysicsModule.h +++ b/Nuake/src/Scripting/Modules/PhysicsModule.h @@ -33,7 +33,7 @@ namespace Nuake { wrenGetSlotDouble(vm, 5), wrenGetSlotDouble(vm, 6)); - RaycastResult result = PhysicsManager::Get()->Raycast(v1, v2); + RaycastResult result = PhysicsManager::Get().Raycast(v1, v2); wrenSetSlotNewList(vm, 0); // Returns a list with 3 vectors placed sequentially diff --git a/premake5.lua b/premake5.lua index cf393941..967246a5 100644 --- a/premake5.lua +++ b/premake5.lua @@ -13,6 +13,7 @@ include "Nuake/dependencies/glfw_p5.lua" include "Nuake/dependencies/assimp_p5.lua" include "Nuake/dependencies/freetype_p5.lua" include "Nuake/dependencies/jolt_p5.lua" +include "Nuake/dependencies/soloud_p5.lua" project "Nuake" location "Nuake" @@ -58,12 +59,14 @@ project "Nuake" "%{prj.name}/../Nuake/src/Vendors/msdfgen/freetype/include", "%{prj.name}/../Nuake/src/Vendors/msdfgen", "%{prj.name}/../Nuake/src/Vendors/wren/src/include", - "%{prj.name}/../Nuake/Dependencies/build" + "%{prj.name}/../Nuake/Dependencies/build", + "%{prj.name}/../Nuake/Dependencies/soloud/include" } links { - "Freetype" + "Freetype", + "soloud" } filter "system:windows" @@ -103,7 +106,8 @@ project "Editor" "%{prj.name}/../Nuake/Dependencies/build", "%{prj.name}/../Nuake/src/Vendors/msdfgen", "%{prj.name}/../Nuake/Dependencies/JoltPhysics", - "%{prj.name}/../Nuake/Dependencies/build" + "%{prj.name}/../Nuake/Dependencies/build", + "%{prj.name}/../Nuake/Dependencies/soloud/include" } libdirs @@ -116,7 +120,8 @@ project "Editor" "%{prj.name}/../Nuake/src/Vendors/msdfgen/freetype/win64", "%{prj.name}/../Nuake/src/Vendors/msdfgen", "%{prj.name}/../Nuake/src/Vendors/wren/src/include", - "%{prj.name}/../Nuake/dependencies/JoltPhysics/bin/%{cfg.buildcfg}-%{cfg.system}-%{cfg.architecture}/JoltPhysics/" + "%{prj.name}/../Nuake/dependencies/JoltPhysics/bin/%{cfg.buildcfg}-%{cfg.system}-%{cfg.architecture}/JoltPhysics/", + "%{prj.name}/../Nuake/dependencies/soloud/bin/%{cfg.buildcfg}-%{cfg.system}-%{cfg.architecture}" } links @@ -127,7 +132,8 @@ project "Editor" "glew32s.lib", "opengl32.lib", "Freetype", - "JoltPhysics" + "JoltPhysics", + "soloud" } filter "system:windows"