diff --git a/src/warppipe.cpp b/src/warppipe.cpp index 8603d09..8e911b7 100644 --- a/src/warppipe.cpp +++ b/src/warppipe.cpp @@ -449,8 +449,11 @@ void Client::Impl::NodeParamChanged(void* data, int, uint32_t id, auto* impl = static_cast(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(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 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 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) {