diff --git a/core/include/cubos/core/al/audio_device.hpp b/core/include/cubos/core/al/audio_device.hpp index 74da64d7c..2ff502bdb 100644 --- a/core/include/cubos/core/al/audio_device.hpp +++ b/core/include/cubos/core/al/audio_device.hpp @@ -8,7 +8,6 @@ #include #include -#include #include #include diff --git a/core/src/al/miniaudio_device.cpp b/core/src/al/miniaudio_device.cpp index dcfdc8253..68ce75f7a 100644 --- a/core/src/al/miniaudio_device.cpp +++ b/core/src/al/miniaudio_device.cpp @@ -221,6 +221,22 @@ Buffer MiniaudioDevice::createBuffer(const void* data, size_t dataSize) return std::make_shared(data, dataSize); } +size_t MiniaudioBuffer::getLength() +{ + ma_uint64 lengthInPCMFrames; + ma_result result = ma_decoder_get_length_in_pcm_frames(&mDecoder, &lengthInPCMFrames); + + if (result != MA_SUCCESS) + { + CUBOS_ERROR("Failed to get the length of audio in PCM frames."); + return 0; + } + + // Calculate the length in seconds: Length in PCM frames divided by the sample rate. + float lengthInSeconds = static_cast(lengthInPCMFrames) / static_cast(mDecoder.outputSampleRate); + return static_cast(lengthInSeconds); +} + Source MiniaudioDevice::createSource() { return std::make_shared(); diff --git a/core/src/al/miniaudio_device.hpp b/core/src/al/miniaudio_device.hpp index afc90b5be..29f1a8d55 100644 --- a/core/src/al/miniaudio_device.hpp +++ b/core/src/al/miniaudio_device.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include namespace cubos::core::al diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index c17dca087..14bb38027 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -36,6 +36,9 @@ set(CUBOS_ENGINE_SOURCE "src/utils/free_camera/plugin.cpp" "src/utils/free_camera/controller.cpp" + "src/audio/audio.cpp" + "src/audio/bridge.cpp" + "src/assets/plugin.cpp" "src/assets/assets.cpp" "src/assets/bridge.cpp" diff --git a/engine/include/cubos/engine/audio/audio.hpp b/engine/include/cubos/engine/audio/audio.hpp new file mode 100644 index 000000000..293544aac --- /dev/null +++ b/engine/include/cubos/engine/audio/audio.hpp @@ -0,0 +1,28 @@ +/// @file +/// @brief Class @ref cubos::engine::Audio. +/// @ingroup audio-plugin +#pragma once + +#include +#include +#include +#include + +#include + +namespace cubos::engine +{ + /// @brief Asset containing raw Audio data. + /// + /// @ingroup audio-plugin + struct CUBOS_ENGINE_API Audio + { + CUBOS_REFLECT; + Buffer data; // Raw data of the audio + size_t length; // Audio length in seconds TODO: add getter in audio + + explicit Audio(core::memory::Stream& stream); + Audio(Audio&& other) noexcept; + ~Audio(); + }; +} // namespace cubos::engine diff --git a/engine/include/cubos/engine/audio/bridge.hpp b/engine/include/cubos/engine/audio/bridge.hpp new file mode 100644 index 000000000..d48feca1c --- /dev/null +++ b/engine/include/cubos/engine/audio/bridge.hpp @@ -0,0 +1,28 @@ +/// @file +/// @brief Class @ref cubos::engine::AudioBridge. +/// @ingroup audio-plugin + +#pragma once + +#include +#include + +namespace cubos::engine +{ + /// @brief Bridge which loads and saves @ref Sound assets. + /// + /// Uses the format specified in @ref Audio::loadFrom and @ref Audio::writeTo + /// + /// @ingroup audio-plugin + class AudioBridge : public FileBridge + { + public: + /// @brief Constructs a bridge. + AudioBridge() + : FileBridge(core::reflection::reflect