From 2688ed93f09732dfe3a718f56a4e34b4c8b55216 Mon Sep 17 00:00:00 2001 From: PJB3005 Date: Tue, 17 Mar 2026 00:03:35 +0100 Subject: [PATCH] Audio processing in f32 --- src/dusk/audio/DuskAudioSystem.cpp | 16 +++++++--------- src/dusk/audio/DuskDsp.cpp | 28 +++++++++++++++++----------- src/dusk/audio/DuskDsp.hpp | 2 +- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/dusk/audio/DuskAudioSystem.cpp b/src/dusk/audio/DuskAudioSystem.cpp index ae23b995f3..1d625a8101 100644 --- a/src/dusk/audio/DuskAudioSystem.cpp +++ b/src/dusk/audio/DuskAudioSystem.cpp @@ -67,8 +67,9 @@ void SDLCALL GetNewAudio( } } +#if 0 static std::ofstream outRaw("guh.raw", std::ios_base::out | std::ios_base::binary); -static std::ofstream outRawF32("guh.f32.raw", std::ios_base::out | std::ios_base::binary); +#endif int RenderNewAudioFrame() { JASCriticalSection section; @@ -82,7 +83,9 @@ int RenderNewAudioFrame() { JASAudioThread::snIntCount -= 1; } +#if 0 outRaw.flush(); +#endif return static_cast(countSubframes) * DSP_SUBFRAME_SIZE; } @@ -93,14 +96,9 @@ void RenderAudioSubframe() { JASDriver::updateDSP(); DspRender(subFrame); - std::array guh = {}; - for (int i = 0; i < DSP_SUBFRAME_SIZE; i++) { - guh[i] = (f32)subFrame[i] / (f32)0x7FFF; - } - +#if 0 outRaw.write((const char*)subFrame.data(), sizeof(subFrame)); - outRawF32.write((const char*)guh.data(), sizeof(guh)); +#endif - SDL_PutAudioStreamData(PlaybackStream, guh.data(), sizeof(guh)); - // SDL_PutAudioStreamData(PlaybackStream, subFrame.data(), sizeof(subFrame)); + SDL_PutAudioStreamData(PlaybackStream, subFrame.data(), sizeof(subFrame)); } diff --git a/src/dusk/audio/DuskDsp.cpp b/src/dusk/audio/DuskDsp.cpp index 3c5679e9df..a901cc0cdc 100644 --- a/src/dusk/audio/DuskDsp.cpp +++ b/src/dusk/audio/DuskDsp.cpp @@ -80,7 +80,7 @@ static void ResetChannel(JASDsp::TChannel& channel, ChannelAuxData& aux) { static void MixSubframe(DspSubframe& dst, const DspSubframe& src) { for (int i = 0; i < dst.size(); i++) { - dst[i] = static_cast(dst[i] + src[i]); + dst[i] += src[i]; } } @@ -197,7 +197,7 @@ static void RenderChannel( ResetChannel(channel, channelAux); } - int wantRead = static_cast(subframe.size() * sizeof(s16)); + int wantRead = static_cast(subframe.size() * sizeof(subframe[0])); auto read = SDL_GetAudioStreamData( channelAux.resampleStream, subframe.data(), @@ -207,27 +207,33 @@ static void RenderChannel( channel.mIsFinished = true; } + u16 volume; + if (channel.mAutoMixerBeenSet) { + volume = channel.mAutoMixerVolume; + } else { + volume = channel.mOutputChannels[0].mTargetVolume; + } + f32 ratio = static_cast(volume) / static_cast(JASDriver::getChannelLevel_dsp()); for (auto& sample : subframe) { - u16 volume; - if (channel.mAutoMixerBeenSet) { - volume = channel.mAutoMixerVolume; - } else { - volume = channel.mOutputChannels[0].mTargetVolume; - } - sample = (s16)((s64)sample * volume / JASDriver::getChannelLevel_dsp()); + sample *= ratio; } } void dusk::audio::DspInit() { - constexpr SDL_AudioSpec spec = { + constexpr SDL_AudioSpec srcSpec = { SDL_AUDIO_S16, 1, SampleRate }; + constexpr SDL_AudioSpec dstSpec = { + SDL_AUDIO_F32, + 1, + SampleRate + }; for (int i = 0; i < DSP_CHANNELS; i++) { auto& aux = ChannelAux[i]; - aux.resampleStream = SDL_CreateAudioStream(&spec, &spec); + aux.resampleStream = SDL_CreateAudioStream(&srcSpec, &dstSpec); SDL_SetAudioStreamGetCallback( aux.resampleStream, diff --git a/src/dusk/audio/DuskDsp.hpp b/src/dusk/audio/DuskDsp.hpp index 186f7de677..76a4ef2e14 100644 --- a/src/dusk/audio/DuskDsp.hpp +++ b/src/dusk/audio/DuskDsp.hpp @@ -17,7 +17,7 @@ namespace dusk::audio { extern ChannelAuxData ChannelAux[DSP_CHANNELS]; - using DspSubframe = std::array; + using DspSubframe = std::array; void DspInit(); void DspRender(DspSubframe& subframe);