From 0171463daeedcecf177e52a8dae1b2d066465fcb Mon Sep 17 00:00:00 2001 From: NepDisk Date: Fri, 14 Nov 2025 19:43:38 -0500 Subject: [PATCH] Properly end non looping jingles in streamed audio formats --- src/sdl/al_sound.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/sdl/al_sound.c b/src/sdl/al_sound.c index 21a38227d..990954b5d 100644 --- a/src/sdl/al_sound.c +++ b/src/sdl/al_sound.c @@ -107,6 +107,7 @@ typedef struct audiostate_s ALuint musicbuffers[BUFFERCOUNT]; ALuint music; float loop_point; + boolean looping; boolean shutdown; } audiostate_t; @@ -277,6 +278,8 @@ void I_StartupSound(void) for (size_t i = 0; i < BUFFERCOUNT; i++) audio.musicbuffers[i] = INVALID_HANDLE; music_volume = sfx_volume = 0.f; + audio.loop_point = 0.0f; + audio.looping = false; #ifdef HAVE_OPENMPT CONS_Printf("libopenmpt version: %s\n", openmpt_get_string("library_version")); @@ -407,8 +410,17 @@ static boolean I_QueueNextSample(boolean unqueue) if (count == 0) { - sf_count_t finalposition = SecondsToSamples(audio.loop_point, audio.musicinfo.samplerate); - sf_seek(audio.musicstream, finalposition, SF_SEEK_SET); + // Loop music otherwise stop. + if (audio.looping) + { + sf_count_t finalposition = SecondsToSamples(audio.loop_point, audio.musicinfo.samplerate); + sf_seek(audio.musicstream, finalposition, SF_SEEK_SET); + } + else + { + I_StopSong(); + return false; + } } samplerate = audio.musicinfo.samplerate; @@ -1419,6 +1431,8 @@ boolean I_PlaySong(boolean looping) if (!I_UpdateMusicVolume()) return false; + audio.looping = looping; + #ifdef HAVE_GME if (gme) {