mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-03 09:01:54 -05:00
channelmix: improve soft volume state
When we have a soft Mute or Volume, use the soft volume. When we get a volume update with only a channel Mute/Volume, use the channel volumes. See #1140
This commit is contained in:
parent
9ee55832e9
commit
5a6967858e
1 changed files with 17 additions and 6 deletions
|
|
@ -509,8 +509,8 @@ static int apply_props(struct impl *this, const struct spa_pod *param)
|
||||||
struct spa_pod_object *obj = (struct spa_pod_object *) param;
|
struct spa_pod_object *obj = (struct spa_pod_object *) param;
|
||||||
struct props *p = &this->props;
|
struct props *p = &this->props;
|
||||||
int changed = 0;
|
int changed = 0;
|
||||||
|
bool have_channel_volume = false;
|
||||||
p->have_soft_volume = false;
|
bool have_soft_volume = false;
|
||||||
|
|
||||||
SPA_POD_OBJECT_FOREACH(obj, prop) {
|
SPA_POD_OBJECT_FOREACH(obj, prop) {
|
||||||
switch (prop->key) {
|
switch (prop->key) {
|
||||||
|
|
@ -519,13 +519,17 @@ static int apply_props(struct impl *this, const struct spa_pod *param)
|
||||||
changed++;
|
changed++;
|
||||||
break;
|
break;
|
||||||
case SPA_PROP_mute:
|
case SPA_PROP_mute:
|
||||||
if (spa_pod_get_bool(&prop->value, &p->channel.mute) == 0)
|
if (spa_pod_get_bool(&prop->value, &p->channel.mute) == 0) {
|
||||||
changed++;
|
changed++;
|
||||||
|
have_channel_volume = true;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case SPA_PROP_channelVolumes:
|
case SPA_PROP_channelVolumes:
|
||||||
if ((p->channel.n_volumes = spa_pod_copy_array(&prop->value, SPA_TYPE_Float,
|
if ((p->channel.n_volumes = spa_pod_copy_array(&prop->value, SPA_TYPE_Float,
|
||||||
p->channel.volumes, SPA_AUDIO_MAX_CHANNELS)) > 0)
|
p->channel.volumes, SPA_AUDIO_MAX_CHANNELS)) > 0) {
|
||||||
changed++;
|
changed++;
|
||||||
|
have_channel_volume = true;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case SPA_PROP_channelMap:
|
case SPA_PROP_channelMap:
|
||||||
if ((p->n_channels = spa_pod_copy_array(&prop->value, SPA_TYPE_Id,
|
if ((p->n_channels = spa_pod_copy_array(&prop->value, SPA_TYPE_Id,
|
||||||
|
|
@ -533,14 +537,16 @@ static int apply_props(struct impl *this, const struct spa_pod *param)
|
||||||
changed++;
|
changed++;
|
||||||
break;
|
break;
|
||||||
case SPA_PROP_softMute:
|
case SPA_PROP_softMute:
|
||||||
if (spa_pod_get_bool(&prop->value, &p->soft.mute) == 0)
|
if (spa_pod_get_bool(&prop->value, &p->soft.mute) == 0) {
|
||||||
changed++;
|
changed++;
|
||||||
|
have_soft_volume = true;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case SPA_PROP_softVolumes:
|
case SPA_PROP_softVolumes:
|
||||||
if ((p->soft.n_volumes = spa_pod_copy_array(&prop->value, SPA_TYPE_Float,
|
if ((p->soft.n_volumes = spa_pod_copy_array(&prop->value, SPA_TYPE_Float,
|
||||||
p->soft.volumes, SPA_AUDIO_MAX_CHANNELS)) > 0) {
|
p->soft.volumes, SPA_AUDIO_MAX_CHANNELS)) > 0) {
|
||||||
changed++;
|
changed++;
|
||||||
p->have_soft_volume = true;
|
have_soft_volume = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SPA_PROP_monitorMute:
|
case SPA_PROP_monitorMute:
|
||||||
|
|
@ -557,6 +563,11 @@ static int apply_props(struct impl *this, const struct spa_pod *param)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (changed) {
|
if (changed) {
|
||||||
|
if (have_soft_volume)
|
||||||
|
p->have_soft_volume = true;
|
||||||
|
else if (have_channel_volume)
|
||||||
|
p->have_soft_volume = false;
|
||||||
|
|
||||||
remap_volumes(this, &GET_IN_PORT(this, 0)->format);
|
remap_volumes(this, &GET_IN_PORT(this, 0)->format);
|
||||||
set_volume(this);
|
set_volume(this);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue