From 9f8f75c7431a3856e55121e9eb691a32ea4ead84 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Mon, 15 Apr 2024 14:36:08 +0200 Subject: [PATCH 1/2] Add IAudioEngine interface with volume methods --- src/audio/CMakeLists.txt | 3 +++ src/audio/iaudioengine.h | 21 +++++++++++++++++ src/audio/internal/audioengine.cpp | 30 +++++++++++++++++++++---- src/audio/internal/audioengine.h | 16 ++++++++++--- src/audio/internal/audioenginestub.cpp | 26 +++++++++++++++++++++ src/audio/internal/audioenginestub.h | 24 ++++++++++++++++++++ src/audio/internal/audioplayer.cpp | 1 + test/audio/CMakeLists.txt | 18 +++++++++++++++ test/audio/audioengine_test.cpp | 31 ++++++++++++++++++++++++++ test/mocks/audioenginemock.h | 13 +++++++++++ 10 files changed, 176 insertions(+), 7 deletions(-) create mode 100644 src/audio/iaudioengine.h create mode 100644 src/audio/internal/audioenginestub.cpp create mode 100644 src/audio/internal/audioenginestub.h create mode 100644 test/audio/audioengine_test.cpp create mode 100644 test/mocks/audioenginemock.h diff --git a/src/audio/CMakeLists.txt b/src/audio/CMakeLists.txt index 5bf4e0b3..536c266b 100644 --- a/src/audio/CMakeLists.txt +++ b/src/audio/CMakeLists.txt @@ -15,6 +15,7 @@ endif() target_sources(scratchcpp-audio PUBLIC + iaudioengine.h iaudioplayer.h iaudiooutput.h audiooutput.cpp @@ -38,6 +39,8 @@ if (LIBSCRATCHCPP_AUDIO_SUPPORT) else() target_sources(scratchcpp-audio PUBLIC + internal/audioenginestub.cpp + internal/audioenginestub.h internal/audioplayerstub.cpp internal/audioplayerstub.h internal/audioloudnessstub.cpp diff --git a/src/audio/iaudioengine.h b/src/audio/iaudioengine.h new file mode 100644 index 00000000..8100334b --- /dev/null +++ b/src/audio/iaudioengine.h @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include + +namespace libscratchcpp +{ + +class IAudioEngine +{ + public: + virtual ~IAudioEngine() { } + + static IAudioEngine *instance(); + + virtual float volume() const = 0; + virtual void setVolume(float volume) = 0; +}; + +} // namespace libscratchcpp diff --git a/src/audio/internal/audioengine.cpp b/src/audio/internal/audioengine.cpp index 710a394e..1af3874d 100644 --- a/src/audio/internal/audioengine.cpp +++ b/src/audio/internal/audioengine.cpp @@ -1,6 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 #include +#include #include "audioengine.h" @@ -8,12 +9,17 @@ using namespace libscratchcpp; AudioEngine AudioEngine::instance; +IAudioEngine *IAudioEngine::instance() +{ + return &AudioEngine::instance; +} + ma_engine *AudioEngine::engine() { if (!instance.m_initialized) instance.init(); - return instance.m_initialized ? &instance.m_engine : nullptr; + return instance.m_initialized ? instance.m_engine : nullptr; } bool AudioEngine::initialized() @@ -24,20 +30,36 @@ bool AudioEngine::initialized() return instance.m_initialized; } +float AudioEngine::volume() const +{ + return m_volume; +} + +void AudioEngine::setVolume(float volume) +{ + m_volume = volume; + + if (m_initialized) + ma_engine_set_volume(m_engine, volume); +} + AudioEngine::AudioEngine() { } AudioEngine::~AudioEngine() { - if (m_initialized) - ma_engine_uninit(&m_engine); + if (m_initialized && m_engine) { + ma_engine_uninit(m_engine); + delete m_engine; + } } void AudioEngine::init() { ma_result result; - result = ma_engine_init(NULL, &m_engine); + m_engine = new ma_engine; + result = ma_engine_init(NULL, m_engine); if (result != MA_SUCCESS) { std::cerr << "Failed to initialize audio engine." << std::endl; diff --git a/src/audio/internal/audioengine.h b/src/audio/internal/audioengine.h index 49097871..02672ff3 100644 --- a/src/audio/internal/audioengine.h +++ b/src/audio/internal/audioengine.h @@ -3,18 +3,26 @@ #pragma once #include -#include + +#include "../iaudioengine.h" + +struct ma_engine; namespace libscratchcpp { // This is a singleton which initializes and uninitializes the miniaudio engine -class AudioEngine +class AudioEngine : public IAudioEngine { public: + friend class IAudioEngine; + static ma_engine *engine(); static bool initialized(); + float volume() const override; + void setVolume(float volume) override; + private: AudioEngine(); ~AudioEngine(); @@ -22,8 +30,10 @@ class AudioEngine void init(); static AudioEngine instance; - ma_engine m_engine; + + ma_engine *m_engine = nullptr; bool m_initialized = false; + float m_volume = 1.0f; }; } // namespace libscratchcpp diff --git a/src/audio/internal/audioenginestub.cpp b/src/audio/internal/audioenginestub.cpp new file mode 100644 index 00000000..83b8bd45 --- /dev/null +++ b/src/audio/internal/audioenginestub.cpp @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: Apache-2.0 + +#include "audioenginestub.h" + +using namespace libscratchcpp; + +AudioEngineStub AudioEngineStub::instance; + +IAudioEngine *IAudioEngine::instance() +{ + return &AudioEngineStub::instance; +} + +AudioEngineStub::AudioEngineStub() +{ +} + +float AudioEngineStub::volume() const +{ + return m_volume; +} + +void AudioEngineStub::setVolume(float volume) +{ + m_volume = volume; +} diff --git a/src/audio/internal/audioenginestub.h b/src/audio/internal/audioenginestub.h new file mode 100644 index 00000000..e49e076c --- /dev/null +++ b/src/audio/internal/audioenginestub.h @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include "../iaudioengine.h" + +namespace libscratchcpp +{ + +class AudioEngineStub : public IAudioEngine +{ + public: + friend class IAudioEngine; + AudioEngineStub(); + + float volume() const override; + void setVolume(float volume) override; + + private: + static AudioEngineStub instance; + float m_volume = 1.0f; +}; + +} // namespace libscratchcpp diff --git a/src/audio/internal/audioplayer.cpp b/src/audio/internal/audioplayer.cpp index e7cc03a5..4bb4922d 100644 --- a/src/audio/internal/audioplayer.cpp +++ b/src/audio/internal/audioplayer.cpp @@ -2,6 +2,7 @@ #include #include +#include #include "audioplayer.h" #include "audioengine.h" diff --git a/test/audio/CMakeLists.txt b/test/audio/CMakeLists.txt index c4aba7b4..40897a6e 100644 --- a/test/audio/CMakeLists.txt +++ b/test/audio/CMakeLists.txt @@ -1,3 +1,21 @@ +# audioengine_test +add_executable( + audioengine_test + audioengine_test.cpp +) + +target_link_libraries( + audioengine_test + GTest::gtest_main + scratchcpp +) + +gtest_discover_tests(audioengine_test) + +if (LIBSCRATCHCPP_AUDIO_SUPPORT) + target_compile_definitions(audioengine_test PRIVATE LIBSCRATCHCPP_AUDIO_SUPPORT) +endif() + # audiooutput_test add_executable( audiooutput_test diff --git a/test/audio/audioengine_test.cpp b/test/audio/audioengine_test.cpp new file mode 100644 index 00000000..e0476858 --- /dev/null +++ b/test/audio/audioengine_test.cpp @@ -0,0 +1,31 @@ +#ifdef LIBSCRATCHCPP_AUDIO_SUPPORT +#include