Fix volume slider on apps

This commit is contained in:
Joey Yakimowich-Payne 2026-01-31 08:36:11 -07:00
commit 609a195452

View file

@ -449,8 +449,11 @@ void Client::Impl::NodeParamChanged(void* data, int, uint32_t id,
auto* impl = static_cast<Client::Impl*>(np->impl_ptr);
float volume = -1.0f;
float mon_volume = -1.0f;
bool mute = false;
bool mon_mute = false;
bool found_mute = false;
bool found_mon_mute = false;
uint32_t n_channels = 0;
const auto* obj = reinterpret_cast<const spa_pod_object*>(param);
@ -466,6 +469,15 @@ void Client::Impl::NodeParamChanged(void* data, int, uint32_t id,
}
break;
}
case SPA_PROP_monitorVolumes: {
float vols[64];
uint32_t n = spa_pod_copy_array(&prop->value, SPA_TYPE_Float, vols, 64);
if (n > 0) {
mon_volume = vols[0];
if (n_channels == 0) n_channels = n;
}
break;
}
case SPA_PROP_mute: {
bool m = false;
if (spa_pod_get_bool(&prop->value, &m) >= 0) {
@ -474,19 +486,37 @@ void Client::Impl::NodeParamChanged(void* data, int, uint32_t id,
}
break;
}
case SPA_PROP_monitorMute: {
bool m = false;
if (spa_pod_get_bool(&prop->value, &m) >= 0) {
mon_mute = m;
found_mon_mute = true;
}
break;
}
}
}
bool is_virtual = false;
{
std::lock_guard<std::mutex> lock(impl->cache_mutex);
is_virtual = impl->virtual_streams.count(np->node_id) > 0;
}
float effective_vol = is_virtual && mon_volume >= 0.0f ? mon_volume : volume;
bool effective_mute = is_virtual && found_mon_mute ? mon_mute : mute;
bool effective_found_mute = is_virtual ? found_mon_mute : found_mute;
bool changed = false;
{
std::lock_guard<std::mutex> lock(impl->cache_mutex);
auto& vs = impl->volume_states[np->node_id];
if (volume >= 0.0f && std::abs(vs.volume - volume) > 0.0001f) {
vs.volume = volume;
if (effective_vol >= 0.0f && std::abs(vs.volume - effective_vol) > 0.0001f) {
vs.volume = effective_vol;
changed = true;
}
if (found_mute && vs.mute != mute) {
vs.mute = mute;
if (effective_found_mute && vs.mute != effective_mute) {
vs.mute = effective_mute;
changed = true;
}
if (n_channels > 0) {