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);
|
auto* impl = static_cast<Client::Impl*>(np->impl_ptr);
|
||||||
|
|
||||||
float volume = -1.0f;
|
float volume = -1.0f;
|
||||||
|
float mon_volume = -1.0f;
|
||||||
bool mute = false;
|
bool mute = false;
|
||||||
|
bool mon_mute = false;
|
||||||
bool found_mute = false;
|
bool found_mute = false;
|
||||||
|
bool found_mon_mute = false;
|
||||||
uint32_t n_channels = 0;
|
uint32_t n_channels = 0;
|
||||||
|
|
||||||
const auto* obj = reinterpret_cast<const spa_pod_object*>(param);
|
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;
|
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: {
|
case SPA_PROP_mute: {
|
||||||
bool m = false;
|
bool m = false;
|
||||||
if (spa_pod_get_bool(&prop->value, &m) >= 0) {
|
if (spa_pod_get_bool(&prop->value, &m) >= 0) {
|
||||||
|
|
@ -474,19 +486,37 @@ void Client::Impl::NodeParamChanged(void* data, int, uint32_t id,
|
||||||
}
|
}
|
||||||
break;
|
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;
|
bool changed = false;
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(impl->cache_mutex);
|
std::lock_guard<std::mutex> lock(impl->cache_mutex);
|
||||||
auto& vs = impl->volume_states[np->node_id];
|
auto& vs = impl->volume_states[np->node_id];
|
||||||
if (volume >= 0.0f && std::abs(vs.volume - volume) > 0.0001f) {
|
if (effective_vol >= 0.0f && std::abs(vs.volume - effective_vol) > 0.0001f) {
|
||||||
vs.volume = volume;
|
vs.volume = effective_vol;
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
if (found_mute && vs.mute != mute) {
|
if (effective_found_mute && vs.mute != effective_mute) {
|
||||||
vs.mute = mute;
|
vs.mute = effective_mute;
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
if (n_channels > 0) {
|
if (n_channels > 0) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue