From a40c0665ac2b5a719fe0b9ff516a46ca33be48bb Mon Sep 17 00:00:00 2001 From: cat Date: Fri, 5 Sep 2025 12:09:33 +0300 Subject: [PATCH] Added Listeners instead of single engine listener --- CMakeLists.txt | 5 +++-- src/ChargeAudio.hpp | 21 ++++++++++++++++++--- src/Engine.cpp | 20 ++++++++------------ src/Listener.cpp | 19 +++++++++++++++++++ 4 files changed, 48 insertions(+), 17 deletions(-) create mode 100644 src/Listener.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 55e506b..bfa4be7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,8 +19,9 @@ pkg_check_modules(AVCODEC REQUIRED libavcodec) pkg_check_modules(AVUTIL REQUIRED libavutil) pkg_check_modules(SWRESAMPLE REQUIRED libswresample) -add_library(ChargeAudio SHARED "src/ChargeAudio.hpp" "src/Engine.cpp" - "src/Sound.cpp" "lib/miniaudio/miniaudio.c") +add_library( + ChargeAudio SHARED "src/ChargeAudio.hpp" "src/Engine.cpp" "src/Sound.cpp" + "src/Listener.cpp" "lib/miniaudio/miniaudio.c") target_link_libraries( ChargeAudio diff --git a/src/ChargeAudio.hpp b/src/ChargeAudio.hpp index 723d07a..196d87b 100644 --- a/src/ChargeAudio.hpp +++ b/src/ChargeAudio.hpp @@ -30,20 +30,35 @@ private: friend class Engine; }; +class Listener { +public: + void SetPosition(Magnum::Vector3 position); + Magnum::Vector3 GetPosition(); + +private: + Listener(); + class Engine *baseEngine; + ma_uint64 listenerID; + friend class Engine; +}; + class Engine { public: Engine(); ~Engine(); - Containers::Pointer CreateSound(std::string filepath); - void SetPosition(Magnum::Vector3 position); - Magnum::Vector3 GetPosition(); + // Creating tools + Containers::Pointer CreateSound(std::string filepath); + Containers::Pointer CreateListener(); + void SetVolume(float value); float GetVolume(); private: ma_engine maEngine; ma_result maResponse; + ma_uint64 listenerCounter = 0; + friend class Listener; }; } // namespace ChargeAudio diff --git a/src/Engine.cpp b/src/Engine.cpp index c819cb1..d332b8f 100644 --- a/src/Engine.cpp +++ b/src/Engine.cpp @@ -32,21 +32,17 @@ Containers::Pointer Engine::CreateSound(std::string filepath) { throw new std::runtime_error( "Failed to create the sound from file. Check STDERR for more info."); } - return sound; } +Containers::Pointer Engine::CreateListener() { + auto listener = Containers::Pointer(new Listener()); + listener->baseEngine = this; + listener->listenerID = listenerCounter++; + + return listener; +} + // Controls -void Engine::SetPosition(Magnum::Vector3 position) { - ma_engine_listener_set_position(&maEngine, 0, position.x(), position.y(), - position.z()); -} - -Magnum::Vector3 Engine::GetPosition() { - ma_vec3f pos = ma_engine_listener_get_position(&maEngine, 0); - return Magnum::Vector3(pos.x, pos.y, pos.z); - ; -} - void Engine::SetVolume(float value) { ma_engine_set_volume(&maEngine, value); } float Engine::GetVolume() { return ma_engine_get_volume(&maEngine); } diff --git a/src/Listener.cpp b/src/Listener.cpp new file mode 100644 index 0000000..54e5342 --- /dev/null +++ b/src/Listener.cpp @@ -0,0 +1,19 @@ +#include "ChargeAudio.hpp" +#include + +using namespace ChargeAudio; + +Listener::Listener() {} + +// Controls +void Listener::SetPosition(Magnum::Vector3 position) { + ma_engine_listener_set_position(&baseEngine->maEngine, listenerID, + position.x(), position.y(), position.z()); +} + +Magnum::Vector3 Listener::GetPosition() { + ma_vec3f pos = + ma_engine_listener_get_position(&baseEngine->maEngine, listenerID); + return Magnum::Vector3(pos.x, pos.y, pos.z); + ; +}