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