Addressed memory leak in SDL_coreaudio.m

This commit is contained in:
obeecodes 2024-06-15 00:32:36 -04:00 committed by Sam Lantinga
parent e388e377aa
commit 3b5dce10c4
1 changed files with 26 additions and 2 deletions

View File

@ -713,9 +713,33 @@ static int AssignDeviceToAudioQueue(SDL_AudioDevice *device)
result = AudioObjectGetPropertyData(device->hidden->deviceID, &prop, 0, NULL, &devuidsize, &devuid);
CHECK_RESULT("AudioObjectGetPropertyData (kAudioDevicePropertyDeviceUID)");
result = AudioQueueSetProperty(device->hidden->audioQueue, kAudioQueueProperty_CurrentDevice, &devuid, devuidsize);
CHECK_RESULT("AudioQueueSetProperty (kAudioQueueProperty_CurrentDevice)");
// !!! FIXME: do we need to CFRelease(devuid)?
/*
If AudioObjectGetPropertyData succeeds and AudioQueueSetProperty fails,
calling CHECK_RESULT("AudioQueueSetProperty (kAudioQueueProperty_CurrentDevice)");
will cause a memory leak since it returns
*/
// !!! FIXME: do we need to CFRelease(devuid)
/* Yes
CFStringRef is passed to AudioObjectGetPropertyData as an argument of type
UnsafeMutableRawPointer. As stated in the Apple Developer Documentation,
"The UnsafeMutableRawPointer type provides no automated memory management,
no type safety, and no alignment guarantees. You are responsible for
handling the life cycle of any memory you work with through
unsafe pointers, to avoid leaks or undefined behavior"
*/
//This is the quickest fix
if (result != noErr) {
const char* msg = "AudioQueueSetProperty (kAudioQueueProperty_CurrentDevice)";
SDL_Log("COREAUDIO: Got error %d from '%s'!\n", (int)result, msg);
CFRelease(devuid);
return SDL_SetError("CoreAudio error (%s): %d", msg, (int)result);
}
//Release once you've finished using CFStringRef
CFRelease(devuid);
return 0;
}