From be2dc1abe54f896864fa2354ee3d17ae57a39f2e Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 30 Oct 2025 22:48:53 +0300 Subject: [PATCH] add PCMStream:create_sound method --- res/scripts/hud.lua | 10 +++++++ src/audio/MemoryPCMStream.cpp | 4 +++ src/audio/MemoryPCMStream.hpp | 2 ++ .../lua/usertypes/lua_type_pcmstream.cpp | 26 +++++++++++++++++++ 4 files changed, 42 insertions(+) diff --git a/res/scripts/hud.lua b/res/scripts/hud.lua index 7730ba5f..a5aad766 100644 --- a/res/scripts/hud.lua +++ b/res/scripts/hud.lua @@ -122,6 +122,16 @@ function on_hud_open() stream = PCMStream(44100, 1, 16) stream:share("test-stream") streamid = audio.play_stream_2d("test-stream", 2.0, 1.0, "ui") + + + s = PCMStream(44100, 1, 8) + local buffer = Bytearray(44100) + for i=1, #buffer do + buffer[i] = math.random(1, 8) + end + s:feed(buffer) + s:create_sound("test-sound") + audio.play_sound_2d("test-sound", 2.0, 1.0, "ui") end function on_hud_render() diff --git a/src/audio/MemoryPCMStream.cpp b/src/audio/MemoryPCMStream.cpp index 7fcf4b0c..e0f40d5e 100644 --- a/src/audio/MemoryPCMStream.cpp +++ b/src/audio/MemoryPCMStream.cpp @@ -61,3 +61,7 @@ bool MemoryPCMStream::isSeekable() const { } void MemoryPCMStream::seek(size_t position) {} + +size_t MemoryPCMStream::available() const { + return buffer.size(); +} diff --git a/src/audio/MemoryPCMStream.hpp b/src/audio/MemoryPCMStream.hpp index 1f94d27e..bef2a05b 100644 --- a/src/audio/MemoryPCMStream.hpp +++ b/src/audio/MemoryPCMStream.hpp @@ -31,6 +31,8 @@ namespace audio { bool isSeekable() const override; void seek(size_t position) override; + + size_t available() const; private: uint sampleRate; uint channels; diff --git a/src/logic/scripting/lua/usertypes/lua_type_pcmstream.cpp b/src/logic/scripting/lua/usertypes/lua_type_pcmstream.cpp index 3367813e..a4a13ea4 100644 --- a/src/logic/scripting/lua/usertypes/lua_type_pcmstream.cpp +++ b/src/logic/scripting/lua/usertypes/lua_type_pcmstream.cpp @@ -44,9 +44,35 @@ static int l_share(lua::State* L) { return 0; } +static int l_create_sound(lua::State* L) { + auto stream = touserdata(L, 1); + if (stream == nullptr) { + return 0; + } + auto alias = require_lstring(L, 2); + auto memoryStream = stream->getStream(); + + std::vector buffer(memoryStream->available()); + memoryStream->readFully(buffer.data(), buffer.size(), true); + + auto pcm = std::make_shared( + std::move(buffer), + 0, + memoryStream->getChannels(), + static_cast(memoryStream->getBitsPerSample()), + memoryStream->getSampleRate(), + memoryStream->isSeekable() + ); + auto sound = audio::create_sound(std::move(pcm), true); + auto assets = engine->getAssets(); + assets->store(std::move(sound), std::string(alias)); + return 0; +} + static std::unordered_map methods { {"feed", lua::wrap}, {"share", lua::wrap}, + {"create_sound", lua::wrap}, }; static int l_meta_meta_call(lua::State* L) {