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; | ||||
| } | ||||
| 
 | ||||
| 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) | ||||
| { | ||||
| 	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); | ||||
| 		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 { | ||||
| 		float boost = get_soft_volume_boost(node); | ||||
| 		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