From 7deef89f588389686283aca2ac574d59b6db766e Mon Sep 17 00:00:00 2001 From: SpinnerX Date: Sun, 4 Jan 2026 13:53:35 -0800 Subject: [PATCH 01/23] WIP in getting modules to work with audio-cpp --- CMakeLists.txt | 45 +++++++++++++++-- audio-cpp/CMakeLists.txt | 3 ++ audio-cpp/audio.cppm | 9 ++++ audio-cpp/audio_reader.hpp | 33 ------------ audio-cpp/decoder.h | 25 --------- audio-cpp/drivers/audio_context.hpp | 11 ---- audio-cpp/drivers/audio_device.hpp | 14 ------ audio-cpp/sound.cppm | 78 +++++++++++++++++++++++++++++ audio-cpp/sound.hpp | 26 ---------- audio-cpp/utilities.hpp | 7 --- conanfile.py | 45 +++++++---------- demo/CMakeLists.txt | 2 + demo/application.cpp | 4 +- demo/conanfile.py | 9 ++-- src/CMakeLists.txt | 11 ---- src/audio-cpp/decoder.cpp | 30 ----------- src/audio-cpp/sound.cpp | 62 ----------------------- src/audio-cpp/utilities.cpp | 0 tests/basic_audio.test.cpp | 5 ++ 19 files changed, 162 insertions(+), 257 deletions(-) create mode 100644 audio-cpp/CMakeLists.txt create mode 100644 audio-cpp/audio.cppm delete mode 100644 audio-cpp/audio_reader.hpp delete mode 100644 audio-cpp/decoder.h delete mode 100644 audio-cpp/drivers/audio_context.hpp delete mode 100644 audio-cpp/drivers/audio_device.hpp create mode 100644 audio-cpp/sound.cppm delete mode 100644 audio-cpp/sound.hpp delete mode 100644 audio-cpp/utilities.hpp delete mode 100644 src/CMakeLists.txt delete mode 100644 src/audio-cpp/decoder.cpp delete mode 100644 src/audio-cpp/sound.cpp delete mode 100644 src/audio-cpp/utilities.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index f80c8b8..17d5578 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,11 @@ -cmake_minimum_required(VERSION 3.25) -project(audio-cpp LANGUAGES C CXX) +cmake_minimum_required(VERSION 3.28) + +set(CMAKE_COLOR_DIAGNOSTICS ON) + +project(audio-cpp LANGUAGES CXX) build_library( - DIRECTORIES src + DIRECTORIES audio-cpp ENABLE_TESTS ON @@ -17,6 +20,38 @@ build_library( miniaudio::miniaudio ) -generate_compile_commands() +# find_package(miniaudio REQUIRED) + +# add_library(audio-cpp STATIC) + +# target_link_libraries(${PROJECT_NAME} PUBLIC miniaudio::miniaudio) + +target_compile_features(audio-cpp PUBLIC cxx_std_23) + +# generate_compile_commands() + +target_sources(${PROJECT_NAME} PUBLIC + FILE_SET CXX_MODULES + TYPE CXX_MODULES + FILES + audio-cpp/audio.cppm + audio-cpp/sound.cppm +) + +install( + TARGETS audio-cpp + EXPORT audio-cpp_targets + FILE_SET CXX_MODULES DESTINATION "." + LIBRARY DESTINATION "lib" + ARCHIVE DESTINATION "lib" + CXX_MODULES_BMI DESTINATION "bmi" +) -target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR}) +install( + EXPORT audio-cpp_targets + FILE "audio-cpp-config.cmake" + NAMESPACE audio:: + DESTINATION "lib/cmake" + CXX_MODULES_DIRECTORY "cxx-modules" + EXPORT_PACKAGE_DEPENDENCIES +) \ No newline at end of file diff --git a/audio-cpp/CMakeLists.txt b/audio-cpp/CMakeLists.txt new file mode 100644 index 0000000..431f807 --- /dev/null +++ b/audio-cpp/CMakeLists.txt @@ -0,0 +1,3 @@ + + +add_library(${PROJECT_NAME} STATIC) diff --git a/audio-cpp/audio.cppm b/audio-cpp/audio.cppm new file mode 100644 index 0000000..68e6f62 --- /dev/null +++ b/audio-cpp/audio.cppm @@ -0,0 +1,9 @@ +module; + +export module audio; + +export import :sound; + + +export namespace audio::inline v1 { +}; \ No newline at end of file diff --git a/audio-cpp/audio_reader.hpp b/audio-cpp/audio_reader.hpp deleted file mode 100644 index 158d630..0000000 --- a/audio-cpp/audio_reader.hpp +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#include -#include -#include - -namespace audio { - /** - * @note Audio Reader takes in any type of audio file. - * @note Using this API allows you to control how you read in that data. - * @note Such as ReadInt, ReadAs, ReadFloat, ReadString, etc. - * - */ - class audio_reader { - public: - audio_reader(const std::string& p_filename); - - bool is_valid() const { return m_is_audio_stream_valid; } - - //! @note We are reading data from a specified audio file - //! @param p_Filename is the location of the audiofile we are reading - //! from. - //! @note Basically should allow us to read in those files and play - //! them. - static std::span read(const std::string& p_filename); - - template - T ReadAs() {} - - private: - bool m_is_audio_stream_valid = false; - }; -}; \ No newline at end of file diff --git a/audio-cpp/decoder.h b/audio-cpp/decoder.h deleted file mode 100644 index 90b76c4..0000000 --- a/audio-cpp/decoder.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once -#include - -namespace audio { - /** - * @name decoder - * @note Custom decoder for decoding audio data. - */ - class decoder { - public: - //! @note users should not be able to create a non-init decoder - decoder() = delete; - - /** - * @param format defines the sample format - */ - decoder(uint32_t format, uint32_t channels, uint32_t sample_rate); - - /** - * @param device_config is to set the device_config for the decoder - */ - decoder(uint32_t device_config); - // private: - }; -}; diff --git a/audio-cpp/drivers/audio_context.hpp b/audio-cpp/drivers/audio_context.hpp deleted file mode 100644 index 8a1b606..0000000 --- a/audio-cpp/drivers/audio_context.hpp +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -namespace audio { - /** - * @brief Low-level audio context for setting up miniaudio - */ - class audio_context { - public: - audio_context() = default; - }; -}; \ No newline at end of file diff --git a/audio-cpp/drivers/audio_device.hpp b/audio-cpp/drivers/audio_device.hpp deleted file mode 100644 index e9f4fae..0000000 --- a/audio-cpp/drivers/audio_device.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once -#include - -namespace audio { - class device_enumeration { - public: - device_enumeration() { - ma_context test_context; - if (ma_context_init(nullptr, 0, nullptr, &test_context) != - MA_SUCCESS) { - } - } - }; -}; \ No newline at end of file diff --git a/audio-cpp/sound.cppm b/audio-cpp/sound.cppm new file mode 100644 index 0000000..2dceac1 --- /dev/null +++ b/audio-cpp/sound.cppm @@ -0,0 +1,78 @@ +module; + +#include +#include + +export module audio:sound; + +export namespace audio::inline v1 { + void data_callback(ma_device* p_device, + /*NOLINT*/void* p_output, + /*NOLINT*/ const void* p_input, + ma_uint32 p_frame_count) { + ma_decoder* decoder = (ma_decoder*)p_device->pUserData; + if (decoder == nullptr) { + return; + } + + ma_decoder_read_pcm_frames(decoder, p_output, p_frame_count, NULL); + + (void)p_input; + } + + /** + * @note Sound abstraction around the miniaudio API + * + */ + class sound { + public: + sound(const std::string& p_filename) { + ma_decoder_init_file(p_filename.c_str(), nullptr, &m_decoder); + + m_audio_device_config = ma_device_config_init(ma_device_type_playback); + + m_audio_device_config.playback.format = m_decoder.outputFormat; + m_audio_device_config.playback.channels = m_decoder.outputChannels; + m_audio_device_config.sampleRate = m_decoder.outputSampleRate; + m_audio_device_config.dataCallback = data_callback; + m_audio_device_config.pUserData = &m_decoder; + + auto res = ma_device_init( + nullptr, &m_audio_device_config, &m_audio_device_handler); + if (res != MA_SUCCESS) { + cleanup(); + return; + } + } + + ~sound() { + cleanup(); + } + + void on_play() { + auto res = ma_device_start(&m_audio_device_handler); + if (res != MA_SUCCESS) { + cleanup(); + } + } + + void on_stop() { + auto res = ma_device_stop(&m_audio_device_handler); + + if (res != MA_SUCCESS) { + cleanup(); + } + } + + private: + void cleanup() { + ma_device_uninit(&m_audio_device_handler); + ma_decoder_uninit(&m_decoder); + } + + private: + ma_decoder m_decoder; + ma_device m_audio_device_handler; + ma_device_config m_audio_device_config; + }; +}; diff --git a/audio-cpp/sound.hpp b/audio-cpp/sound.hpp deleted file mode 100644 index 2fdaab2..0000000 --- a/audio-cpp/sound.hpp +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once -#include -#include - -namespace audio { - /** - * @note Sound abstraction around the miniaudio API - * - */ - class sound { - public: - sound(const std::string& p_filename); - ~sound(); - - void on_play(); - void on_stop(); - - private: - void cleanup(); - - private: - ma_decoder m_decoder; - ma_device m_audio_device_handler; - ma_device_config m_audio_device_config; - }; -}; diff --git a/audio-cpp/utilities.hpp b/audio-cpp/utilities.hpp deleted file mode 100644 index 85abce3..0000000 --- a/audio-cpp/utilities.hpp +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once -#include -#include - -namespace audio { - void stream_write(std::span>& p_Buffer); -}; \ No newline at end of file diff --git a/conanfile.py b/conanfile.py index 82fd141..bf8fe47 100644 --- a/conanfile.py +++ b/conanfile.py @@ -5,36 +5,29 @@ import os import glob import hashlib -# from conan.tools.files import find_files class AudioRecipe(ConanFile): name = "audio-cpp" - version = "1.0" + version = "2.0" package_type = "library" license = "Apache-2.0" - homepage = "https://github.com/engine3d-dev/engine3d-audio" + homepage = "https://github.com/engine3d-dev/audio-cpp" # Binary configuration settings = "os", "compiler", "build_type", "arch" options = {"shared": [True, False], "fPIC": [True, False]} default_options = {"shared": False, "fPIC": True} - exports_sources = "CMakeLists.txt", "src/CMakeLists.txt" + exports_sources = "CMakeLists.txt", "audio-cpp/*", "tests/*" def build_requirements(self): - self.tool_requires("make/4.4.1") - self.tool_requires("cmake/3.27.1") + self.tool_requires("ninja/1.13.2") + self.tool_requires("cmake/4.2.1") self.tool_requires("engine3d-cmake-utils/4.0") + self.tool_requires("cmake-modules-toolchain/1.0.3") self.requires("boost-ext-ut/2.1.0") def requirements(self): self.requires("miniaudio/1.0") - - # This is how exporting the sources work - def export_sources(self): - copy(self,"CMakeLists.txt", self.recipe_folder, self.export_sources_folder) - copy(self,"*.hpp", self.recipe_folder, self.export_sources_folder) - copy(self,"*.h", self.recipe_folder, self.export_sources_folder) - copy(self,"*.cpp", self.recipe_folder, self.export_sources_folder) def layout(self): cmake_layout(self) @@ -44,6 +37,7 @@ def generate(self): deps.generate() tc = CMakeToolchain(self) + tc.generator = "Ninja" tc.generate() def file_changed(self, filepath, previous_hash=None): @@ -77,15 +71,15 @@ def file_changed(self, filepath, previous_hash=None): def build(self): # Directory to the files tests get generated - gcda_tests_dir = os.path.join(self.build_folder, "CMakeFiles/unit_test.dir/tests") - tests_dir = os.path.join(self.source_folder, "tests"); - tests_files = os.path.join(tests_dir, "*.test.cpp") + # gcda_tests_dir = os.path.join(self.build_folder, "CMakeFiles/unit_test.dir/tests") + # tests_dir = os.path.join(self.source_folder, "tests"); + # tests_files = os.path.join(tests_dir, "*.test.cpp") - gcda_files = os.path.join(gcda_tests_dir, "*.gcda") + # gcda_files = os.path.join(gcda_tests_dir, "*.gcda") - if os.path.exists(gcda_tests_dir): - for file in glob.glob(gcda_files): - os.remove(file) + # if os.path.exists(gcda_tests_dir): + # for file in glob.glob(gcda_files): + # os.remove(file) cmake = CMake(self) cmake.verbose = True @@ -95,17 +89,12 @@ def build(self): def package(self): copy(self, "LICENSE", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses")) - copy(self, pattern="*.h", src=os.path.join(self.source_folder, "audio-cpp"), dst=os.path.join(self.package_folder, "audio-cpp")) - copy(self, pattern="*.hpp", src=os.path.join(self.source_folder, "audio-cpp"), dst=os.path.join(self.package_folder, "audio-cpp")) - copy(self, pattern="*.a", src=self.build_folder, dst=os.path.join(self.package_folder, "lib"), keep_path=False) - copy(self, pattern="*.so", src=self.build_folder, dst=os.path.join(self.package_folder, "lib"), keep_path=False) - copy(self, pattern="*.lib", src=self.build_folder, dst=os.path.join(self.package_folder, "lib"), keep_path=False) - copy(self, pattern="*.dll", src=self.build_folder, dst=os.path.join(self.package_folder, "bin"), keep_path=False) - copy(self, pattern="*.dylib", src=self.build_folder, dst=os.path.join(self.package_folder, "lib"), keep_path=False) cmake = CMake(self) cmake.install() def package_info(self): + self.cpp_info.set_property("cmake_find_node", "none") self.cpp_info.set_property("cmake_target_name", "audio-cpp::audio-cpp") self.cpp_info.libs = ["audio-cpp"] - self.cpp_info.includedirs = ['./', './audio-cpp'] + self.cpp_info.includedirs = ['./audio-cpp'] + self.cpp_info.builddirs.append("lib/cmake") diff --git a/demo/CMakeLists.txt b/demo/CMakeLists.txt index ec9b7a3..3f23038 100644 --- a/demo/CMakeLists.txt +++ b/demo/CMakeLists.txt @@ -1,4 +1,6 @@ cmake_minimum_required(VERSION 3.15) +set(CMAKE_COLOR_DIAGNOSTICS ON) + project(demo CXX) build_application( diff --git a/demo/application.cpp b/demo/application.cpp index dcc50ad..62f97fd 100644 --- a/demo/application.cpp +++ b/demo/application.cpp @@ -1,5 +1,7 @@ #include -#include +// #include +import audio; +// import audio-sound; using namespace std; int diff --git a/demo/conanfile.py b/demo/conanfile.py index db81597..6175977 100644 --- a/demo/conanfile.py +++ b/demo/conanfile.py @@ -6,18 +6,19 @@ class Demo(ConanFile): version = "1.0" settings = "os", "compiler", "build_type", "arch" generators = "CMakeDeps", "CMakeToolchain" - export_source = "CMakeLists.txt", "application.cpp" + export_source = "CMakeLists.txt", "audio-cpp/*" # Putting all of your build-related dependencies here def build_requirements(self): - self.tool_requires("make/4.4.1") - self.tool_requires("cmake/3.27.1") + self.tool_requires("ninja/1.13.2") + self.tool_requires("cmake/4.2.1") + self.tool_requires("cmake-modules-toolchain/1.0.3") self.tool_requires("engine3d-cmake-utils/3.0") # Putting all of your packages here def requirements(self): + self.requires("audio-cpp/2.0") self.requires("miniaudio/1.0") - self.requires("audio-cpp/1.0") def build(self): cmake = CMake(self) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt deleted file mode 100644 index 4469584..0000000 --- a/src/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ - -set(AUDIO_INCLUDE_DIRS ../audio-cpp) -set(AUDIO_SRC_DIRS audio-cpp) - -set( - all_src - ${AUDIO_SRC_DIRS}/utilities.cpp - ${AUDIO_SRC_DIRS}/sound.cpp -) - -add_library(${PROJECT_NAME} ${all_headers} ${all_src}) diff --git a/src/audio-cpp/decoder.cpp b/src/audio-cpp/decoder.cpp deleted file mode 100644 index 35bc38d..0000000 --- a/src/audio-cpp/decoder.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include