From 37b04071888bc09ecd4c89f2064ba922bef09862 Mon Sep 17 00:00:00 2001 From: Kendall Garner <17521368+kgarner7@users.noreply.github.com> Date: Wed, 21 Aug 2024 23:04:37 -0700 Subject: [PATCH] simplify webaudio replaygain to reduce pop-in --- .../components/audio-player/index.tsx | 34 ++++++++++++++----- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/src/renderer/components/audio-player/index.tsx b/src/renderer/components/audio-player/index.tsx index bf88bf57..140da56d 100644 --- a/src/renderer/components/audio-player/index.tsx +++ b/src/renderer/components/audio-player/index.tsx @@ -277,18 +277,34 @@ export const AudioPlayer = forwardRef( }, [audioDeviceId, webAudio]); useEffect(() => { - if (webAudio && player1Source && player1 && currentPlayer === 1) { - const newVolume = calculateReplayGain(player1) * volume; - webAudio.gain.gain.setValueAtTime(newVolume, 0); - } - }, [calculateReplayGain, currentPlayer, player1, player1Source, volume, webAudio]); + if (!webAudio) return; - useEffect(() => { - if (webAudio && player2Source && player2 && currentPlayer === 2) { - const newVolume = calculateReplayGain(player2) * volume; + const sources = [player1Source ? player1 : null, player2Source ? player2 : null]; + const current = sources[currentPlayer - 1]; + + // Set the current replaygain + if (current) { + const newVolume = calculateReplayGain(current) * volume; webAudio.gain.gain.setValueAtTime(newVolume, 0); } - }, [calculateReplayGain, currentPlayer, player2, player2Source, volume, webAudio]); + + // Set the next track replaygain right before the end of this track + // Attempt to prevent pop-in for web audio. + const next = sources[3 - currentPlayer]; + if (next && current) { + const newVolume = calculateReplayGain(next) * volume; + webAudio.gain.gain.setValueAtTime(newVolume, (current.duration - 1) / 1000); + } + }, [ + calculateReplayGain, + currentPlayer, + player1, + player1Source, + player2, + player2Source, + volume, + webAudio, + ]); const handlePlayer1Start = useCallback( async (player: ReactPlayer) => {