Skip to content

output/Source.cxx: cross-fade using the ReplayGainFilter's output format - #2573

Merged
MaxKellermann merged 1 commit into
MusicPlayerDaemon:v0.24.xfrom
ferguson:crossfade-replaygain-format
Aug 22, 2026
Merged

MaxKellermann merged 1 commit into
MusicPlayerDaemon:v0.24.xfrom
ferguson:crossfade-replaygain-format

Conversation

@ferguson

Copy link
Copy Markdown
Contributor

With software volume enabled ReplayGainFilter converts S16 input to S24_P32 (PcmVolume::Open() with allow_convert=true). FilterChunk() applied that filter to both chunks and then called pcm_mix() with in_audio_format.format (S16) on data that was already S24_P32. Mixing 32-bit samples as if they were 16-bit produces noise in the cross-fade.

It seem to fix #2050, probably also #1101. I've been using it on my mpds for 3 months and have not heard any crossfade noise or noticed any other problems.

When software volume is enabled (mixer_type "software"), the
ReplayGainFilter converts S16 input to S24_P32 (PcmVolume::Open() with
allow_convert=true) to avoid losing precision.  FilterChunk() applied
that filter to both chunks and then called pcm_mix() with
in_audio_format.format (S16) on data that was already S24_P32.  Mixing
32-bit samples as if they were 16-bit produces loud noise for the whole
cross-fade duration.

OpenFilter() already uses the ReplayGainFilter's output format for the
rest of the filter chain; use it for the cross-fade mix as well.

Fixes MusicPlayerDaemon#2050, probably also MusicPlayerDaemon#1101.
@MaxKellermann
MaxKellermann merged commit c7bb706 into MusicPlayerDaemon:v0.24.x Aug 22, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants