mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-01 22:58:50 -04:00
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:
parent
479bf3c803
commit
08438903e5
3 changed files with 17 additions and 8 deletions
|
|
@ -785,12 +785,19 @@ static void set_volume(pa_alsa_device *dev, const pa_cvolume *v)
|
||||||
pa_cvolume_max(&new_soft_volume),
|
pa_cvolume_max(&new_soft_volume),
|
||||||
pa_yes_no(accurate_enough));
|
pa_yes_no(accurate_enough));
|
||||||
|
|
||||||
if (!accurate_enough && impl->events && impl->events->set_soft_volume) {
|
if (accurate_enough)
|
||||||
uint32_t i, n_volumes = new_soft_volume.channels;
|
pa_cvolume_reset(&new_soft_volume, new_soft_volume.channels);
|
||||||
float volumes[n_volumes];
|
|
||||||
for (i = 0; i < n_volumes; i++)
|
if (!pa_cvolume_equal(&dev->soft_volume, &new_soft_volume)) {
|
||||||
volumes[i] = ((float)new_soft_volume.values[i]) / PA_VOLUME_NORM;
|
dev->soft_volume = new_soft_volume;
|
||||||
impl->events->set_soft_volume(impl->user_data, &dev->device, volumes, n_volumes);
|
|
||||||
|
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 {
|
} else {
|
||||||
|
|
@ -1417,6 +1424,7 @@ int acp_device_set_volume(struct acp_device *dev, const float *volume, uint32_t
|
||||||
d->set_volume(d, &v);
|
d->set_volume(d, &v);
|
||||||
} else {
|
} else {
|
||||||
d->real_volume = v;
|
d->real_volume = v;
|
||||||
|
d->soft_volume = v;
|
||||||
if (impl->events && impl->events->set_soft_volume)
|
if (impl->events && impl->events->set_soft_volume)
|
||||||
impl->events->set_soft_volume(impl->user_data, dev, volume, n_volume);
|
impl->events->set_soft_volume(impl->user_data, dev, volume, n_volume);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -297,6 +297,7 @@ struct pa_alsa_device {
|
||||||
unsigned decibel_volume:1;
|
unsigned decibel_volume:1;
|
||||||
pa_cvolume real_volume;
|
pa_cvolume real_volume;
|
||||||
pa_cvolume hardware_volume;
|
pa_cvolume hardware_volume;
|
||||||
|
pa_cvolume soft_volume;
|
||||||
|
|
||||||
pa_volume_t base_volume;
|
pa_volume_t base_volume;
|
||||||
unsigned n_volume_steps;
|
unsigned n_volume_steps;
|
||||||
|
|
|
||||||
|
|
@ -746,7 +746,7 @@ static void on_set_soft_volume(void *data, struct acp_device *dev,
|
||||||
struct spa_pod_builder b = { 0 };
|
struct spa_pod_builder b = { 0 };
|
||||||
struct spa_pod_frame f[1];
|
struct spa_pod_frame f[1];
|
||||||
|
|
||||||
spa_log_debug(this->log, "device %s soft volume %f", dev->name, volume[0]);
|
spa_log_info(this->log, "device %s soft volume %f", dev->name, volume[0]);
|
||||||
|
|
||||||
spa_pod_builder_init(&b, buffer, sizeof(buffer));
|
spa_pod_builder_init(&b, buffer, sizeof(buffer));
|
||||||
spa_pod_builder_push_object(&b, &f[0],
|
spa_pod_builder_push_object(&b, &f[0],
|
||||||
|
|
@ -772,7 +772,7 @@ static void on_set_soft_mute(void *data, struct acp_device *dev,
|
||||||
struct spa_pod_builder b = { 0 };
|
struct spa_pod_builder b = { 0 };
|
||||||
struct spa_pod_frame f[1];
|
struct spa_pod_frame f[1];
|
||||||
|
|
||||||
spa_log_debug(this->log, "device %s soft mute %d", dev->name, mute);
|
spa_log_info(this->log, "device %s soft mute %d", dev->name, mute);
|
||||||
|
|
||||||
spa_pod_builder_init(&b, buffer, sizeof(buffer));
|
spa_pod_builder_init(&b, buffer, sizeof(buffer));
|
||||||
spa_pod_builder_push_object(&b, &f[0],
|
spa_pod_builder_push_object(&b, &f[0],
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue