Skip to content

Commit

Permalink
fix memory leak in Mix_FreeChunk + race condition in Mix_HaltChannel
Browse files Browse the repository at this point in the history
  • Loading branch information
pionere authored and slouken committed Dec 28, 2021
1 parent dcfde98 commit 5d3c84e
Showing 1 changed file with 19 additions and 14 deletions.
33 changes: 19 additions & 14 deletions src/mixer.c
Expand Up @@ -834,6 +834,20 @@ Mix_Chunk *Mix_QuickLoad_RAW(Uint8 *mem, Uint32 len)
return(chunk);
}

/* MAKE SURE you hold the audio lock (Mix_LockAudio()) before calling this! */
static void Mix_HaltChannel_locked(int which)
{
if (Mix_Playing(which)) {
_Mix_channel_done_playing(which);
mix_channel[which].playing = 0;
mix_channel[which].looping = 0;
}
mix_channel[which].expire = 0;
if (mix_channel[which].fading != MIX_NO_FADING) /* Restore volume */
mix_channel[which].volume = mix_channel[which].fade_volume_reset;
mix_channel[which].fading = MIX_NO_FADING;
}

/* Free an audio chunk previously loaded */
void Mix_FreeChunk(Mix_Chunk *chunk)
{
Expand All @@ -846,8 +860,7 @@ void Mix_FreeChunk(Mix_Chunk *chunk)
if (mix_channel) {
for (i=0; i<num_channels; ++i) {
if (chunk == mix_channel[i].chunk) {
mix_channel[i].playing = 0;
mix_channel[i].looping = 0;
Mix_HaltChannel_locked(i);
}
}
}
Expand Down Expand Up @@ -1106,23 +1119,15 @@ int Mix_HaltChannel(int which)
{
int i;

Mix_LockAudio();
if (which == -1) {
for (i=0; i<num_channels; ++i) {
Mix_HaltChannel(i);
Mix_HaltChannel_locked(i);
}
} else if (which < num_channels) {
Mix_LockAudio();
if (Mix_Playing(which)) {
_Mix_channel_done_playing(which);
mix_channel[which].playing = 0;
mix_channel[which].looping = 0;
}
mix_channel[which].expire = 0;
if (mix_channel[which].fading != MIX_NO_FADING) /* Restore volume */
mix_channel[which].volume = mix_channel[which].fade_volume_reset;
mix_channel[which].fading = MIX_NO_FADING;
Mix_UnlockAudio();
Mix_HaltChannel_locked(which);
}
Mix_UnlockAudio();
return(0);
}

Expand Down

0 comments on commit 5d3c84e

Please sign in to comment.