From b11bdf0bcc3b56ed2cfb3eaa5d8c1a6afcaa79c3 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 23 Oct 2025 22:08:30 +0300 Subject: [PATCH] add audio.get_input_devices_names() --- src/audio/AL/ALAudio.cpp | 22 ++++++++++++++++++++++ src/audio/AL/ALAudio.hpp | 2 ++ src/audio/NoAudio.hpp | 4 ++++ src/audio/audio.cpp | 10 ++++++++++ src/audio/audio.hpp | 5 +++++ src/logic/scripting/lua/libs/libaudio.cpp | 12 ++++++++++++ 6 files changed, 55 insertions(+) diff --git a/src/audio/AL/ALAudio.cpp b/src/audio/AL/ALAudio.cpp index 23dfeaa8..ce73823c 100644 --- a/src/audio/AL/ALAudio.cpp +++ b/src/audio/AL/ALAudio.cpp @@ -479,6 +479,27 @@ std::unique_ptr ALAudio::openStream( return std::make_unique(this, stream, keepSource); } +std::vector ALAudio::getInputDeviceNames() { + std::vector devices; + + if (alcIsExtensionPresent(nullptr, "ALC_ENUMERATION_EXT")) { + auto deviceList = alcGetString(nullptr, ALC_CAPTURE_DEVICE_SPECIFIER); + if (deviceList == nullptr) { + logger.warning() << "no input devices found"; + return devices; + } + while (*deviceList) { + std::string deviceName(deviceList); + devices.push_back(deviceName); + deviceList += deviceName.length() + 1; + } + } else { + logger.warning() << "enumeration extension is not available"; + } + + return devices; +} + std::unique_ptr ALAudio::openInputDevice( uint sampleRate, uint channels, uint bitsPerSample ) { @@ -490,6 +511,7 @@ std::unique_ptr ALAudio::openInputDevice( sampleRate * channels * bps / 8 ); check_alc_errors(device, "alcCaptureOpenDevice"); + return std::make_unique( this, device, channels, bitsPerSample ); diff --git a/src/audio/AL/ALAudio.hpp b/src/audio/AL/ALAudio.hpp index d04d45b6..8e4ad02c 100644 --- a/src/audio/AL/ALAudio.hpp +++ b/src/audio/AL/ALAudio.hpp @@ -186,6 +186,8 @@ namespace audio { uint sampleRate, uint channels, uint bitsPerSample ) override; + std::vector getInputDeviceNames() override; + void setListener( glm::vec3 position, glm::vec3 velocity, diff --git a/src/audio/NoAudio.hpp b/src/audio/NoAudio.hpp index bc2e6b49..c5dbae41 100644 --- a/src/audio/NoAudio.hpp +++ b/src/audio/NoAudio.hpp @@ -82,6 +82,10 @@ namespace audio { return nullptr; } + std::vector getInputDeviceNames() override { + return {}; + } + void setListener( glm::vec3 position, glm::vec3 velocity, glm::vec3 at, glm::vec3 up ) override { diff --git a/src/audio/audio.cpp b/src/audio/audio.cpp index b45242bb..72b22df5 100644 --- a/src/audio/audio.cpp +++ b/src/audio/audio.cpp @@ -253,6 +253,16 @@ std::unique_ptr audio::open_stream( return backend->openStream(std::move(stream), keepSource); } +std::unique_ptr audio::open_input_device( + uint sampleRate, uint channels, uint bitsPerSample +) { + return backend->openInputDevice(sampleRate, channels, bitsPerSample); +} + +std::vector audio::get_input_devices_names() { + return backend->getInputDeviceNames(); +} + void audio::set_listener( glm::vec3 position, glm::vec3 velocity, glm::vec3 lookAt, glm::vec3 up ) { diff --git a/src/audio/audio.hpp b/src/audio/audio.hpp index e1c19d25..3364d89e 100644 --- a/src/audio/audio.hpp +++ b/src/audio/audio.hpp @@ -370,6 +370,7 @@ namespace audio { glm::vec3 lookAt, glm::vec3 up ) = 0; + virtual std::vector getInputDeviceNames() = 0; virtual void update(double delta) = 0; /// @brief Check if backend is an abstraction that does not internally @@ -434,6 +435,10 @@ namespace audio { uint sampleRate, uint channels, uint bitsPerSample ); + /// @brief Retrieve names of available audio input devices + /// @return list of device names + std::vector get_input_devices_names(); + /// @brief Configure 3D listener /// @param position listener position /// @param velocity listener velocity (used for Doppler effect) diff --git a/src/logic/scripting/lua/libs/libaudio.cpp b/src/logic/scripting/lua/libs/libaudio.cpp index 7f68bd6d..951522d9 100644 --- a/src/logic/scripting/lua/libs/libaudio.cpp +++ b/src/logic/scripting/lua/libs/libaudio.cpp @@ -408,6 +408,17 @@ static int l_audio_fetch_input(lua::State* L) { return lua::create_bytearray(L, std::move(bytes)); } +static int l_audio_get_input_devices_names(lua::State* L) { + auto device_names = audio::get_input_devices_names(); + lua::createtable(L, device_names.size(), 0); + int index = 1; + for (const auto& name : device_names) { + lua::pushstring(L, name.c_str()); + lua::rawseti(L, index++); + } + return 1; +} + const luaL_Reg audiolib[] = { {"play_sound", lua::wrap}, {"play_sound_2d", lua::wrap}, @@ -434,5 +445,6 @@ const luaL_Reg audiolib[] = { {"count_speakers", lua::wrap}, {"count_streams", lua::wrap}, {"fetch_input", lua::wrap}, + {"get_input_devices_names", lua::wrap}, {nullptr, nullptr} };