From a926ee70d9171656f5ac573e4fe89e339d7ed1b4 Mon Sep 17 00:00:00 2001 From: ACrazyTown <47027981+ACrazyTown@users.noreply.github.com> Date: Mon, 13 Oct 2025 17:33:56 +0200 Subject: [PATCH] Implement ALC.getStringList() --- project/src/media/openal/OpenALBindings.cpp | 68 +++++++++++++++++++ .../_internal/backend/native/NativeCFFI.hx | 9 +++ src/lime/media/OpenALAudioContext.hx | 5 ++ src/lime/media/openal/ALC.hx | 25 +++++++ 4 files changed, 107 insertions(+) diff --git a/project/src/media/openal/OpenALBindings.cpp b/project/src/media/openal/OpenALBindings.cpp index 5ee3f0424..48e07ddc1 100644 --- a/project/src/media/openal/OpenALBindings.cpp +++ b/project/src/media/openal/OpenALBindings.cpp @@ -3399,6 +3399,72 @@ namespace lime { } + value lime_alc_get_string_list (value device, int param) { + + ALCdevice* alcDevice = (ALCdevice*)val_data (device); + const char* result = alcGetString (alcDevice, param); + + if (!result || *result == '\0') { + + return alloc_null (); + + } + + value list = alloc_array (0); + + while (*result != '\0') { + + val_array_push (list, alloc_string (result)); + result += strlen (result) + 1; + + } + + return list; + + } + + + HL_PRIM varray* HL_NAME(hl_alc_get_string_list) (HL_CFFIPointer* device, int param) { + + ALCdevice* alcDevice = device ? (ALCdevice*)device->ptr : 0; + const char* result = alcGetString(alcDevice, param); + + if (!result || *result == '\0') { + + return 0; + + } + + int count = 0; + const char* temp = result; + while (*temp != '\0') { + + count++; + temp += strlen (temp) + 1; + + } + + varray* list = hl_alloc_array (&hlt_bytes, count); + vbyte** listData = hl_aptr (list, vbyte*); + + while (*result != '\0') { + + int length = strlen (result) + 1; + char* _result = (char*)malloc (length); + strcpy (_result, result); + + *listData = (vbyte*)_result; + listData++; + + result += length; + + } + + return list; + + } + + bool lime_alc_make_context_current (value context) { ALCcontext* alcContext = (ALCcontext*)val_data (context); @@ -3718,6 +3784,7 @@ namespace lime { DEFINE_PRIME1 (lime_alc_get_error); DEFINE_PRIME3 (lime_alc_get_integerv); DEFINE_PRIME2 (lime_alc_get_string); + DEFINE_PRIME2 (lime_alc_get_string_list); DEFINE_PRIME1 (lime_alc_make_context_current); DEFINE_PRIME1 (lime_alc_open_device); DEFINE_PRIME1v (lime_alc_pause_device); @@ -3847,6 +3914,7 @@ namespace lime { DEFINE_HL_PRIM (_I32, hl_alc_get_error, _TCFFIPOINTER); DEFINE_HL_PRIM (_ARR, hl_alc_get_integerv, _TCFFIPOINTER _I32 _I32); DEFINE_HL_PRIM (_BYTES, hl_alc_get_string, _TCFFIPOINTER _I32); + DEFINE_HL_PRIM (_ARR, hl_alc_get_string_list, _TCFFIPOINTER _I32); DEFINE_HL_PRIM (_BOOL, hl_alc_make_context_current, _TCFFIPOINTER); DEFINE_HL_PRIM (_TCFFIPOINTER, hl_alc_open_device, _STRING); DEFINE_HL_PRIM (_VOID, hl_alc_pause_device, _TCFFIPOINTER); diff --git a/src/lime/_internal/backend/native/NativeCFFI.hx b/src/lime/_internal/backend/native/NativeCFFI.hx index 20840df27..4d9f61220 100644 --- a/src/lime/_internal/backend/native/NativeCFFI.hx +++ b/src/lime/_internal/backend/native/NativeCFFI.hx @@ -1656,6 +1656,8 @@ class NativeCFFI @:cffi private static function lime_alc_get_string(device:CFFIPointer, param:Int):Dynamic; + @:cffi private static function lime_alc_get_string_list(device:CFFIPointer, param:Int):Array; + @:cffi private static function lime_alc_make_context_current(context:CFFIPointer):Bool; @:cffi private static function lime_alc_open_device(devicename:String):CFFIPointer; @@ -1836,6 +1838,7 @@ class NativeCFFI private static var lime_alc_get_integerv = new cpp.CallableInt->Int->cpp.Object>(cpp.Prime._loadPrime("lime", "lime_alc_get_integerv", "oiio", false)); private static var lime_alc_get_string = new cpp.CallableInt->cpp.Object>(cpp.Prime._loadPrime("lime", "lime_alc_get_string", "oio", false)); + private static var lime_alc_get_string_list = new cpp.CallableInt->cpp.Object>(cpp.Prime._loadPrime("lime", "lime_alc_get_string_list", "oio", false)); private static var lime_alc_make_context_current = new cpp.CallableBool>(cpp.Prime._loadPrime("lime", "lime_alc_make_context_current", "ob", false)); private static var lime_alc_open_device = new cpp.Callablecpp.Object>(cpp.Prime._loadPrime("lime", "lime_alc_open_device", "so", false)); @@ -1969,6 +1972,7 @@ class NativeCFFI private static var lime_alc_get_error = CFFI.load("lime", "lime_alc_get_error", 1); private static var lime_alc_get_integerv = CFFI.load("lime", "lime_alc_get_integerv", 3); private static var lime_alc_get_string = CFFI.load("lime", "lime_alc_get_string", 2); + private static var lime_alc_get_string_list = CFFI.load("lime", "lime_alc_get_string_list", 2); private static var lime_alc_make_context_current = CFFI.load("lime", "lime_alc_make_context_current", 1); private static var lime_alc_open_device = CFFI.load("lime", "lime_alc_open_device", 1); private static var lime_alc_pause_device = CFFI.load("lime", "lime_alc_pause_device", 1); @@ -2318,6 +2322,11 @@ class NativeCFFI return null; } + @:hlNative("lime", "hl_alc_get_string_list") private static function lime_alc_get_string_list(device:CFFIPointer, param:Int):hl.NativeArray + { + return null; + } + @:hlNative("lime", "hl_alc_make_context_current") private static function lime_alc_make_context_current(context:ALContext):Bool { return false; diff --git a/src/lime/media/OpenALAudioContext.hx b/src/lime/media/OpenALAudioContext.hx index 2ff2a1224..8dc03862f 100644 --- a/src/lime/media/OpenALAudioContext.hx +++ b/src/lime/media/OpenALAudioContext.hx @@ -414,6 +414,11 @@ class OpenALAudioContext } } + public function getStringList(device:ALDevice, param:Int):Array + { + return ALC.getStringList(device, param); + } + public function isBuffer(buffer:ALBuffer):Bool { return AL.isBuffer(buffer); diff --git a/src/lime/media/openal/ALC.hx b/src/lime/media/openal/ALC.hx index fffc7e70c..d851dd351 100644 --- a/src/lime/media/openal/ALC.hx +++ b/src/lime/media/openal/ALC.hx @@ -156,6 +156,31 @@ class ALC #end } + public static function getStringList(device:ALDevice, param:Int):Array + { + #if (lime_cffi && lime_openal && !macro) + if (param == DEVICE_SPECIFIER || + param == ALL_DEVICES_SPECIFIER) + { + var result = NativeCFFI.lime_alc_get_string_list(device, param); + #if hl + if (result == null) return []; + var _result = []; + for (i in 0...result.length) + _result[i] = CFFI.stringValue(result[i]); + return _result; + #else + return result; + #end + + } + + return [getString(device, param)]; + #else + return null; + #end + } + public static function makeContextCurrent(context:ALContext):Bool { #if (lime_cffi && lime_openal && !macro)