diff --git a/project/src/media/openal/OpenALBindings.cpp b/project/src/media/openal/OpenALBindings.cpp index 8a000d443..5ee52b90d 100644 --- a/project/src/media/openal/OpenALBindings.cpp +++ b/project/src/media/openal/OpenALBindings.cpp @@ -18,7 +18,8 @@ namespace lime { - std::map gc_al_pointers; + std::map alObjects; + std::map alcObjects; void lime_al_delete_buffer (value buffer); @@ -39,6 +40,13 @@ namespace lime { } + void gc_alc_object (value object) { + + alcObjects.erase (object); + + } + + void lime_al_buffer_data (value buffer, int format, value data, int size, int freq) { ALuint id = (ALuint)(uintptr_t)val_data (buffer); @@ -155,7 +163,7 @@ namespace lime { ALuint data = (ALuint)(uintptr_t)val_data (buffer); val_gc (buffer, 0); alDeleteBuffers ((ALuint)1, &data); - gc_al_pointers.erase (data); + alObjects.erase (data); } @@ -175,7 +183,7 @@ namespace lime { buffer = val_array_i (buffers, i); data[i] = (ALuint)(uintptr_t)val_data (buffer); val_gc (buffer, 0); - gc_al_pointers.erase (data[i]); + alObjects.erase (data[i]); } @@ -264,7 +272,7 @@ namespace lime { ALuint buffer; alGenBuffers ((ALuint)1, &buffer); value ptr = CFFIPointer ((void*)(uintptr_t)buffer, gc_al_buffer); - gc_al_pointers[buffer] = ptr; + alObjects[buffer] = ptr; return ptr; } @@ -284,7 +292,7 @@ namespace lime { buffer = buffers[i]; ptr = CFFIPointer ((void*)(uintptr_t)buffer, gc_al_buffer); - gc_al_pointers[buffer] = ptr; + alObjects[buffer] = ptr; val_array_set_i (result, i, ptr); @@ -697,14 +705,14 @@ namespace lime { if (param == AL_BUFFER) { - if (gc_al_pointers.count (data) > 0) { + if (alObjects.count (data) > 0) { - return gc_al_pointers[data]; + return alObjects[data]; } else { value ptr = CFFIPointer ((void*)(uintptr_t)data, gc_al_buffer); - gc_al_pointers[data] = ptr; + alObjects[data] = ptr; return ptr; } @@ -998,14 +1006,14 @@ namespace lime { buffer = buffers[i]; - if (gc_al_pointers.count (buffer) > 0) { + if (alObjects.count (buffer) > 0) { - ptr = gc_al_pointers[buffer]; + ptr = alObjects[buffer]; } else { ptr = CFFIPointer ((void*)(uintptr_t)buffer, gc_al_buffer); - gc_al_pointers[buffer] = ptr; + alObjects[buffer] = ptr; } @@ -1119,6 +1127,7 @@ namespace lime { bool lime_alc_close_device (value device) { ALCdevice* alcDevice = (ALCdevice*)val_data (device); + alcObjects.erase (alcDevice); return alcCloseDevice (alcDevice); } @@ -1151,7 +1160,9 @@ namespace lime { } - return CFFIPointer (alcContext); + value object = CFFIPointer (alcContext, gc_alc_object); + alcObjects[alcContext] = object; + return object; } @@ -1159,6 +1170,7 @@ namespace lime { void lime_alc_destroy_context (value context) { ALCcontext* alcContext = (ALCcontext*)val_data (context); + alcObjects.erase (alcContext); alcDestroyContext (alcContext); } @@ -1168,7 +1180,18 @@ namespace lime { ALCcontext* alcContext = (ALCcontext*)val_data (context); ALCdevice* alcDevice = alcGetContextsDevice (alcContext); - return CFFIPointer (alcDevice); + + if (alcObjects.find (alcDevice) != alcObjects.end ()) { + + return alcObjects[alcDevice]; + + } else { + + value object = CFFIPointer (alcDevice, gc_alc_object); + alcObjects[alcDevice] = object; + return object; + + } } @@ -1176,7 +1199,18 @@ namespace lime { value lime_alc_get_current_context () { ALCcontext* alcContext = alcGetCurrentContext (); - return CFFIPointer (alcContext); + + if (alcObjects.find (alcContext) != alcObjects.end ()) { + + return alcObjects[alcContext]; + + } else { + + value object = CFFIPointer (alcContext, gc_alc_object); + alcObjects[alcContext] = object; + return object; + + } } @@ -1231,7 +1265,10 @@ namespace lime { ALCdevice* alcDevice = alcOpenDevice (devicename.__s); atexit (lime_al_cleanup); - return CFFIPointer (alcDevice); + + value ptr = CFFIPointer (alcDevice, gc_alc_object); + alcObjects[alcDevice] = ptr; + return ptr; }