mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05: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,13 +785,20 @@ 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)
 | 
				
			||||||
 | 
								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;
 | 
									uint32_t i, n_volumes = new_soft_volume.channels;
 | 
				
			||||||
				float volumes[n_volumes];
 | 
									float volumes[n_volumes];
 | 
				
			||||||
				for (i = 0; i < n_volumes; i++)
 | 
									for (i = 0; i < n_volumes; i++)
 | 
				
			||||||
					volumes[i] = ((float)new_soft_volume.values[i]) / PA_VOLUME_NORM;
 | 
										volumes[i] = ((float)new_soft_volume.values[i]) / PA_VOLUME_NORM;
 | 
				
			||||||
				impl->events->set_soft_volume(impl->user_data, &dev->device, volumes, n_volumes);
 | 
									impl->events->set_soft_volume(impl->user_data, &dev->device, volumes, n_volumes);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		pa_log_debug("Wrote hardware volume: %d", pa_cvolume_max(&r));
 | 
							pa_log_debug("Wrote hardware volume: %d", pa_cvolume_max(&r));
 | 
				
			||||||
| 
						 | 
					@ -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