diff --git a/src/FAudioGMS.c b/src/FAudioGMS.c index 9ce961e..0aa7834 100644 --- a/src/FAudioGMS.c +++ b/src/FAudioGMS.c @@ -43,6 +43,38 @@ static inline void Log(char *string) fflush(stdout); } +typedef struct IdStack +{ + uint32_t* array; + uint32_t count; + uint32_t capacity; +} IdStack; + +static inline void IdStack_Init(IdStack *stack) +{ + stack->array = NULL; + stack->capacity = 0; + stack->count = 0; +} + +static inline void IdStack_Push(IdStack *stack, uint32_t id) +{ + if (stack->count >= stack->capacity) + { + stack->array = SDL_realloc(stack->array, (stack->capacity + 1) * sizeof(uint32_t)); + stack->capacity += 1; + } + + stack->array[stack->count] = id; + stack->count += 1; +} + +static inline uint32_t IdStack_Pop(IdStack* stack) +{ + stack->count -= 1; + return stack->array[stack->count]; +} + typedef enum FAudioGMS_SoundState { SoundState_Playing, @@ -99,9 +131,11 @@ typedef struct FAudioGMS_Device FAudioGMS_StaticSound **staticSounds; uint32_t staticSoundCount; + IdStack staticSoundIndexStack; FAudioGMS_SoundInstance **soundInstances; uint32_t soundInstanceCount; + IdStack soundInstanceIndexStack; } FAudioGMS_Device; static FAudioGMS_Device *device = NULL; @@ -181,9 +215,11 @@ void FAudioGMS_Init() device->staticSounds = NULL; device->staticSoundCount = 0; + IdStack_Init(&device->staticSoundIndexStack); device->soundInstances = NULL; device->soundInstanceCount = 0; + IdStack_Init(&device->soundInstanceIndexStack); Log("FAudio initialized successfully!"); printf("Device: %ls", device->deviceDetails.DisplayName); @@ -195,6 +231,7 @@ static void FAudioGMS_INTERNAL_SoundInstance_Destroy(FAudioGMS_SoundInstance* in if (instance != NULL) { device->soundInstances[instance->id] = NULL; + IdStack_Push(&device->soundInstanceIndexStack, instance->id); FAudioSourceVoice_Stop(instance->handle, 0, 0); FAudioSourceVoice_FlushSourceBuffers(instance->handle); FAudioVoice_DestroyVoice(instance->handle); @@ -224,6 +261,7 @@ static void FAudioGMS_INTERNAL_StaticSound_Destroy(FAudioGMS_StaticSound* sound) if (sound != NULL) { device->staticSounds[sound->id] = NULL; + IdStack_Push(&device->staticSoundIndexStack, sound->id); SDL_free((void*)sound->buffer.pAudioData); SDL_free(sound); } @@ -338,10 +376,18 @@ double FAudioGMS_StaticSound_LoadWAV(char *filePath) sound->loopStart = 0; sound->loopLength = 0; - /* FIXME: id re-use system */ - sound->id = device->staticSoundCount; + if (device->staticSoundIndexStack.count > 0) + { + sound->id = IdStack_Pop(&device->staticSoundIndexStack); + } + else + { + sound->id = device->staticSoundCount; + + device->staticSounds = SDL_realloc(device->staticSounds, (device->staticSoundCount + 1) * sizeof(FAudioGMS_StaticSound*)); + device->staticSoundCount += 1; + } - device->staticSounds = SDL_realloc(device->staticSounds, (device->staticSoundCount + 1) * sizeof(FAudioGMS_StaticSound*)); device->staticSounds[device->staticSoundCount] = sound; device->staticSoundCount += 1; @@ -594,12 +640,19 @@ static FAudioGMS_SoundInstance* FAudioGMS_INTERNAL_SoundInstance_CreateFromStati instance->soundState = SoundState_Stopped; - /* FIXME: id re-use system */ - instance->id = device->soundInstanceCount; + if (device->soundInstanceIndexStack.count > 0) + { + instance->id = IdStack_Pop(&device->soundInstanceIndexStack); + } + else + { + instance->id = device->soundInstanceCount; + + device->soundInstances = SDL_realloc(device->soundInstances, (device->soundInstanceCount + 1) * sizeof(FAudioGMS_SoundInstance*)); + device->soundInstanceCount += 1; + } - device->soundInstances = SDL_realloc(device->soundInstances, (device->soundInstanceCount + 1) * sizeof(FAudioGMS_SoundInstance*)); device->soundInstances[device->soundInstanceCount] = instance; - device->soundInstanceCount += 1; return instance; }