From b3ae6eb59acfc34a338d4ad7ae2cc2d5fb8cbaa7 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 5 Jan 2026 16:40:00 +0300 Subject: [PATCH] add 'record-audio' permission --- res/layouts/pages/settings_audio.xml.lua | 5 ++++- res/project.toml | 3 ++- src/audio/audio.cpp | 14 ++++++++++++-- src/audio/audio.hpp | 2 +- src/devtools/Project.hpp | 1 + src/engine/Engine.cpp | 6 +++++- 6 files changed, 25 insertions(+), 6 deletions(-) diff --git a/res/layouts/pages/settings_audio.xml.lua b/res/layouts/pages/settings_audio.xml.lua index eaa8b3fb1..03d8e1a9b 100644 --- a/res/layouts/pages/settings_audio.xml.lua +++ b/res/layouts/pages/settings_audio.xml.lua @@ -67,5 +67,8 @@ function on_open() table.insert(devices, {value=name, text=name}) end selectbox.options = devices - selectbox.value = audio.__get_input_info().device_specifier + local info = audio.__get_input_info() + if info then + selectbox.value = info.device_specifier + end end diff --git a/res/project.toml b/res/project.toml index c7e2fb69d..b641ad00f 100644 --- a/res/project.toml +++ b/res/project.toml @@ -2,5 +2,6 @@ name = "default" base_packs = ["base"] permissions = [ - "network" + "network", + "record-audio" ] diff --git a/src/audio/audio.cpp b/src/audio/audio.cpp index 436fa1dad..dc0e57463 100644 --- a/src/audio/audio.cpp +++ b/src/audio/audio.cpp @@ -24,6 +24,7 @@ namespace { std::vector> channels; util::ObjectsKeeper objects_keeper {}; std::unique_ptr input_device = nullptr; + static bool input_enabled = false; } Channel::Channel(std::string name) : name(std::move(name)) { @@ -152,7 +153,9 @@ public: } }; -void audio::initialize(bool enabled, AudioSettings& settings) { +void audio::initialize( + bool enabled, bool inputEnabled, AudioSettings& settings +) { enabled = enabled && settings.enabled.get(); if (enabled) { logger.info() << "initializing ALAudio backend"; @@ -182,7 +185,10 @@ void audio::initialize(bool enabled, AudioSettings& settings) { }, true)); } - ::input_device = backend->openInputDevice("", 44100, 1, 16); + if (inputEnabled) { + ::input_device = backend->openInputDevice("", 44100, 1, 16); + ::input_enabled = true; + } if (::input_device) { ::input_device->startCapture(); } @@ -270,6 +276,10 @@ std::vector audio::get_output_devices_names() { void audio::set_input_device(const std::string& deviceName) { logger.info() << "setting input device to " << deviceName; + if (!::input_enabled) { + logger.warning() << "unable to set input device due to project permissions"; + return; + } if (deviceName == audio::DEVICE_NONE) { if (::input_device) { ::input_device->stopCapture(); diff --git a/src/audio/audio.hpp b/src/audio/audio.hpp index 0ccd51f35..642b9235d 100644 --- a/src/audio/audio.hpp +++ b/src/audio/audio.hpp @@ -402,7 +402,7 @@ namespace audio { /// @brief Initialize audio system or use no audio mode /// @param enabled try to initialize actual audio - void initialize(bool enabled, AudioSettings& settings); + void initialize(bool enabled, bool inputEnabled, AudioSettings& settings); /// @brief Load audio file info and PCM data /// @param file audio file diff --git a/src/devtools/Project.hpp b/src/devtools/Project.hpp index ba2d0d407..9be0194ae 100644 --- a/src/devtools/Project.hpp +++ b/src/devtools/Project.hpp @@ -13,6 +13,7 @@ namespace scripting { } struct Permissions { + static inline std::string RECORD_AUDIO = "record-audio"; static inline std::string WRITE_TO_USER = "write-to-user"; static inline std::string NETWORK = "network"; diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp index 9dcfbaa98..5cb0e7ca6 100644 --- a/src/engine/Engine.cpp +++ b/src/engine/Engine.cpp @@ -160,7 +160,11 @@ void Engine::initialize(CoreParameters coreParameters) { if (!params.headless) { initializeClient(); } - audio::initialize(!params.headless, settings.audio); + audio::initialize( + !params.headless, + project->permissions.has(Permissions::RECORD_AUDIO), + settings.audio + ); if (settings.ui.language.get() == "auto") { settings.ui.language.set(