From 4eb1971adabfdd3387a22ab09907b3be69eb7e32 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Fri, 12 Mar 2021 02:51:30 +0100 Subject: [PATCH] :sparkles: Apply sound volume to videos --- SourceX/storm/storm.cpp | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/SourceX/storm/storm.cpp b/SourceX/storm/storm.cpp index a08ce9d94..c9176ef1d 100644 --- a/SourceX/storm/storm.cpp +++ b/SourceX/storm/storm.cpp @@ -335,6 +335,8 @@ void setIniInt(const char *keyname, const char *valuename, int value) double SVidFrameEnd; double SVidFrameLength; +char SVidAudioDepth; +double SVidVolume; BYTE SVidLoop; smk SVidSMK; SDL_Color SVidPreviousPalette[256]; @@ -492,8 +494,12 @@ void SVidPlayBegin(const char *filename, int a2, int a3, int a4, int a5, int fla SDL_zero(audioFormat); audioFormat.freq = rate[0]; audioFormat.format = depth[0] == 16 ? AUDIO_S16SYS : AUDIO_U8; + SVidAudioDepth = depth[0]; audioFormat.channels = channels[0]; + SVidVolume = sgOptions.Audio.nSoundVolume - VOLUME_MIN; + SVidVolume /= -VOLUME_MIN; + Mix_CloseAudio(); #if SDL_VERSION_ATLEAST(2, 0, 4) @@ -614,6 +620,21 @@ BOOL SVidLoadNextFrame() return true; } +unsigned char *SVidApplyVolume(const unsigned char *raw, unsigned long rawLen) +{ + unsigned char *scaled = (unsigned char *)malloc(rawLen); + + if (SVidAudioDepth == 16) { + for (unsigned long i = 0; i < rawLen / 2; i++) + ((Sint16 *)scaled)[i] = ((Sint16 *)raw)[i] * SVidVolume; + } else { + for (unsigned long i = 0; i < rawLen; i++) + scaled[i] = raw[i] * SVidVolume; + } + + return (unsigned char *)scaled; +} + BOOL SVidPlayContinue(void) { if (smk_palette_updated(SVidSMK)) { @@ -645,14 +666,17 @@ BOOL SVidPlayContinue(void) } if (HaveAudio()) { + unsigned long len = smk_get_audio_size(SVidSMK, 0); + unsigned char *audio = SVidApplyVolume(smk_get_audio(SVidSMK, 0), len); #if SDL_VERSION_ATLEAST(2, 0, 4) - if (SDL_QueueAudio(deviceId, smk_get_audio(SVidSMK, 0), smk_get_audio_size(SVidSMK, 0)) <= -1) { + if (SDL_QueueAudio(deviceId, audio, len) <= -1) { SDL_Log(SDL_GetError()); return false; } #else - sVidAudioQueue->Enqueue(smk_get_audio(SVidSMK, 0), smk_get_audio_size(SVidSMK, 0)); + sVidAudioQueue->Enqueue(audio, len); #endif + free(audio); } if (SDL_GetTicks() * 1000 >= SVidFrameEnd) {