mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-10-29 05:40:27 -04:00 
			
		
		
		
	bluez5: support BAP hardware volume on device sets
Enable hardware volume for device sets, when all devices in the set support HW volume.
This commit is contained in:
		
							parent
							
								
									34ac0d8256
								
							
						
					
					
						commit
						de0f54c324
					
				
					 1 changed files with 37 additions and 0 deletions
				
			
		|  | @ -2555,6 +2555,41 @@ static int impl_enum_params(void *object, int seq, | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void device_set_update_volumes(struct node *node) | ||||||
|  | { | ||||||
|  | 	struct impl *impl = node->impl; | ||||||
|  | 	struct device_set *dset = &impl->device_set; | ||||||
|  | 	float hw_volume = node_get_hw_volume(node); | ||||||
|  | 	bool sink = (node->id == DEVICE_ID_SINK_SET); | ||||||
|  | 	struct device_set_member *members = sink ? dset->sink : dset->source; | ||||||
|  | 	uint32_t n_members = sink ? dset->sinks : dset->sources; | ||||||
|  | 	uint32_t i; | ||||||
|  | 
 | ||||||
|  | 	/* Check if all sub-devices have HW volume */ | ||||||
|  | 	if ((sink && !dset->sink_enabled) || (!sink && !dset->source_enabled)) | ||||||
|  | 		goto soft_volume; | ||||||
|  | 
 | ||||||
|  | 	for (i = 0; i < n_members; ++i) { | ||||||
|  | 		struct spa_bt_transport *t = members[i].transport; | ||||||
|  | 		struct spa_bt_transport_volume *t_volume = t ? &t->volumes[members[i].id] : NULL; | ||||||
|  | 
 | ||||||
|  | 		if (!t_volume || !t_volume->active) | ||||||
|  | 			goto soft_volume; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	node_update_soft_volumes(node, hw_volume); | ||||||
|  | 	for (i = 0; i < n_members; ++i) | ||||||
|  | 		spa_bt_transport_set_volume(members[i].transport, members[i].id, hw_volume); | ||||||
|  | 	return; | ||||||
|  | 
 | ||||||
|  | soft_volume: | ||||||
|  | 	/* Soft volume fallback */ | ||||||
|  | 	for (i = 0; i < n_members; ++i) | ||||||
|  | 		spa_bt_transport_set_volume(members[i].transport, members[i].id, 1.0f); | ||||||
|  | 	node_update_soft_volumes(node, 1.0f); | ||||||
|  | 	return; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static int node_set_volume(struct impl *this, struct node *node, float volumes[], uint32_t n_volumes) | static int node_set_volume(struct impl *this, struct node *node, float volumes[], uint32_t n_volumes) | ||||||
| { | { | ||||||
| 	uint32_t i; | 	uint32_t i; | ||||||
|  | @ -2582,6 +2617,8 @@ static int node_set_volume(struct impl *this, struct node *node, float volumes[] | ||||||
| 
 | 
 | ||||||
| 		node_update_soft_volumes(node, hw_volume); | 		node_update_soft_volumes(node, hw_volume); | ||||||
| 		spa_bt_transport_set_volume(node->transport, node->id, hw_volume); | 		spa_bt_transport_set_volume(node->transport, node->id, hw_volume); | ||||||
|  | 	} else if (node->id == DEVICE_ID_SOURCE_SET || node->id == DEVICE_ID_SINK_SET) { | ||||||
|  | 		device_set_update_volumes(node); | ||||||
| 	} else { | 	} else { | ||||||
| 		float boost = get_soft_volume_boost(node); | 		float boost = get_soft_volume_boost(node); | ||||||
| 		for (uint32_t i = 0; i < node->n_channels; ++i) | 		for (uint32_t i = 0; i < node->n_channels; ++i) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Pauli Virtanen
						Pauli Virtanen