ref: 8f31584de42c033b91c2426775cae17090f0e5e3
parent: ee4feb8374694d684dad8905c2be2bf0171de6f9
author: Snesrev <snesrev@protonmail.com>
date: Sat Oct 1 12:52:49 EDT 2022
Audio mutex locking didn't work
--- a/main.c
+++ b/main.c
@@ -169,7 +169,7 @@
static uint8 g_audio_channels;
static void SDLCALL AudioCallback(void *userdata, Uint8 *stream, int len) {
- SDL_LockMutex(g_audio_mutex);
+ if (SDL_LockMutex(g_audio_mutex)) Die("Mutex lock failed!");
while (len != 0) {
if (g_audiobuffer_end - g_audiobuffer_cur == 0) {
ZeldaRenderAudio((int16*)g_audiobuffer, g_frames_per_block, g_audio_channels);
@@ -185,8 +185,6 @@
ZeldaDiscardUnusedAudioFrames();
SDL_UnlockMutex(g_audio_mutex);
-
-
}
@@ -275,9 +273,9 @@
SDL_AudioDeviceID device;
SDL_AudioSpec want = { 0 }, have;
- SDL_mutex *audio_mutex = SDL_CreateMutex();
- if (!audio_mutex) Die("No mutex");
- SDL_LockMutex(audio_mutex);
+ g_audio_mutex = SDL_CreateMutex();
+ if (!g_audio_mutex) Die("No mutex");
+ if (SDL_LockMutex(g_audio_mutex)) Die("Mutex lock failed!");
if (g_config.enable_audio) {
want.freq = g_config.audio_freq;
@@ -363,8 +361,6 @@
continue;
}
- uint64 t0 = SDL_GetPerformanceCounter();
-
// Clear gamepad inputs when joypad directional inputs to avoid wonkiness
int inputs = g_input1_state;
if (g_input1_state & 0xf0)
@@ -373,12 +369,14 @@
bool is_replay = ZeldaRunFrame(inputs);
- if ((g_turbo ^ (is_replay & g_replay_turbo)) && (frameCtr++ & (g_turbo ? 0xf : 0x7f)) != 0)
- continue;
-
// Unlock mutex for the final rendering stage.
- SDL_UnlockMutex(audio_mutex);
+ SDL_UnlockMutex(g_audio_mutex);
+ if ((g_turbo ^ (is_replay & g_replay_turbo)) && (frameCtr++ & (g_turbo ? 0xf : 0x7f)) != 0) {
+ SDL_LockMutex(g_audio_mutex);
+ continue;
+ }
+
RenderScreen(window, renderer, texture, (g_win_flags & SDL_WINDOW_FULLSCREEN_DESKTOP) != 0);
SDL_RenderPresent(renderer); // vsyncs to 60 FPS?
@@ -400,17 +398,17 @@
lastTick = curTick;
}
#endif
- SDL_LockMutex(audio_mutex);
+ SDL_LockMutex(g_audio_mutex);
}
if (g_config.autosave)
SaveLoadSlot(kSaveLoad_Save, 0);
// clean sdl
if (g_config.enable_audio) {
- SDL_UnlockMutex(audio_mutex);
+ SDL_UnlockMutex(g_audio_mutex);
SDL_PauseAudioDevice(device, 1);
SDL_CloseAudioDevice(device);
}
- SDL_DestroyMutex(audio_mutex);
+ SDL_DestroyMutex(g_audio_mutex);
free(g_audiobuffer);
SDL_DestroyTexture(texture);
SDL_DestroyRenderer(renderer);