diff --git a/NEWS b/NEWS index 088f23c76..c6e18a8be 100644 --- a/NEWS +++ b/NEWS @@ -23,6 +23,8 @@ ver 0.23.9 (not yet released) - cdio_paranoia: add options "mode" and "skip" * decoder - ffmpeg: support FFmpeg 5.1 +* filter + - replay gain: fix delayed volume display with handler=mixer * output - pipewire: set app icon * fix bogus volume levels with multiple partitions diff --git a/src/filter/plugins/ReplayGainFilterPlugin.cxx b/src/filter/plugins/ReplayGainFilterPlugin.cxx index 91907310b..4840943d9 100644 --- a/src/filter/plugins/ReplayGainFilterPlugin.cxx +++ b/src/filter/plugins/ReplayGainFilterPlugin.cxx @@ -23,6 +23,8 @@ #include "tag/ReplayGainInfo.hxx" #include "config/ReplayGainConfig.hxx" #include "mixer/MixerControl.hxx" +#include "mixer/MixerInternal.hxx" +#include "mixer/Listener.hxx" #include "pcm/AudioFormat.hxx" #include "pcm/Volume.hxx" #include "util/Domain.hxx" @@ -170,9 +172,11 @@ ReplayGainFilter::Update() try { mixer_set_volume(mixer, _volume); - /* TODO: emit this idle event only for the - current partition */ - idle_add(IDLE_MIXER); + /* invoke the mixer's listener manually, just + in case the mixer implementation didn't do + that already (this depends on the + implementation) */ + mixer->listener.OnMixerVolumeChanged(*mixer, _volume); } catch (...) { LogError(std::current_exception(), "Failed to update hardware mixer"); diff --git a/src/mixer/MixerAll.cxx b/src/mixer/MixerAll.cxx index 5d528d652..abd0d8462 100644 --- a/src/mixer/MixerAll.cxx +++ b/src/mixer/MixerAll.cxx @@ -188,8 +188,8 @@ MultipleOutputs::SetSoftwareVolume(unsigned volume) noexcept auto *mixer = ao->GetMixer(); if (mixer != nullptr && - (&mixer->plugin == &software_mixer_plugin || - &mixer->plugin == &null_mixer_plugin)) + (mixer->IsPlugin(software_mixer_plugin) || + mixer->IsPlugin(null_mixer_plugin))) mixer_set_volume(mixer, volume); } } diff --git a/src/mixer/MixerControl.cxx b/src/mixer/MixerControl.cxx index 3a4a8331f..b797d4bbe 100644 --- a/src/mixer/MixerControl.cxx +++ b/src/mixer/MixerControl.cxx @@ -92,7 +92,7 @@ mixer_close(Mixer *mixer) void mixer_auto_close(Mixer *mixer) { - if (!mixer->plugin.global) + if (!mixer->IsGlobal()) mixer_close(mixer); } @@ -103,7 +103,7 @@ mixer_get_volume(Mixer *mixer) assert(mixer != nullptr); - if (mixer->plugin.global && !mixer->failure) + if (mixer->IsGlobal() && !mixer->failure) mixer_open(mixer); const std::scoped_lock protect(mixer->mutex); @@ -128,7 +128,7 @@ mixer_set_volume(Mixer *mixer, unsigned volume) assert(mixer != nullptr); assert(volume <= 100); - if (mixer->plugin.global && !mixer->failure) + if (mixer->IsGlobal() && !mixer->failure) mixer_open(mixer); const std::scoped_lock protect(mixer->mutex);