From d5c39a05fbce42de797ca03314c12634a315ecea Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 19 Mar 2024 13:42:38 +0300 Subject: [PATCH 1/2] audio stats functions --- doc/en/7.Audio.md | 10 ++++++++++ doc/ru/7.Аудио.md | 9 +++++++++ src/logic/scripting/lua/libaudio.cpp | 14 ++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/doc/en/7.Audio.md b/doc/en/7.Audio.md index 5b810a34..9322583f 100644 --- a/doc/en/7.Audio.md +++ b/doc/en/7.Audio.md @@ -193,3 +193,13 @@ audio.set_velocity(speakerid: integer, x: number, y: number, z: number) -- also returns 0, if duration is unknown (example: radio) audio.get_duration(speakerid: integer) -> number ``` + +### Other functions + +```lua +-- get current number of alive speakers +audio.count_speakers() -> integer + +-- get current number of playing streams +audio.count_streams() -> integer +``` \ No newline at end of file diff --git a/doc/ru/7.Аудио.md b/doc/ru/7.Аудио.md index 66dfb311..b560b739 100644 --- a/doc/ru/7.Аудио.md +++ b/doc/ru/7.Аудио.md @@ -194,3 +194,12 @@ audio.set_velocity(speakerid: integer, x: number, y: number, z: number) audio.get_duration(speakerid: integer) -> number ``` +### Другие функции + +```lua +-- получить текущее число живых спикеров +audio.count_speakers() -> integer + +-- получить текущее число проигрываемых аудио-потоков +audio.count_streams() -> integer +``` diff --git a/src/logic/scripting/lua/libaudio.cpp b/src/logic/scripting/lua/libaudio.cpp index 1a786692..04401ea5 100644 --- a/src/logic/scripting/lua/libaudio.cpp +++ b/src/logic/scripting/lua/libaudio.cpp @@ -391,6 +391,18 @@ static int l_audio_get_velocity(lua_State* L) { return 0; } +// @brief audio.count_speakers() -> integer +static int l_audio_count_speakers(lua_State* L) { + lua_pushinteger(L, audio::count_speakers()); + return 1; +} + +// @brief audio.count_streams() -> integer +static int l_audio_count_streams(lua_State* L) { + lua_pushinteger(L, audio::count_streams()); + return 1; +} + const luaL_Reg audiolib [] = { {"play_sound", lua_wrap_errors}, {"play_sound_2d", lua_wrap_errors}, @@ -414,5 +426,7 @@ const luaL_Reg audiolib [] = { {"get_duration", lua_wrap_errors}, {"get_position", lua_wrap_errors}, {"get_velocity", lua_wrap_errors}, + {"count_speakers", lua_wrap_errors}, + {"count_streams", lua_wrap_errors}, {NULL, NULL} }; From f89c252ddfe5657dc6a65cd059e1deb16f6bea37 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 19 Mar 2024 14:04:06 +0300 Subject: [PATCH 2/2] lua suppliers update + label supplier XML attribute --- src/frontend/gui/gui_xml.cpp | 8 ++++++++ src/logic/scripting/lua/LuaState.cpp | 8 ++++++++ src/logic/scripting/lua/LuaState.h | 2 ++ src/logic/scripting/scripting_functional.cpp | 16 ++++++++++++---- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/frontend/gui/gui_xml.cpp b/src/frontend/gui/gui_xml.cpp index 8ddb4494..228abac2 100644 --- a/src/frontend/gui/gui_xml.cpp +++ b/src/frontend/gui/gui_xml.cpp @@ -170,6 +170,14 @@ static std::shared_ptr readLabel(UiXmlReader& reader, xml::xmlelement el align_from_string(element->attr("valign").getText(), label->getVerticalAlign()) ); } + if (element->has("supplier")) { + auto supplier = scripting::create_wstring_supplier( + reader.getEnvironment().getId(), + element->attr("supplier").getText(), + reader.getFilename() + ); + label->textSupplier(supplier); + } return label; } diff --git a/src/logic/scripting/lua/LuaState.cpp b/src/logic/scripting/lua/LuaState.cpp index e472831d..1dab0c38 100644 --- a/src/logic/scripting/lua/LuaState.cpp +++ b/src/logic/scripting/lua/LuaState.cpp @@ -247,6 +247,14 @@ const char* lua::LuaState::tostring(int idx) { return lua_tostring(L, idx); } +bool lua::LuaState::isstring(int idx) { + return lua_isstring(L, idx); +} + +bool lua::LuaState::isfunction(int idx) { + return lua_isfunction(L, idx); +} + void lua::LuaState::openlib(const std::string& name, const luaL_Reg* libfuncs, int nup) { lua_newtable(L); luaL_setfuncs(L, libfuncs, nup); diff --git a/src/logic/scripting/lua/LuaState.h b/src/logic/scripting/lua/LuaState.h index a49d1660..5e753bb1 100644 --- a/src/logic/scripting/lua/LuaState.h +++ b/src/logic/scripting/lua/LuaState.h @@ -45,6 +45,8 @@ namespace lua { luaint tointeger(int idx); luanumber tonumber(int idx); const char* tostring(int idx); + bool isstring(int idx); + bool isfunction(int idx); int call(int argc); int callNoThrow(int argc); int execute(int env, const std::string& src, const std::string& file=""); diff --git a/src/logic/scripting/scripting_functional.cpp b/src/logic/scripting/scripting_functional.cpp index d45bbfda..2a9bb81c 100644 --- a/src/logic/scripting/scripting_functional.cpp +++ b/src/logic/scripting/scripting_functional.cpp @@ -58,7 +58,9 @@ wstringsupplier scripting::create_wstring_supplier( ) { return [=](){ if (processCallback(env, src, file)) { - state->callNoThrow(0); + if (state->isfunction(-1)) { + state->callNoThrow(0); + } auto str = state->tostring(-1); state->pop(); return util::str2wstr_utf8(str); } @@ -101,7 +103,9 @@ boolsupplier scripting::create_bool_supplier( ) { return [=](){ if (processCallback(env, src, file)) { - state->callNoThrow(0); + if (state->isfunction(-1)) { + state->callNoThrow(0); + } bool x = state->toboolean(-1); state->pop(); return x; } @@ -129,7 +133,9 @@ doublesupplier scripting::create_number_supplier( ) { return [=](){ if (processCallback(env, src, file)) { - state->callNoThrow(0); + if (state->isfunction(-1)) { + state->callNoThrow(0); + } lua::luanumber x = state->tonumber(-1); state->pop(); return x; } @@ -159,7 +165,9 @@ vec2supplier scripting::create_vec2_supplier( ) { return [=](){ if (processCallback(env, src, file)) { - state->callNoThrow(0); + if (state->isfunction(-1)) { + state->callNoThrow(0); + } lua::luanumber y = state->tonumber(-1); state->pop(); lua::luanumber x = state->tonumber(-1); state->pop(); return glm::vec2(x, y);