Make volume changes to apply to disabled software mixers.
Move audio output state check ahead of mixer check and force volume applying even for disabled software mixed outputs. This fixes incorrect software mixer volume that used to occur when volume was changed while output being disabled. This is easily reproduced with following sequence of commands on multi-output software mixed MPD setup. mpc volume 38; mpc disable 3; mpc volume 88; mpc enable 3 On current MPD, following commands would result in output 3 playing at volume 38, while all other enabled outputs would play at volume 88. Moreover, global volume would display average of outputs real volumes. In my case, it's 75. After applying this patch, following commands would produce expected behavior. All outputs play at expected (88) volume. And volume is correctly displayed as 88. Closes https://github.com/MusicPlayerDaemon/MPD/issues/1423 Signed-off-by: Vitaly Ostrosablin tmp6154@yandex.ru Signed-off-by: Vitaly Ostrosablin <tmp6154@yandex.ru>
This commit is contained in:
parent
a757eebfbb
commit
ac06088948
2
NEWS
2
NEWS
|
@ -1,6 +1,8 @@
|
||||||
ver 0.23.7 (not yet released)
|
ver 0.23.7 (not yet released)
|
||||||
* decoder
|
* decoder
|
||||||
- opus: fix missing song length on high-latency files
|
- opus: fix missing song length on high-latency files
|
||||||
|
* mixer
|
||||||
|
- software: update volume of disabled outputs
|
||||||
|
|
||||||
ver 0.23.6 (2022/03/14)
|
ver 0.23.6 (2022/03/14)
|
||||||
* protocol
|
* protocol
|
||||||
|
|
|
@ -34,13 +34,15 @@ gcc_pure
|
||||||
static int
|
static int
|
||||||
output_mixer_get_volume(const AudioOutputControl &ao) noexcept
|
output_mixer_get_volume(const AudioOutputControl &ao) noexcept
|
||||||
{
|
{
|
||||||
if (!ao.IsEnabled())
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
auto *mixer = ao.GetMixer();
|
auto *mixer = ao.GetMixer();
|
||||||
if (mixer == nullptr)
|
if (mixer == nullptr)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
/* software mixers are always considered, even if they are
|
||||||
|
disabled */
|
||||||
|
if (!ao.IsEnabled() && !mixer->IsPlugin(software_mixer_plugin))
|
||||||
|
return -1;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return mixer_get_volume(mixer);
|
return mixer_get_volume(mixer);
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
|
@ -76,13 +78,15 @@ output_mixer_set_volume(AudioOutputControl &ao, unsigned volume) noexcept
|
||||||
{
|
{
|
||||||
assert(volume <= 100);
|
assert(volume <= 100);
|
||||||
|
|
||||||
if (!ao.IsEnabled())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
auto *mixer = ao.GetMixer();
|
auto *mixer = ao.GetMixer();
|
||||||
if (mixer == nullptr)
|
if (mixer == nullptr)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
/* software mixers are always updated, even if they are
|
||||||
|
disabled */
|
||||||
|
if (!ao.IsEnabled() && !mixer->IsPlugin(software_mixer_plugin))
|
||||||
|
return false;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
mixer_set_volume(mixer, volume);
|
mixer_set_volume(mixer, volume);
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Reference in New Issue