diff --git a/src/dusk/audio/DuskDsp.cpp b/src/dusk/audio/DuskDsp.cpp index 9d6f3d10d0..f52d191d09 100644 --- a/src/dusk/audio/DuskDsp.cpp +++ b/src/dusk/audio/DuskDsp.cpp @@ -72,20 +72,31 @@ static void RenderChannel( ChannelAuxData& channelAux, OutputSubframe& subframe); -static void ResetChannel(JASDsp::TChannel& channel, ChannelAuxData& aux) { - channel.mSamplesLeft = channel.mEndSample - channel.mSamplePosition; +constexpr static int PitchToSampleRate(u16 value) { + return static_cast(static_cast(SampleRate) * value / 4096); +} + +static void UpdateSampleRate(const JASDsp::TChannel& channel, ChannelAuxData& aux) { + auto sampleRate = PitchToSampleRate(channel.mPitch); const SDL_AudioSpec spec = { SDL_AUDIO_S16, 1, - static_cast(static_cast(SampleRate) * channel.mPitch / 4096) + sampleRate }; + SDL_SetAudioStreamFormat(aux.resampleStream, &spec, nullptr); + aux.prevPitch = channel.mPitch; +} + +static void ResetChannel(JASDsp::TChannel& channel, ChannelAuxData& aux) { + channel.mSamplesLeft = channel.mEndSample - channel.mSamplePosition; + aux.hist0 = 0; aux.hist1 = 0; SDL_ClearAudioStream(aux.resampleStream); - SDL_SetAudioStreamFormat(aux.resampleStream, &spec, nullptr); + UpdateSampleRate(channel, aux); channel.mResetFlag = false; } @@ -329,6 +340,8 @@ static void RenderChannel( OutputSubframe& subframe) { if (channel.mResetFlag) { ResetChannel(channel, channelAux); + } else if (channelAux.prevPitch != channel.mPitch) { + UpdateSampleRate(channel, channelAux); } DspSubframe audioLoadBuffer = {}; diff --git a/src/dusk/audio/DuskDsp.hpp b/src/dusk/audio/DuskDsp.hpp index e2dec52e1a..23e05b60e6 100644 --- a/src/dusk/audio/DuskDsp.hpp +++ b/src/dusk/audio/DuskDsp.hpp @@ -20,6 +20,7 @@ namespace dusk::audio { s16 hist1; s16 hist0; SDL_AudioStream* resampleStream; + u16 prevPitch; }; extern ChannelAuxData ChannelAux[DSP_CHANNELS];