mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-29 05:40:27 -04:00
bluez5: fix volume ids
Node ids don't map directly to volume ids. Fix the indexing.
This commit is contained in:
parent
b15ec9bec9
commit
bbe1587f71
2 changed files with 19 additions and 7 deletions
|
|
@ -3608,9 +3608,13 @@ fail:
|
||||||
static int transport_set_volume(void *data, int id, float volume)
|
static int transport_set_volume(void *data, int id, float volume)
|
||||||
{
|
{
|
||||||
struct spa_bt_transport *transport = data;
|
struct spa_bt_transport *transport = data;
|
||||||
struct spa_bt_transport_volume *t_volume = &transport->volumes[id];
|
struct spa_bt_transport_volume *t_volume;
|
||||||
uint16_t value;
|
uint16_t value;
|
||||||
|
|
||||||
|
spa_assert(id >= 0 && id < (int)SPA_N_ELEMENTS(transport->volumes));
|
||||||
|
|
||||||
|
t_volume = &transport->volumes[id];
|
||||||
|
|
||||||
if (!t_volume->active || !spa_bt_transport_volume_enabled(transport))
|
if (!t_volume->active || !spa_bt_transport_volume_enabled(transport))
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -402,9 +402,15 @@ static void node_update_soft_volumes(struct node *node, float hw_volume)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int get_volume_id(int node_id)
|
||||||
|
{
|
||||||
|
return (node_id & SINK_ID_FLAG) ? SPA_BT_VOLUME_ID_TX : SPA_BT_VOLUME_ID_RX;
|
||||||
|
}
|
||||||
|
|
||||||
static bool node_update_volume_from_transport(struct node *node, bool reset)
|
static bool node_update_volume_from_transport(struct node *node, bool reset)
|
||||||
{
|
{
|
||||||
struct impl *impl = node->impl;
|
struct impl *impl = node->impl;
|
||||||
|
int volume_id = get_volume_id(node->id);
|
||||||
struct spa_bt_transport_volume *t_volume;
|
struct spa_bt_transport_volume *t_volume;
|
||||||
float prev_hw_volume;
|
float prev_hw_volume;
|
||||||
|
|
||||||
|
|
@ -417,7 +423,7 @@ static bool node_update_volume_from_transport(struct node *node, bool reset)
|
||||||
&& impl->profile != DEVICE_PROFILE_HSP_HFP)
|
&& impl->profile != DEVICE_PROFILE_HSP_HFP)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
t_volume = &node->transport->volumes[node->id];
|
t_volume = &node->transport->volumes[volume_id];
|
||||||
|
|
||||||
if (!t_volume->active)
|
if (!t_volume->active)
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -2562,6 +2568,7 @@ static void device_set_update_volumes(struct node *node)
|
||||||
struct device_set *dset = &impl->device_set;
|
struct device_set *dset = &impl->device_set;
|
||||||
float hw_volume = node_get_hw_volume(node);
|
float hw_volume = node_get_hw_volume(node);
|
||||||
bool sink = (node->id == DEVICE_ID_SINK_SET);
|
bool sink = (node->id == DEVICE_ID_SINK_SET);
|
||||||
|
int volume_id = get_volume_id(node->id);
|
||||||
struct device_set_member *members = sink ? dset->sink : dset->source;
|
struct device_set_member *members = sink ? dset->sink : dset->source;
|
||||||
uint32_t n_members = sink ? dset->sinks : dset->sources;
|
uint32_t n_members = sink ? dset->sinks : dset->sources;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
|
@ -2572,7 +2579,7 @@ static void device_set_update_volumes(struct node *node)
|
||||||
|
|
||||||
for (i = 0; i < n_members; ++i) {
|
for (i = 0; i < n_members; ++i) {
|
||||||
struct spa_bt_transport *t = members[i].transport;
|
struct spa_bt_transport *t = members[i].transport;
|
||||||
struct spa_bt_transport_volume *t_volume = t ? &t->volumes[members[i].id] : NULL;
|
struct spa_bt_transport_volume *t_volume = t ? &t->volumes[volume_id] : NULL;
|
||||||
|
|
||||||
if (!t_volume || !t_volume->active)
|
if (!t_volume || !t_volume->active)
|
||||||
goto soft_volume;
|
goto soft_volume;
|
||||||
|
|
@ -2580,13 +2587,13 @@ static void device_set_update_volumes(struct node *node)
|
||||||
|
|
||||||
node_update_soft_volumes(node, hw_volume);
|
node_update_soft_volumes(node, hw_volume);
|
||||||
for (i = 0; i < n_members; ++i)
|
for (i = 0; i < n_members; ++i)
|
||||||
spa_bt_transport_set_volume(members[i].transport, members[i].id, hw_volume);
|
spa_bt_transport_set_volume(members[i].transport, volume_id, hw_volume);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
soft_volume:
|
soft_volume:
|
||||||
/* Soft volume fallback */
|
/* Soft volume fallback */
|
||||||
for (i = 0; i < n_members; ++i)
|
for (i = 0; i < n_members; ++i)
|
||||||
spa_bt_transport_set_volume(members[i].transport, members[i].id, 1.0f);
|
spa_bt_transport_set_volume(members[i].transport, volume_id, 1.0f);
|
||||||
node_update_soft_volumes(node, 1.0f);
|
node_update_soft_volumes(node, 1.0f);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -2596,6 +2603,7 @@ static int node_set_volume(struct impl *this, struct node *node, float volumes[]
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
int changed = 0;
|
int changed = 0;
|
||||||
struct spa_bt_transport_volume *t_volume;
|
struct spa_bt_transport_volume *t_volume;
|
||||||
|
int volume_id = get_volume_id(node->id);
|
||||||
|
|
||||||
if (n_volumes == 0)
|
if (n_volumes == 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
@ -2609,7 +2617,7 @@ static int node_set_volume(struct impl *this, struct node *node, float volumes[]
|
||||||
node->volumes[i] = volumes[i % n_volumes];
|
node->volumes[i] = volumes[i % n_volumes];
|
||||||
}
|
}
|
||||||
|
|
||||||
t_volume = node->transport ? &node->transport->volumes[node->id]: NULL;
|
t_volume = node->transport ? &node->transport->volumes[volume_id]: NULL;
|
||||||
|
|
||||||
if (t_volume && t_volume->active
|
if (t_volume && t_volume->active
|
||||||
&& spa_bt_transport_volume_enabled(node->transport)) {
|
&& spa_bt_transport_volume_enabled(node->transport)) {
|
||||||
|
|
@ -2617,7 +2625,7 @@ static int node_set_volume(struct impl *this, struct node *node, float volumes[]
|
||||||
spa_log_debug(this->log, "node %d hardware volume %f", node->id, hw_volume);
|
spa_log_debug(this->log, "node %d hardware volume %f", node->id, hw_volume);
|
||||||
|
|
||||||
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, volume_id, hw_volume);
|
||||||
} else if (node->id == DEVICE_ID_SOURCE_SET || node->id == DEVICE_ID_SINK_SET) {
|
} else if (node->id == DEVICE_ID_SOURCE_SET || node->id == DEVICE_ID_SINK_SET) {
|
||||||
device_set_update_volumes(node);
|
device_set_update_volumes(node);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue