From f3eeedc91a04ca0651e0fe78a2119e7e3e38e391 Mon Sep 17 00:00:00 2001 From: Loek Le Blansch Date: Wed, 25 Sep 2024 17:36:31 +0200 Subject: WIP Audio API + facade --- lib/soloud/CMakeLists.txt | 2 +- src/CMakeLists.txt | 13 ++++++++++++- src/crepe/CMakeLists.txt | 7 +++++-- src/crepe/Sound.cpp | 9 +++++++++ src/crepe/Sound.h | 30 ++++++++++++++++++++++++++++++ src/crepe/api/AudioSource.cpp | 25 +++++++++++++++++++++++++ src/crepe/api/AudioSource.h | 42 ++++++++++++++++++++++++++++++++++++++++++ src/crepe/api/CMakeLists.txt | 4 ++++ src/crepe/api/Component.h | 11 +++++++++++ src/crepe/api/Resource.h | 17 +++++++++++++++++ src/crepe/main.cpp | 3 --- src/crepe/util/CMakeLists.txt | 0 src/crepe/util/debug.cpp | 0 src/crepe/util/debug.h | 0 test/CMakeLists.txt | 6 ++++-- test/audio.cpp | 29 +++++++++++++++++++++++++++++ 16 files changed, 189 insertions(+), 9 deletions(-) create mode 100644 src/crepe/Sound.cpp create mode 100644 src/crepe/Sound.h create mode 100644 src/crepe/api/AudioSource.cpp create mode 100644 src/crepe/api/AudioSource.h create mode 100644 src/crepe/api/CMakeLists.txt create mode 100644 src/crepe/api/Component.h create mode 100644 src/crepe/api/Resource.h delete mode 100644 src/crepe/main.cpp create mode 100644 src/crepe/util/CMakeLists.txt create mode 100644 src/crepe/util/debug.cpp create mode 100644 src/crepe/util/debug.h create mode 100644 test/audio.cpp diff --git a/lib/soloud/CMakeLists.txt b/lib/soloud/CMakeLists.txt index 8433281..aaccd96 100644 --- a/lib/soloud/CMakeLists.txt +++ b/lib/soloud/CMakeLists.txt @@ -9,7 +9,7 @@ add_subdirectory(../sdl2 sdl2) project(soloud C CXX) -add_library(soloud STATIC +add_library(soloud SHARED src/src/audiosource/ay/chipplayer.cpp src/src/audiosource/ay/sndbuffer.cpp src/src/audiosource/ay/sndchip.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0090188..cc71435 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -8,9 +8,20 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS 1) set(CMAKE_BUILD_TYPE Debug) add_compile_definitions(DEBUG) +add_subdirectory(../lib/soloud soloud) + project(crepe C CXX) -add_executable(main) +add_library(crepe SHARED) + +target_include_directories(crepe + SYSTEM INTERFACE . +) + +# NOTE: all libraries *must* be linked as PRIVATE +target_link_libraries(crepe + PRIVATE soloud +) add_subdirectory(crepe) diff --git a/src/crepe/CMakeLists.txt b/src/crepe/CMakeLists.txt index 392b7d7..aa64262 100644 --- a/src/crepe/CMakeLists.txt +++ b/src/crepe/CMakeLists.txt @@ -1,3 +1,6 @@ -target_sources(main PUBLIC - main.cpp +target_sources(crepe PUBLIC + Sound.cpp ) + +add_subdirectory(api) + diff --git a/src/crepe/Sound.cpp b/src/crepe/Sound.cpp new file mode 100644 index 0000000..f45a697 --- /dev/null +++ b/src/crepe/Sound.cpp @@ -0,0 +1,9 @@ +#include "Sound.h" + +using namespace crepe; + +Sound::Sound(std::unique_ptr res) { + _res = std::move(res); +} + + diff --git a/src/crepe/Sound.h b/src/crepe/Sound.h new file mode 100644 index 0000000..ac4b7f4 --- /dev/null +++ b/src/crepe/Sound.h @@ -0,0 +1,30 @@ +#pragma once + +#include + +#include + +#include "api/Resource.h" + +namespace crepe { + +class Sound { +public: + Sound(std::unique_ptr res); + virtual ~Sound() = default; + +public: + void pause(); + void play(); + void rewind(); + void set_volume(float volume); + void set_looping(bool looping); + +private: + std::unique_ptr _res; + SoLoud::handle _handle; + bool _paused; +}; + +} + diff --git a/src/crepe/api/AudioSource.cpp b/src/crepe/api/AudioSource.cpp new file mode 100644 index 0000000..cbde79f --- /dev/null +++ b/src/crepe/api/AudioSource.cpp @@ -0,0 +1,25 @@ +#include "AudioSource.h" + +#include "../Sound.h" +#include + +using namespace crepe::api; + +AudioSource::AudioSource(std::unique_ptr audio_clip) { + this->_sound = std::make_unique(std::move(audio_clip)); +} + +void AudioSource::play() { + return this->play(false); +} + +void AudioSource::play(bool looping) { + this->_sound->set_looping(looping); + this->_sound->play(); +} + +void AudioSource::stop() { + this->_sound->pause(); + this->_sound->rewind(); +} + diff --git a/src/crepe/api/AudioSource.h b/src/crepe/api/AudioSource.h new file mode 100644 index 0000000..6a038be --- /dev/null +++ b/src/crepe/api/AudioSource.h @@ -0,0 +1,42 @@ +#pragma once + +#include + +#include "Component.h" +#include "Resource.h" + +namespace crepe { +class Sound; +} + +namespace crepe::api { + +//! Audio source component +class AudioSource : Component { +public: + AudioSource(std::unique_ptr audio_clip); + virtual ~AudioSource() = default; + +public: + //! Start or resume this audio source + void play(); + void play(bool looping); + //! Stop this audio source + void stop(); + +public: + //! Sample file location + std::unique_ptr audio_clip; + //! TODO: ????? + bool play_on_awake; + //! Repeat the current audio clip during playback + bool loop; + //! Normalized volume (0.0 - 1.0) + float volume; + +private: + std::unique_ptr _sound; +}; + +} + diff --git a/src/crepe/api/CMakeLists.txt b/src/crepe/api/CMakeLists.txt new file mode 100644 index 0000000..94617a4 --- /dev/null +++ b/src/crepe/api/CMakeLists.txt @@ -0,0 +1,4 @@ +target_sources(crepe PUBLIC + AudioSource.cpp +) + diff --git a/src/crepe/api/Component.h b/src/crepe/api/Component.h new file mode 100644 index 0000000..2abb461 --- /dev/null +++ b/src/crepe/api/Component.h @@ -0,0 +1,11 @@ +#pragma once + +namespace crepe::api { + +class Component { +public: + bool active; +}; + +} + diff --git a/src/crepe/api/Resource.h b/src/crepe/api/Resource.h new file mode 100644 index 0000000..620a10e --- /dev/null +++ b/src/crepe/api/Resource.h @@ -0,0 +1,17 @@ +#pragma once + +#include + +namespace crepe::api { + +class Resource { +public: + Resource(const std::string & source); + virtual ~Resource(); + +private: + std::string _source; +}; + +} + diff --git a/src/crepe/main.cpp b/src/crepe/main.cpp deleted file mode 100644 index 8e9a184..0000000 --- a/src/crepe/main.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include - -int main() { printf("Hello World!\n"); } diff --git a/src/crepe/util/CMakeLists.txt b/src/crepe/util/CMakeLists.txt new file mode 100644 index 0000000..e69de29 diff --git a/src/crepe/util/debug.cpp b/src/crepe/util/debug.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/crepe/util/debug.h b/src/crepe/util/debug.h new file mode 100644 index 0000000..e69de29 diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 26aa460..d103b9a 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -9,13 +9,15 @@ set(CMAKE_BUILD_TYPE Debug) project(test C CXX) add_subdirectory(../lib/googletest googletest) +add_subdirectory(../src crepe) add_executable(test dummy.cpp + audio.cpp ) target_link_libraries(test - gtest_main - # TODO: add crepe engine + PRIVATE gtest_main + PUBLIC crepe # TODO: this does not work properly ) diff --git a/test/audio.cpp b/test/audio.cpp new file mode 100644 index 0000000..a415919 --- /dev/null +++ b/test/audio.cpp @@ -0,0 +1,29 @@ +#include +#include + +#include +#include + +#include +#include + +using namespace std; +using namespace std::chrono_literals; + +using namespace crepe::api; + +// TODO: mock internal audio class + +TEST(audio, play) { + auto res = std::make_unique("../mwe/audio/bgm.ogg"); + auto bgm = AudioSource(std::move(res)); + + bgm.play(); + + this_thread::sleep_for(2s); + + bgm.stop(); + + ASSERT_TRUE(true); +} + -- cgit v1.2.3