bluez5: iso-io: get BAP interval from dbus, not getsockopt

For ISO server sockets, the QOS struct from getsockopt contains values
with different meaning from ISO client socket. Get the values via DBus
instead, which is right in both cases.
This commit is contained in:
Pauli Virtanen 2023-04-06 23:02:44 +03:00 committed by Wim Taymans
parent ae76789f24
commit eca13ec230
4 changed files with 13 additions and 23 deletions

View file

@ -2838,6 +2838,7 @@ static int transport_update_props(struct spa_bt_transport *transport,
dbus_message_iter_get_basic(&it[1], &value);
spa_log_debug(monitor->log, "transport %p: %s=%d", transport, key, (int)value);
transport->bap_interval = value;
}
else if (spa_streq(key, "Framing")) {
dbus_bool_t value;
@ -3004,6 +3005,7 @@ static int transport_create_iso_io(struct spa_bt_transport *transport)
spa_log_debug(monitor->log, "transport %p: new ISO IO", transport);
transport->iso_io = spa_bt_iso_io_create(transport->fd, sink,
transport->bap_cig, transport->bap_interval,
monitor->log, monitor->data_loop, monitor->data_system);
if (transport->iso_io == NULL)
return -errno;

View file

@ -613,6 +613,7 @@ struct spa_bt_transport {
uint8_t bap_cig;
uint8_t bap_cis;
uint32_t bap_location;
uint32_t bap_interval;
struct spa_bt_iso_io *iso_io;
struct spa_bt_sco_io *sco_io;

View file

@ -16,8 +16,6 @@
#include <spa/utils/result.h>
#include <spa/node/io.h>
#include <bluetooth/bluetooth.h>
#include "config.h"
#include "iso-io.h"
@ -195,19 +193,12 @@ static void group_on_timeout(struct spa_source *source)
set_timeout(group, group->next);
}
static struct group *group_create(int fd, struct spa_log *log, struct spa_loop *data_loop,
struct spa_system *data_system)
static struct group *group_create(uint8_t cig, uint32_t interval,
struct spa_log *log, struct spa_loop *data_loop, struct spa_system *data_system)
{
#if defined(HAVE_BLUETOOTH_BAP) && defined(BT_ISO_QOS)
struct group *group;
struct bt_iso_qos qos;
socklen_t len;
len = sizeof(qos);
if (getsockopt(fd, SOL_BLUETOOTH, BT_ISO_QOS, &qos, &len) < 0)
return NULL;
if (qos.out.interval <= 5000) {
if (interval <= 5000) {
errno = EINVAL;
return NULL;
}
@ -218,11 +209,11 @@ static struct group *group_create(int fd, struct spa_log *log, struct spa_loop *
spa_log_topic_init(log, &log_topic);
group->cig = qos.cig;
group->cig = cig;
group->log = log;
group->data_loop = data_loop;
group->data_system = data_system;
group->duration = qos.out.interval * SPA_NSEC_PER_USEC;
group->duration = interval * SPA_NSEC_PER_USEC;
spa_list_init(&group->streams);
@ -243,10 +234,6 @@ static struct group *group_create(int fd, struct spa_log *log, struct spa_loop *
spa_loop_add_source(group->data_loop, &group->source);
return group;
#else
errno = EOPNOTSUPP;
return NULL;
#endif
}
static int do_remove_source(struct spa_loop *loop, bool async, uint32_t seq,
@ -294,13 +281,13 @@ struct stream *stream_create(int fd, bool sink, struct group *group)
return stream;
}
struct spa_bt_iso_io *spa_bt_iso_io_create(int fd, bool sink, struct spa_log *log,
struct spa_loop *data_loop, struct spa_system *data_system)
struct spa_bt_iso_io *spa_bt_iso_io_create(int fd, bool sink, uint8_t cig, uint32_t interval,
struct spa_log *log, struct spa_loop *data_loop, struct spa_system *data_system)
{
struct stream *stream;
struct group *group;
group = group_create(fd, log, data_loop, data_system);
group = group_create(cig, interval, log, data_loop, data_system);
if (group == NULL)
return NULL;

View file

@ -30,8 +30,8 @@ struct spa_bt_iso_io
typedef void (*spa_bt_iso_io_pull_t)(struct spa_bt_iso_io *io);
struct spa_bt_iso_io *spa_bt_iso_io_create(int fd, bool sink, struct spa_log *log,
struct spa_loop *data_loop, struct spa_system *data_system);
struct spa_bt_iso_io *spa_bt_iso_io_create(int fd, bool sink, uint8_t cig, uint32_t interval,
struct spa_log *log, struct spa_loop *data_loop, struct spa_system *data_system);
struct spa_bt_iso_io *spa_bt_iso_io_attach(struct spa_bt_iso_io *io, int fd, bool sink);
void spa_bt_iso_io_destroy(struct spa_bt_iso_io *io);
void spa_bt_iso_io_set_cb(struct spa_bt_iso_io *io, spa_bt_iso_io_pull_t pull, void *user_data);