rounds alsa HW mixer volume towards ±∞ depending on sgn(∆ vol)
This alleviates a problem in which 'volume +1' cannot be undo by 'volume -1' when using alsa hw mixer. Closes #104
This commit is contained in:
parent
f1ef9f9d31
commit
967af60327
2
NEWS
2
NEWS
|
@ -1,6 +1,8 @@
|
||||||
ver 0.20.13 (not yet released)
|
ver 0.20.13 (not yet released)
|
||||||
* output
|
* output
|
||||||
- osx: set up ring buffer to hold at least 100ms
|
- osx: set up ring buffer to hold at least 100ms
|
||||||
|
* mixer
|
||||||
|
- alsa: fix rounding errors
|
||||||
* database
|
* database
|
||||||
- simple: don't purge mount points on update/rescan
|
- simple: don't purge mount points on update/rescan
|
||||||
- simple: fix "mount" bug caused by bad compiler optimization
|
- simple: fix "mount" bug caused by bad compiler optimization
|
||||||
|
|
|
@ -292,7 +292,9 @@ AlsaMixer::SetVolume(unsigned volume)
|
||||||
{
|
{
|
||||||
assert(handle != nullptr);
|
assert(handle != nullptr);
|
||||||
|
|
||||||
int err = set_normalized_playback_volume(elem, 0.01*volume, 1);
|
double cur = get_normalized_playback_volume(elem, SND_MIXER_SCHN_FRONT_LEFT);
|
||||||
|
int delta = volume - lrint(100.*cur);
|
||||||
|
int err = set_normalized_playback_volume(elem, cur + 0.01*delta, delta);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
throw FormatRuntimeError("failed to set ALSA volume: %s",
|
throw FormatRuntimeError("failed to set ALSA volume: %s",
|
||||||
snd_strerror(err));
|
snd_strerror(err));
|
||||||
|
|
Loading…
Reference in New Issue