Fix volume slider on apps
This commit is contained in:
parent
cb9770a757
commit
609a195452
1 changed files with 34 additions and 4 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue