diff --git a/Source/storm/storm_svid.cpp b/Source/storm/storm_svid.cpp index 541631c12..b9689a1bc 100644 --- a/Source/storm/storm_svid.cpp +++ b/Source/storm/storm_svid.cpp @@ -260,7 +260,7 @@ bool SVidPlayBegin(const char *filename, int flags) SVidAudioBuffer = std::unique_ptr { new int16_t[audioInfo.idealBufferSize] }; auto decoder = std::make_unique(audioInfo.nChannels, audioInfo.sampleRate); SVidAudioDecoder = decoder.get(); - SVidAudioStream.emplace(/*rwops=*/nullptr, std::move(decoder), CreateAulibResampler(), /*closeRw=*/false); + SVidAudioStream.emplace(/*rwops=*/nullptr, std::move(decoder), CreateAulibResampler(audioInfo.sampleRate), /*closeRw=*/false); const float volume = static_cast(*sgOptions.Audio.soundVolume - VOLUME_MIN) / -VOLUME_MIN; SVidAudioStream->setVolume(volume); if (!diablo_is_focused()) diff --git a/Source/utils/aulib.hpp b/Source/utils/aulib.hpp index 959072a34..cae755d4f 100644 --- a/Source/utils/aulib.hpp +++ b/Source/utils/aulib.hpp @@ -17,8 +17,10 @@ namespace devilution { -inline std::unique_ptr CreateAulibResampler() +inline std::unique_ptr CreateAulibResampler(int sourceRate) { + if (static_cast(*sgOptions.Audio.sampleRate) == sourceRate) + return nullptr; switch (*sgOptions.Audio.resampler) { #ifdef DEVILUTIONX_RESAMPLER_SPEEX case Resampler::Speex: diff --git a/Source/utils/soundsample.cpp b/Source/utils/soundsample.cpp index 009d0e9d2..2cb833845 100644 --- a/Source/utils/soundsample.cpp +++ b/Source/utils/soundsample.cpp @@ -66,7 +66,11 @@ std::unique_ptr CreateDecoder(bool isMp3) std::unique_ptr CreateStream(SDL_RWops *handle, bool isMp3) { - return std::make_unique(handle, CreateDecoder(isMp3), CreateAulibResampler(), /*closeRw=*/true); + auto decoder = CreateDecoder(isMp3); + if (!decoder->open(handle)) // open for `getRate` + return nullptr; + auto resampler = CreateAulibResampler(decoder->getRate()); + return std::make_unique(handle, std::move(decoder), std::move(resampler), /*closeRw=*/true); } /**