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)
|
ver 0.24.1 (not yet released)
|
||||||
|
* output
|
||||||
|
- sndio: fix rounding error in volume calculation
|
||||||
|
|
||||||
ver 0.24 (2025/03/11)
|
ver 0.24 (2025/03/11)
|
||||||
* protocol
|
* protocol
|
||||||
|
@@ -139,12 +139,12 @@ SndioOutput::Play(std::span<const std::byte> src)
|
|||||||
void
|
void
|
||||||
SndioOutput::SetVolume(unsigned int volume)
|
SndioOutput::SetVolume(unsigned int volume)
|
||||||
{
|
{
|
||||||
sio_setvol(hdl, volume * SIO_MAXVOL / 100);
|
sio_setvol(hdl, (volume * SIO_MAXVOL + 50) / 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline unsigned int
|
static inline unsigned int
|
||||||
RawToPercent(int raw_volume) {
|
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
|
void
|
||||||
|
Reference in New Issue
Block a user