acp: reset soft volume

When we have accurate enough hardware volume, set the software volume to
1.0. Also fixes the issue of going to 0 volume and then staying silent
until we raise the volume above 1.0.
This commit is contained in:
Wim Taymans 2020-09-28 12:40:16 +02:00
parent 479bf3c803
commit 08438903e5
3 changed files with 17 additions and 8 deletions

View file

@ -785,12 +785,19 @@ static void set_volume(pa_alsa_device *dev, const pa_cvolume *v)
pa_cvolume_max(&new_soft_volume),
pa_yes_no(accurate_enough));
if (!accurate_enough && impl->events && impl->events->set_soft_volume) {
uint32_t i, n_volumes = new_soft_volume.channels;
float volumes[n_volumes];
for (i = 0; i < n_volumes; i++)
volumes[i] = ((float)new_soft_volume.values[i]) / PA_VOLUME_NORM;
impl->events->set_soft_volume(impl->user_data, &dev->device, volumes, n_volumes);
if (accurate_enough)
pa_cvolume_reset(&new_soft_volume, new_soft_volume.channels);
if (!pa_cvolume_equal(&dev->soft_volume, &new_soft_volume)) {
dev->soft_volume = new_soft_volume;
if (impl->events && impl->events->set_soft_volume) {
uint32_t i, n_volumes = new_soft_volume.channels;
float volumes[n_volumes];
for (i = 0; i < n_volumes; i++)
volumes[i] = ((float)new_soft_volume.values[i]) / PA_VOLUME_NORM;
impl->events->set_soft_volume(impl->user_data, &dev->device, volumes, n_volumes);
}
}
} else {
@ -1417,6 +1424,7 @@ int acp_device_set_volume(struct acp_device *dev, const float *volume, uint32_t
d->set_volume(d, &v);
} else {
d->real_volume = v;
d->soft_volume = v;
if (impl->events && impl->events->set_soft_volume)
impl->events->set_soft_volume(impl->user_data, dev, volume, n_volume);
}

View file

@ -297,6 +297,7 @@ struct pa_alsa_device {
unsigned decibel_volume:1;
pa_cvolume real_volume;
pa_cvolume hardware_volume;
pa_cvolume soft_volume;
pa_volume_t base_volume;
unsigned n_volume_steps;