From 95f4768e462ca5afe4d1619d9659a1c76723fa87 Mon Sep 17 00:00:00 2001 From: James R Date: Fri, 29 Dec 2023 04:32:25 -0800 Subject: [PATCH] Stereo Mode: fix unsequenced track fading at the end - Starts both stereo and stereo_fade in tandem - Suspends the tune which is not to be heard - Swaps suspension when toggling SEQ - Special handling so fade-out can not be interrupted by switching off SEQ --- src/menus/transient/sound-test.c | 21 +++++++++++++++++++++ src/s_sound.c | 19 ++++++++++++++----- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/menus/transient/sound-test.c b/src/menus/transient/sound-test.c index b3a5bcafd..0bd62b307 100644 --- a/src/menus/transient/sound-test.c +++ b/src/menus/transient/sound-test.c @@ -80,6 +80,27 @@ static void M_SoundTestSeq(INT32 choice) (void)choice; soundtest.autosequence ^= true; + + if (soundtest.playing && S_SoundTestCanSequenceFade()) + { + boolean unfaded = Music_DurationLeft("stereo_fade") > Music_FadeOutDuration("stereo_fade") * TICRATE / 1000; + + // 1) You cannot cancel a fade once it has started + // 2) However, if the fade wasn't heard, switching + // over restarts the fade + if (!unfaded && Music_Suspended("stereo_fade")) + { + Music_DelayEnd("stereo_fade", 0); + unfaded = true; + } + + if (unfaded) + { + soundtest.tune ^= 1; + Music_UnSuspend(S_SoundTestTune(0)); + Music_Suspend(S_SoundTestTune(1)); + } + } } static void M_SoundTestShf(INT32 choice) diff --git a/src/s_sound.c b/src/s_sound.c index 8cc1e7801..66477abec 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -1657,6 +1657,12 @@ boolean S_SoundTestCanSequenceFade(void) soundtest.currenttrack == soundtest.current->numtracks-1; } +static void S_SoundTestReconfigure(const char *tune) +{ + Music_Remap(tune, soundtest.current->name[soundtest.currenttrack]); + Music_Play(tune); +} + void S_SoundTestPlay(void) { UINT32 sequencemaxtime = 0; @@ -1670,9 +1676,8 @@ void S_SoundTestPlay(void) soundtest.playing = true; soundtest.tune = (soundtest.autosequence == true && S_SoundTestCanSequenceFade() == true); - Music_Remap(soundtest.tune, soundtest.current->name[soundtest.currenttrack]); - Music_Loop(soundtest.tune, !soundtest.current->basenoloop[soundtest.currenttrack]); - Music_Play(soundtest.tune); + S_SoundTestReconfigure("stereo"); + S_SoundTestReconfigure("stereo_fade"); // Assuming this song is now actually playing sequencemaxtime = I_GetSongLength(); @@ -1701,8 +1706,12 @@ void S_SoundTestPlay(void) } } - // ms to TICRATE conversion - Music_DelayEnd(S_SoundTestTune(0), (TICRATE*sequencemaxtime)/1000); + Music_DelayEnd( + S_SoundTestCanSequenceFade() ? "stereo_fade" : "stereo", + (TICRATE*sequencemaxtime)/1000 // ms to TICRATE conversion + ); + + Music_Suspend(S_SoundTestTune(1)); } void S_SoundTestStop(void)