From 0dd9aeea692c220abcbe1d4d39e88040f7f6ea79 Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Wed, 28 Apr 2021 11:18:49 +0100 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=20Cleanup=20DISABLE=5FSTR?= =?UTF-8?q?EAMING=5FMUSIC=20handling?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extracts `LoadMusic` and `CleanupMusic` functions. --- Source/sound.cpp | 84 +++++++++++++++--------------------- Source/utils/soundsample.cpp | 2 +- 2 files changed, 36 insertions(+), 50 deletions(-) diff --git a/Source/sound.cpp b/Source/sound.cpp index 6679ad599..85a9ea2aa 100644 --- a/Source/sound.cpp +++ b/Source/sound.cpp @@ -23,8 +23,10 @@ namespace devilution { bool gbSndInited; -/** Specifies whether background music is enabled. */ +/** Handle to the music Storm file. */ HANDLE sghMusic; +/** The active background music track id. */ +_music_id sgnMusicTrack = NUM_MUSIC; namespace { @@ -32,15 +34,39 @@ std::optional music; #ifdef DISABLE_STREAMING_MUSIC char *musicBuffer; +#endif + +void LoadMusic() +{ +#ifndef DISABLE_STREAMING_MUSIC + SDL_RWops *musicRw = SFileRw_FromStormHandle(sghMusic); +#else + int bytestoread = SFileGetFileSize(sghMusic, 0); + musicBuffer = (char *)DiabloAllocPtr(bytestoread); + SFileReadFile(sghMusic, musicBuffer, bytestoread, NULL, 0); + SFileCloseFile(sghMusic); + sghMusic = NULL; -void FreeMusicBuffer() + SDL_RWops *musicRw = SDL_RWFromConstMem(musicBuffer, bytestoread); +#endif + music.emplace(musicRw, std::make_unique(), + std::make_unique(sgOptions.Audio.nResamplingQuality), /*closeRw=*/true); +} + +void CleanupMusic() { + music = std::nullopt; + sgnMusicTrack = NUM_MUSIC; +#ifndef DISABLE_STREAMING_MUSIC + SFileCloseFile(sghMusic); + sghMusic = nullptr; +#else if (musicBuffer != nullptr) { mem_free_dbg(musicBuffer); musicBuffer = nullptr; } +#endif } -#endif // DISABLE_STREAMING_MUSIC } // namespace @@ -49,8 +75,7 @@ void FreeMusicBuffer() bool gbMusicOn = true; /** Specifies whether sound effects are enabled. */ bool gbSoundOn = true; -/** Specifies the active background music track id. */ -_music_id sgnMusicTrack = NUM_MUSIC; + /** Maps from track ID to track name in spawn. */ const char *const sgszSpawnMusicTracks[NUM_MUSIC] = { "Music\\sTowne.wav", @@ -200,17 +225,8 @@ void snd_deinit() { void music_stop() { - if (music) { - music = std::nullopt; -#ifndef DISABLE_STREAMING_MUSIC - SFileCloseFile(sghMusic); - sghMusic = nullptr; -#endif - sgnMusicTrack = NUM_MUSIC; -#ifdef DISABLE_STREAMING_MUSIC - FreeMusicBuffer(); -#endif - } + if (music) + CleanupMusic(); } void music_start(uint8_t nTrack) @@ -229,47 +245,17 @@ void music_start(uint8_t nTrack) if (!success) { sghMusic = nullptr; } else { -#ifndef DISABLE_STREAMING_MUSIC - SDL_RWops *musicRw = SFileRw_FromStormHandle(sghMusic); -#else - int bytestoread = SFileGetFileSize(sghMusic, 0); - musicBuffer = (char *)DiabloAllocPtr(bytestoread); - SFileReadFile(sghMusic, musicBuffer, bytestoread, NULL, 0); - SFileCloseFile(sghMusic); - sghMusic = NULL; - - SDL_RWops *musicRw = SDL_RWFromConstMem(musicBuffer, bytestoread); - if (musicRw == nullptr) - ErrSdl(); -#endif - music.emplace(musicRw, std::make_unique(), - std::make_unique(sgOptions.Audio.nResamplingQuality), /*closeRw=*/true); + LoadMusic(); if (!music->open()) { LogError(LogCategory::Audio, "Aulib::Stream::open (from music_start): {}", SDL_GetError()); - music = std::nullopt; -#ifndef DISABLE_STREAMING_MUSIC - SFileCloseFile(sghMusic); - sghMusic = nullptr; -#endif - sgnMusicTrack = NUM_MUSIC; -#ifdef DISABLE_STREAMING_MUSIC - FreeMusicBuffer(); -#endif + CleanupMusic(); return; } music->setVolume(1.F - static_cast(sgOptions.Audio.nMusicVolume) / VOLUME_MIN); if (!music->play(/*iterations=*/0)) { LogError(LogCategory::Audio, "Aulib::Stream::play (from music_start): {}", SDL_GetError()); - music = std::nullopt; -#ifndef DISABLE_STREAMING_MUSIC - SFileCloseFile(sghMusic); - sghMusic = nullptr; -#endif - sgnMusicTrack = NUM_MUSIC; -#ifdef DISABLE_STREAMING_MUSIC - FreeMusicBuffer(); -#endif + CleanupMusic(); return; } diff --git a/Source/utils/soundsample.cpp b/Source/utils/soundsample.cpp index ae53120aa..45d2be396 100644 --- a/Source/utils/soundsample.cpp +++ b/Source/utils/soundsample.cpp @@ -91,7 +91,7 @@ int SoundSample::SetChunk(std::unique_ptr fileData, DWORD dwByte if (!stream_->open()) { stream_ = std::nullopt; file_data_ = nullptr; - LogError(LogCategory::Audio, "Aulib::Stream::open (from SoundSample::SetChunkStream): {}", SDL_GetError()); + LogError(LogCategory::Audio, "Aulib::Stream::open (from SoundSample::SetChunk): {}", SDL_GetError()); return -1; }