Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions project/src/media/openal/OpenALBindings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3398,6 +3398,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);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't we need a free() call to go with this?

Copy link

@dtwotwo dtwotwo Jan 2, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Don't we need a free() call to go with this?

Maybe hl_alloc_bytes would be safer instead of malloc, since we can't call free() immediately?

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);
Expand Down Expand Up @@ -3622,6 +3688,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);
Expand Down Expand Up @@ -3746,6 +3813,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);
Expand Down
9 changes: 9 additions & 0 deletions src/lime/_internal/backend/native/NativeCFFI.hx
Original file line number Diff line number Diff line change
Expand Up @@ -1683,6 +1683,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<Dynamic>;

@:cffi private static function lime_alc_make_context_current(context:CFFIPointer):Bool;

@:cffi private static function lime_alc_open_device(devicename:String):CFFIPointer;
Expand Down Expand Up @@ -1853,6 +1855,7 @@ class NativeCFFI
private static var lime_alc_get_integerv = new cpp.Callable<cpp.Object->Int->Int->cpp.Object>(cpp.Prime._loadPrime("lime", "lime_alc_get_integerv",
"oiio", false));
private static var lime_alc_get_string = new cpp.Callable<cpp.Object->Int->cpp.Object>(cpp.Prime._loadPrime("lime", "lime_alc_get_string", "oio", false));
private static var lime_alc_get_string_list = new cpp.Callable<cpp.Object->Int->cpp.Object>(cpp.Prime._loadPrime("lime", "lime_alc_get_string_list", "oio", false));
private static var lime_alc_make_context_current = new cpp.Callable<cpp.Object->Bool>(cpp.Prime._loadPrime("lime", "lime_alc_make_context_current", "ob",
false));
private static var lime_alc_open_device = new cpp.Callable<String->cpp.Object>(cpp.Prime._loadPrime("lime", "lime_alc_open_device", "so", false));
Expand Down Expand Up @@ -1976,6 +1979,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);
Expand Down Expand Up @@ -2320,6 +2324,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<hl.Bytes>
{
return null;
}

@:hlNative("lime", "hl_alc_make_context_current") private static function lime_alc_make_context_current(context:ALContext):Bool
{
return false;
Expand Down
5 changes: 5 additions & 0 deletions src/lime/media/OpenALAudioContext.hx
Original file line number Diff line number Diff line change
Expand Up @@ -413,6 +413,11 @@ class OpenALAudioContext
}
}

public function getStringList(device:ALDevice, param:Int):Array<String>
{
return ALC.getStringList(device, param);
}

public function isBuffer(buffer:ALBuffer):Bool
{
return AL.isBuffer(buffer);
Expand Down
25 changes: 25 additions & 0 deletions src/lime/media/openal/ALC.hx
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,31 @@ class ALC
#end
}

public static function getStringList(device:ALDevice, param:Int):Array<String>
{
#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)
Expand Down