From 0074cf27ea8d8c83d7c4c7d9774f419dc75a91dd Mon Sep 17 00:00:00 2001 From: georgemoralis Date: Fri, 13 Feb 2026 10:11:56 +0200 Subject: [PATCH] improved device detection --- src/core/libraries/audio/openal_manager.h | 31 ++++++++++++++++------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/core/libraries/audio/openal_manager.h b/src/core/libraries/audio/openal_manager.h index 44af724fd..188c2e4e8 100644 --- a/src/core/libraries/audio/openal_manager.h +++ b/src/core/libraries/audio/openal_manager.h @@ -72,21 +72,27 @@ public: static std::vector GetAvailableDevices() { std::vector devices_list; - if (!IsDeviceEnumerationSupported()) { + // Check if enumeration extension is supported + if (!alcIsExtensionPresent(nullptr, "ALC_ENUMERATION_EXT")) return devices_list; + + // Prefer ALC_ENUMERATE_ALL_EXT if available (OpenAL Soft) + const ALCchar* devices = nullptr; + + if (alcIsExtensionPresent(nullptr, "ALC_ENUMERATE_ALL_EXT")) { + devices = alcGetString(nullptr, ALC_ALL_DEVICES_SPECIFIER); + } else { + devices = alcGetString(nullptr, ALC_DEVICE_SPECIFIER); } - // Get device list - const ALCchar* devices = alcGetString(nullptr, ALC_DEVICE_SPECIFIER); - if (!devices) { + if (!devices) return devices_list; - } - // Parse null-separated list + // Parse double-null terminated list const ALCchar* ptr = devices; - while (ptr && *ptr) { + while (*ptr != '\0') { devices_list.emplace_back(ptr); - ptr += strlen(ptr) + 1; + ptr += std::strlen(ptr) + 1; } return devices_list; @@ -135,7 +141,14 @@ private: } // Get actual device name - const ALCchar* actual_name = alcGetString(device, ALC_DEVICE_SPECIFIER); + const ALCchar* actual_name = nullptr; + + // Check if ENUMERATE_ALL is supported + if (alcIsExtensionPresent(nullptr, "ALC_ENUMERATE_ALL_EXT")) { + actual_name = alcGetString(device, ALC_ALL_DEVICES_SPECIFIER); + } else { + actual_name = alcGetString(device, ALC_DEVICE_SPECIFIER); + } current_device_name = actual_name ? actual_name : "Unknown"; initialized = true;