Re: [PATCH BlueZ bluez v3] bap: Start BIG sync after receiving BIGInfo
Bastien Nocera <[email protected]> Tue, 28 Jul 2026 18:01:09 +0200
| Newsgroups | org.kernel.vger.linux-bluetooth |
|---|---|
| Message-ID | <[email protected]> |
On Tue, 2026-07-28 at 14:26 +0800, Yang Li via B4 Relay wrote: > From: Yang Li <[email protected]> > > The current implementation starts BIG sync before receiving a BIGInfo > report. According to the Bluetooth Core Specification, BIG sync > should > only be initiated after BIGInfo has been received. > > Starting BIG sync too early may cause unexpected controller behavior. > > Trigger BIG sync from the BIGInfo callback, following the same > approach > used by the short PA flow. > > Fixes: https://github.com/bluez/bluez/issues/2345 > > Signed-off-by: Yang Li <[email protected]> > --- > Changes in v3: > - Fixed coding style warning. > - Link to v2: > https://patch.msgid.link/[email protected] > > Changes in v2: > - Fixed build error. > - Link to v1: > https://patch.msgid.link/[email protected] > --- > profiles/audio/bap.c | 25 +++++++++++++++++++++---- > 1 file changed, 21 insertions(+), 4 deletions(-) > > diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c > index dd4b3c8ff..473e4cfc2 100644 > --- a/profiles/audio/bap.c > +++ b/profiles/audio/bap.c > @@ -3650,7 +3650,8 @@ static void setup_refresh_qos(void *data, void > *user_data) > setup->qos = *bt_bap_stream_get_qos(stream); > } > > -static void iso_do_big_sync(GIOChannel *io, void *user_data) > +static gboolean iso_do_big_sync(GIOChannel *io, GIOCondition cond, > + void *user_data) The return here is for: "The function should return FALSE if the event source should be removed." Not success or failure. See: https://docs.gtk.org/glib/callback.IOFunc.html https://docs.gtk.org/glib/func.io_add_watch.html > { > GError *err = NULL; > struct bap_setup *setup = user_data; > @@ -3659,7 +3660,7 @@ static void iso_do_big_sync(GIOChannel *io, > void *user_data) > struct bt_iso_qos qos; > struct queue *links = bt_bap_stream_io_get_links(setup- > >stream); > > - DBG("PA Sync done"); > + DBG("BIG info received, do BIG sync"); > > g_io_channel_unref(data->listen_io); > g_io_channel_shutdown(data->listen_io, TRUE, NULL); > @@ -3682,6 +3683,7 @@ static void iso_do_big_sync(GIOChannel *io, > void *user_data) > BT_IO_OPT_INVALID)) { > error("bt_io_set: %s", err->message); > g_error_free(err); > + return FALSE; This is wrong, this should be TRUE or better G_SOURCE_REMOVE. > } > > if (!bt_io_bcast_accept(io, > @@ -3692,16 +3694,31 @@ static void iso_do_big_sync(GIOChannel *io, > void *user_data) > iso_bc_addr.bc_bis, BT_IO_OPT_INVALID)) { > error("bt_io_bcast_accept: %s", err->message); > g_error_free(err); > + return FALSE; Here too. > } > + > + return TRUE; > +} > + > +static void long_pa_sync_confirm_cb(GIOChannel *io, void *user_data) > +{ > + struct bap_setup *setup = user_data; > + struct bap_data *data = setup->data; > + > + DBG("Long PA Sync done"); > + > + /* store io and add watch that will call iso_do_big_sync */ > + data->io_id = g_io_add_watch(io, G_IO_OUT, iso_do_big_sync, > + setup); > } > > static void pa_and_big_sync(struct bap_setup *setup) > { > GError *err = NULL; > struct bap_data *bap_data = setup->data; > - > DBG("Create PA sync with this source"); > - bap_data->listen_io = bt_io_listen(NULL, iso_do_big_sync, > setup, > + > + bap_data->listen_io = bt_io_listen(NULL, > long_pa_sync_confirm_cb, setup, > NULL, &err, > BT_IO_OPT_SOURCE_BDADDR, > btd_adapter_get_address(bap_data->adapter), > > --- > base-commit: 89d477bb5494eef0b24e5667be62f854da250a97 > change-id: 20260724-big_sync-45c24ec09121 > > Best regards,