From 307e166efbe0daa95784502a1e6eee6fffb69b15 Mon Sep 17 00:00:00 2001 From: goeiecool9999 <7033575+goeiecool9999@users.noreply.github.com> Date: Mon, 9 Dec 2024 18:04:00 +0100 Subject: [PATCH] fade from 0dB to -100dB in 1.5 seconds --- src/Cafe/HW/Latte/Core/LatteShaderCache.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp b/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp index b6cdee69..209ba9d1 100644 --- a/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp +++ b/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp @@ -176,7 +176,7 @@ class BootSoundPlayer { m_fadeOutRequested = false; m_stopRequested = false; - m_volumeFactor = 1.0f; + m_fadeOutSample = 0; m_bootSndPlayThread = std::thread{[this]() { StreamBootSound(); }}; @@ -188,15 +188,14 @@ class BootSoundPlayer m_fadeOutRequested = true; } - void ApplyFadeOutEffect(std::span samples, float fadeStep) + void ApplyFadeOutEffect(std::span samples, uint64 fadeOutDuration) { for(auto& i : samples) { - i *= m_volumeFactor; - if(m_volumeFactor >= fadeStep) - m_volumeFactor -= fadeStep; - else - m_volumeFactor = 0; + float decibel = (float)m_fadeOutSample / fadeOutDuration * -100.0f; + float volumeFactor = pow(10,decibel/20); + i *= volumeFactor; + m_fadeOutSample++; } } @@ -206,6 +205,7 @@ class BootSoundPlayer constexpr sint32 bitsPerSample = 16; constexpr sint32 samplesPerBlock = sampleRate / 10; // block is 1/10th of a second constexpr sint32 nChannels = 2; + constexpr uint64 fadeOutDuration = sampleRate * 3 / 2; // fadeout should last ~1.5 seconds static_assert(bitsPerSample % 8 == 0, "bits per sample is not a multiple of 8"); AudioAPIPtr bootSndAudioDev; @@ -240,7 +240,7 @@ class BootSoundPlayer constexpr sint32 audioBlockSize = samplesPerBlock * (bitsPerSample/8) * nChannels; BootSoundReader bootSndFileReader(bootSndFileHandle, audioBlockSize); - while(m_volumeFactor > 0 && !m_stopRequested) + while(m_fadeOutSample < fadeOutDuration && !m_stopRequested) { while (bootSndAudioDev->NeedAdditionalBlocks()) { @@ -252,7 +252,7 @@ class BootSoundPlayer break; } if(m_fadeOutRequested) - ApplyFadeOutEffect({data, samplesPerBlock * 2}, 1.0f / (sampleRate * 10.0f)); + ApplyFadeOutEffect({data, samplesPerBlock * 2}, fadeOutDuration); bootSndAudioDev->FeedBlock(data); } @@ -268,7 +268,7 @@ class BootSoundPlayer std::thread m_bootSndPlayThread; std::atomic_bool m_fadeOutRequested = false; std::atomic_bool m_stopRequested = false; - float m_volumeFactor = 1.0f; + uint64 m_fadeOutSample = 0; }; static BootSoundPlayer g_bootSndPlayer;