output/plugins/SndioOutputPlugin: Fix sndio volume calculation
This commit addresses issues #2226 and MusicPlayerDaemon/ncmpc#95. MPD and sndio volume ranges being different, the formula to transform a value from one set to the other is in the form of `(a * x + b) / c` where: - a = output set max value - b = adjustment term - c = input set max value Previous calculation formula had `b = 0`, scaling values too low and rendering increment impossible. Having `b = out_maxval / 2` balances the transformation, ensuring a better spread of values across the output range. Closes #2226
This commit is contained in:
2
NEWS
2
NEWS
@@ -1,4 +1,6 @@
|
||||
ver 0.24.1 (not yet released)
|
||||
* output
|
||||
- sndio: fix rounding error in volume calculation
|
||||
|
||||
ver 0.24 (2025/03/11)
|
||||
* protocol
|
||||
|
@@ -139,12 +139,12 @@ SndioOutput::Play(std::span<const std::byte> src)
|
||||
void
|
||||
SndioOutput::SetVolume(unsigned int volume)
|
||||
{
|
||||
sio_setvol(hdl, volume * SIO_MAXVOL / 100);
|
||||
sio_setvol(hdl, (volume * SIO_MAXVOL + 50) / 100);
|
||||
}
|
||||
|
||||
static inline unsigned int
|
||||
RawToPercent(int raw_volume) {
|
||||
return raw_volume < 0 ? 100 : raw_volume * 100 / SIO_MAXVOL;
|
||||
return raw_volume < 0 ? 100 : (raw_volume * 100 + SIO_MAXVOL / 2) / SIO_MAXVOL;
|
||||
}
|
||||
|
||||
void
|
||||
|
Reference in New Issue
Block a user