mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	pulse-server: try to avoid setting the same volume/mute
This commit is contained in:
		
							parent
							
								
									c3c6dcf53f
								
							
						
					
					
						commit
						c140a573be
					
				
					 2 changed files with 26 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -2998,6 +2998,10 @@ static int do_set_volume(struct client *client, uint32_t command, uint32_t tag,
 | 
			
		|||
	}
 | 
			
		||||
	collect_device_info(o, card, &dev_info);
 | 
			
		||||
 | 
			
		||||
	if (dev_info.have_volume &&
 | 
			
		||||
	    volume_compare(&dev_info.volume_info.volume, &volume) == 0)
 | 
			
		||||
		goto done;
 | 
			
		||||
 | 
			
		||||
	if (card != NULL && dev_info.active_port != SPA_ID_INVALID)
 | 
			
		||||
		res = set_card_volume_mute(card, dev_info.active_port,
 | 
			
		||||
				dev_info.device, &volume, NULL);
 | 
			
		||||
| 
						 | 
				
			
			@ -3007,6 +3011,7 @@ static int do_set_volume(struct client *client, uint32_t command, uint32_t tag,
 | 
			
		|||
	if (res < 0)
 | 
			
		||||
		return res;
 | 
			
		||||
 | 
			
		||||
done:
 | 
			
		||||
	return reply_simple_ack(client, tag);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -3058,6 +3063,10 @@ static int do_set_mute(struct client *client, uint32_t command, uint32_t tag, st
 | 
			
		|||
	}
 | 
			
		||||
	collect_device_info(o, card, &dev_info);
 | 
			
		||||
 | 
			
		||||
	if (dev_info.have_volume &&
 | 
			
		||||
	    dev_info.volume_info.mute == mute)
 | 
			
		||||
		goto done;
 | 
			
		||||
 | 
			
		||||
	if (card != NULL && dev_info.active_port != SPA_ID_INVALID)
 | 
			
		||||
		res = set_card_volume_mute(card, dev_info.active_port,
 | 
			
		||||
				dev_info.device, NULL, &mute);
 | 
			
		||||
| 
						 | 
				
			
			@ -3066,7 +3075,7 @@ static int do_set_mute(struct client *client, uint32_t command, uint32_t tag, st
 | 
			
		|||
 | 
			
		||||
	if (res < 0)
 | 
			
		||||
		return res;
 | 
			
		||||
 | 
			
		||||
done:
 | 
			
		||||
	return reply_simple_ack(client, tag);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -46,6 +46,22 @@ static inline void volume_make(struct volume *vol, uint8_t channels)
 | 
			
		|||
	vol->channels = channels;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int volume_compare(struct volume *vol, struct volume *other)
 | 
			
		||||
{
 | 
			
		||||
	uint8_t i;
 | 
			
		||||
	if (vol->channels != other->channels) {
 | 
			
		||||
		pw_log_info("channels %d<>%d", vol->channels, other->channels);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	for (i = 0; i < vol->channels; i++) {
 | 
			
		||||
		if (vol->values[i] != other->values[i]) {
 | 
			
		||||
			pw_log_info("val %f<>%f", vol->values[i], other->values[i]);
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct volume_info {
 | 
			
		||||
	struct volume volume;
 | 
			
		||||
	struct channel_map map;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue