* [PATCH BlueZ v2 1/3] org.bluez.Device: Introduced PreferredBearer
@ 2025-02-25 22:00 Luiz Augusto von Dentz
2025-02-25 22:00 ` [PATCH BlueZ v2 2/3] device: Add implementation of PreferredBearer Luiz Augusto von Dentz
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Luiz Augusto von Dentz @ 2025-02-25 22:00 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This introduces PreferredBearer property which can be used to indicate
what bearer shall be connected first rather than just using last seen
bearer which may not work always since it seems some devices sometimes
advertises on LE bearer but expects connections over BR/EDR e.g:
https://github.com/bluez/bluez/issues/1092
Also with the introduction of LE Audio this might become even more of a
problem since most likely users would like to select which bearer to use
rather than using the last-seen policy.
---
doc/org.bluez.Device.rst | 29 ++++++++++++++++++++++++++++-
1 file changed, 28 insertions(+), 1 deletion(-)
diff --git a/doc/org.bluez.Device.rst b/doc/org.bluez.Device.rst
index f8d4a68a6b41..13328249b0b0 100644
--- a/doc/org.bluez.Device.rst
+++ b/doc/org.bluez.Device.rst
@@ -40,7 +40,8 @@ void Connect()
are skip and check latest seen bearer.
3. Connect last seen bearer, in case the timestamps are the same BR/EDR
- takes precedence.
+ takes precedence, or in case **PreferredBearer** has been set to a
+ specific bearer then that is used instead.
Possible errors:
@@ -346,3 +347,29 @@ array{object, dict} Sets [readonly, experimental]
:byte Rank:
Rank of the device in the Set.
+
+string PreferredBearer [readwrite, optional, experimental]
+``````````````````````````````````````````````````````````
+
+ Indicate the preferred bearer when initiating a connection, only
+ available for dual-mode devices.
+
+ When changing from "bredr" to "le" the device will be removed from the
+ 'auto-connect' list so it won't automatically be connected when
+ adverting.
+
+ Note: Changes only take effect when the device is disconnected.
+
+ Possible values:
+
+ :"last-seen":
+
+ Connect to last seen bearer first. Default.
+
+ :"bredr":
+
+ Connect to BR/EDR first.
+
+ :"le":
+
+ Connect to LE first.
--
2.48.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH BlueZ v2 2/3] device: Add implementation of PreferredBearer
2025-02-25 22:00 [PATCH BlueZ v2 1/3] org.bluez.Device: Introduced PreferredBearer Luiz Augusto von Dentz
@ 2025-02-25 22:00 ` Luiz Augusto von Dentz
2025-02-25 22:00 ` [PATCH BlueZ v2 3/3] client: Add support get/set PreferredBearer Luiz Augusto von Dentz
2025-02-25 23:12 ` [BlueZ,v2,1/3] org.bluez.Device: Introduced PreferredBearer bluez.test.bot
2 siblings, 0 replies; 9+ messages in thread
From: Luiz Augusto von Dentz @ 2025-02-25 22:00 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds initial implementation of PreferredBearer.
---
src/device.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 92 insertions(+), 3 deletions(-)
diff --git a/src/device.c b/src/device.c
index ec97fc889056..75ae1f0d027e 100644
--- a/src/device.c
+++ b/src/device.c
@@ -152,6 +152,7 @@ struct svc_callback {
/* Per-bearer (LE or BR/EDR) device state */
struct bearer_state {
+ bool prefer;
bool paired;
bool bonded;
bool connected;
@@ -2543,10 +2544,12 @@ static uint8_t select_conn_bearer(struct btd_device *dev)
time_t bredr_last = NVAL_TIME, le_last = NVAL_TIME;
time_t current = time(NULL);
- /* Prefer bonded bearer in case only one is bonded */
- if (dev->bredr_state.bonded && !dev->le_state.bonded )
+ /* Use preferred bearer or bonded bearer in case only one is bonded */
+ if (dev->bredr_state.prefer ||
+ (dev->bredr_state.bonded && !dev->le_state.bonded))
return BDADDR_BREDR;
- else if (!dev->bredr_state.bonded && dev->le_state.bonded)
+ else if (dev->le_state.prefer ||
+ (!dev->bredr_state.bonded && dev->le_state.bonded))
return dev->bdaddr_type;
/* If the address is random it can only be connected over LE */
@@ -3340,6 +3343,88 @@ static const GDBusMethodTable device_methods[] = {
{ }
};
+static const char *device_prefer_bearer_str(struct btd_device *device)
+{
+ if (device->bredr_state.prefer)
+ return "bredr";
+ else if (device->le_state.prefer)
+ return "le";
+ else
+ return "last-seen";
+}
+
+static gboolean
+dev_property_get_prefer_bearer(const GDBusPropertyTable *property,
+ DBusMessageIter *iter, void *data)
+{
+ struct btd_device *device = data;
+ const char *str = device_prefer_bearer_str(device);
+
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
+
+ return TRUE;
+}
+
+static void
+dev_property_set_prefer_bearer(const GDBusPropertyTable *property,
+ DBusMessageIter *value,
+ GDBusPendingPropertySet id, void *data)
+{
+ struct btd_device *device = data;
+ const char *str;
+
+ if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_STRING) {
+ g_dbus_pending_property_error(id,
+ ERROR_INTERFACE ".InvalidArguments",
+ "Invalid arguments in method call");
+ return;
+ }
+
+ dbus_message_iter_get_basic(value, &str);
+
+ if (strcasecmp(str, "last-seen") == 0) {
+ device->bredr_state.prefer = false;
+ device->le_state.prefer = false;
+ } else if (strcasecmp(str, "bredr") == 0) {
+ device->bredr_state.prefer = true;
+ device->le_state.prefer = false;
+ /* Remove device from auto-connect list so the kernel does not
+ * attempt to auto-connect to it in case it starts advertising.
+ */
+ device_set_auto_connect(device, FALSE);
+ } else if (strcasecmp(str, "le") == 0) {
+ device->le_state.prefer = true;
+ device->bredr_state.prefer = false;
+ /* Add device to auto-connect list */
+ device_set_auto_connect(device, TRUE);
+ } else {
+ g_dbus_pending_property_error(id,
+ ERROR_INTERFACE ".InvalidArguments",
+ "Invalid arguments in method call");
+ return;
+ }
+
+ g_dbus_emit_property_changed(dbus_conn, device->path,
+ DEVICE_INTERFACE, "PreferredBearer");
+
+ g_dbus_pending_property_success(id);
+}
+
+static gboolean
+dev_property_prefer_bearer_exists(const GDBusPropertyTable *property,
+ void *data)
+{
+ struct btd_device *device = data;
+
+ /* Check if both BR/EDR and LE bearer are connected/bonded */
+ if ((device->bredr_state.connected || device->bredr_state.bonded) &&
+ device->le_state.connected || device->le_state.bonded)
+ return TRUE;
+
+ /* Check if both BR/EDR and LE are connectable */
+ return device->bredr_state.connectable && device->le_state.connectable;
+}
+
static const GDBusPropertyTable device_properties[] = {
{ "Address", "s", dev_property_get_address },
{ "AddressType", "s", property_get_address_type },
@@ -3378,6 +3463,10 @@ static const GDBusPropertyTable device_properties[] = {
dev_property_wake_allowed_exist },
{ "Sets", "a{oa{sv}}", dev_property_get_set, NULL,
dev_property_set_exists },
+ { "PreferredBearer", "s", dev_property_get_prefer_bearer,
+ dev_property_set_prefer_bearer,
+ dev_property_prefer_bearer_exists,
+ G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
{ }
};
--
2.48.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH BlueZ v2 3/3] client: Add support get/set PreferredBearer
2025-02-25 22:00 [PATCH BlueZ v2 1/3] org.bluez.Device: Introduced PreferredBearer Luiz Augusto von Dentz
2025-02-25 22:00 ` [PATCH BlueZ v2 2/3] device: Add implementation of PreferredBearer Luiz Augusto von Dentz
@ 2025-02-25 22:00 ` Luiz Augusto von Dentz
2025-02-25 22:10 ` Luiz Augusto von Dentz
2025-02-25 23:12 ` [BlueZ,v2,1/3] org.bluez.Device: Introduced PreferredBearer bluez.test.bot
2 siblings, 1 reply; 9+ messages in thread
From: Luiz Augusto von Dentz @ 2025-02-25 22:00 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds support for PreferredBearer which is printed with the likes of
info command:
bluetoothctl> info <addr>
...
PreferredBearer: last-seen
It also introduces a new command to get/set the PreferredBearer:
[bluetoothctl]> bearer --help
Get/Set preferred bearer
Usage:
bearer <dev> [last-seen/bredr/le]
[bluetoothctl]> bearer <addr>
PreferredBearer: last-seen
[bluetoothctl]> bearer <addr> le
bluetoothd: @ MGMT Command: Add Device (0x0033) plen 8
LE Address: <addr>
Action: Auto-connect remote device (0x02)
[CHG] Device <addr> PreferredBearer: le
Changing le succeeded
[bluetoothctl]> bearer <addr>
PreferredBearer: le
[bluetoothctl]> bearer <addr> bredr
bluetoothd: @ MGMT Command: Remove Device (0x0034) plen 7
LE Address: <addr>
[CHG] Device <addr> PreferredBearer: bredr
Changing bredr succeeded
---
client/main.c | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/client/main.c b/client/main.c
index feb21a1163d2..76c9bc329c96 100644
--- a/client/main.c
+++ b/client/main.c
@@ -1714,6 +1714,7 @@ static void cmd_info(int argc, char *argv[])
print_property(proxy, "AdvertisingFlags");
print_property(proxy, "AdvertisingData");
print_property(proxy, "Sets");
+ print_property(proxy, "PreferredBearer");
battery_proxy = find_proxies_by_path(battery_proxies,
g_dbus_proxy_get_path(proxy));
@@ -2086,6 +2087,30 @@ static void cmd_wake(int argc, char *argv[])
return bt_shell_noninteractive_quit(EXIT_FAILURE);
}
+static void cmd_bearer(int argc, char *argv[])
+{
+ GDBusProxy *proxy;
+ char *str;
+
+ proxy = find_device(argc, argv);
+ if (!proxy)
+ return bt_shell_noninteractive_quit(EXIT_FAILURE);
+
+ if (argc <= 2) {
+ print_property(proxy, "PreferredBearer");
+ return;
+ }
+
+ str = strdup(argv[2]);
+
+ if (g_dbus_proxy_set_property_basic(proxy, "PreferredBearer",
+ DBUS_TYPE_STRING, &str,
+ generic_callback, str, free))
+ return;
+
+ return bt_shell_noninteractive_quit(EXIT_FAILURE);
+}
+
static void cmd_list_attributes(int argc, char *argv[])
{
GDBusProxy *proxy;
@@ -3247,6 +3272,8 @@ static const struct bt_shell_menu main_menu = {
dev_generator },
{ "wake", "[dev] [on/off]", cmd_wake, "Get/Set wake support",
dev_generator },
+ { "bearer", "<dev> [last-seen/bredr/le]", cmd_bearer,
+ "Get/Set preferred bearer", dev_generator },
{ } },
};
--
2.48.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH BlueZ v2 3/3] client: Add support get/set PreferredBearer
2025-02-25 22:00 ` [PATCH BlueZ v2 3/3] client: Add support get/set PreferredBearer Luiz Augusto von Dentz
@ 2025-02-25 22:10 ` Luiz Augusto von Dentz
2025-02-25 22:12 ` Luiz Augusto von Dentz
0 siblings, 1 reply; 9+ messages in thread
From: Luiz Augusto von Dentz @ 2025-02-25 22:10 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Pauli Virtanen, Bastien Nocera
Hi Pauli, Bastien,
On Tue, Feb 25, 2025 at 5:01 PM Luiz Augusto von Dentz
<luiz.dentz@gmail.com> wrote:
>
> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
>
> This adds support for PreferredBearer which is printed with the likes of
> info command:
>
> bluetoothctl> info <addr>
> ...
> PreferredBearer: last-seen
>
> It also introduces a new command to get/set the PreferredBearer:
>
> [bluetoothctl]> bearer --help
> Get/Set preferred bearer
> Usage:
> bearer <dev> [last-seen/bredr/le]
>
> [bluetoothctl]> bearer <addr>
> PreferredBearer: last-seen
> [bluetoothctl]> bearer <addr> le
> bluetoothd: @ MGMT Command: Add Device (0x0033) plen 8
> LE Address: <addr>
> Action: Auto-connect remote device (0x02)
> [CHG] Device <addr> PreferredBearer: le
> Changing le succeeded
> [bluetoothctl]> bearer <addr>
> PreferredBearer: le
> [bluetoothctl]> bearer <addr> bredr
> bluetoothd: @ MGMT Command: Remove Device (0x0034) plen 7
> LE Address: <addr>
> [CHG] Device <addr> PreferredBearer: bredr
> Changing bredr succeeded
> ---
> client/main.c | 27 +++++++++++++++++++++++++++
> 1 file changed, 27 insertions(+)
>
> diff --git a/client/main.c b/client/main.c
> index feb21a1163d2..76c9bc329c96 100644
> --- a/client/main.c
> +++ b/client/main.c
> @@ -1714,6 +1714,7 @@ static void cmd_info(int argc, char *argv[])
> print_property(proxy, "AdvertisingFlags");
> print_property(proxy, "AdvertisingData");
> print_property(proxy, "Sets");
> + print_property(proxy, "PreferredBearer");
>
> battery_proxy = find_proxies_by_path(battery_proxies,
> g_dbus_proxy_get_path(proxy));
> @@ -2086,6 +2087,30 @@ static void cmd_wake(int argc, char *argv[])
> return bt_shell_noninteractive_quit(EXIT_FAILURE);
> }
>
> +static void cmd_bearer(int argc, char *argv[])
> +{
> + GDBusProxy *proxy;
> + char *str;
> +
> + proxy = find_device(argc, argv);
> + if (!proxy)
> + return bt_shell_noninteractive_quit(EXIT_FAILURE);
> +
> + if (argc <= 2) {
> + print_property(proxy, "PreferredBearer");
> + return;
> + }
> +
> + str = strdup(argv[2]);
> +
> + if (g_dbus_proxy_set_property_basic(proxy, "PreferredBearer",
> + DBUS_TYPE_STRING, &str,
> + generic_callback, str, free))
> + return;
> +
> + return bt_shell_noninteractive_quit(EXIT_FAILURE);
> +}
> +
> static void cmd_list_attributes(int argc, char *argv[])
> {
> GDBusProxy *proxy;
> @@ -3247,6 +3272,8 @@ static const struct bt_shell_menu main_menu = {
> dev_generator },
> { "wake", "[dev] [on/off]", cmd_wake, "Get/Set wake support",
> dev_generator },
> + { "bearer", "<dev> [last-seen/bredr/le]", cmd_bearer,
> + "Get/Set preferred bearer", dev_generator },
> { } },
> };
>
> --
> 2.48.1
So I went ahead and implemented the idea of having PreferredBearer,
this works great when setting bredr it really stops from connecting to
LE, the said the other way around when setting to le seems to confuse
some headsets like EarFun and it ends up connecting both bearers:
[EarFun Air Pro 3]> transport.show
Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0/fd1
UUID: Sink PAC (00002bc9-0000-1000-8000-00805f9b34fb)
Codec: 0x06 (6)
Configuration.#0: len 0x02 type 0x01
Configuration.Sampling Frequency: 16 Khz (0x03)
Configuration.#1: len 0x02 type 0x02
Configuration.Frame Duration: 7.5 ms (0x00)
Configuration.#2: len 0x05 type 0x03
Configuration.Location: 0x00000001
Configuration.Location: Front Left (0x00000001)
Configuration.#3: len 0x03 type 0x04
Configuration.Frame Length: 30 (0x001e)
Configuration.#4: len 0x02 type 0x05
Configuration.Frame Blocks per SDU: 1 (0x01)
Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
State: idle
Volume: 0x00c8 (200)
Endpoint: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0
QoS.CIG: 0x00 (0)
QoS.CIS: 0x00 (0)
QoS.Framing: 0x00 (0)
QoS.PresentationDelay: 0x00009c40 (40000)
QoS.Interval: 0x00001d4c (7500)
QoS.Latency: 0x0008 (8)
QoS.SDU: 0x001e (30)
QoS.PHY: 0x02 (2)
QoS.Retransmissions: 0x02 (2)
Location: 0x00000003 (3)
Links: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0/fd3
Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0/fd2
UUID: Sink PAC (00002bc9-0000-1000-8000-00805f9b34fb)
Codec: 0x06 (6)
Configuration.#0: len 0x02 type 0x01
Configuration.Sampling Frequency: 16 Khz (0x03)
Configuration.#1: len 0x02 type 0x02
Configuration.Frame Duration: 7.5 ms (0x00)
Configuration.#2: len 0x05 type 0x03
Configuration.Location: 0x00000002
Configuration.Location: Front Right (0x00000002)
Configuration.#3: len 0x03 type 0x04
Configuration.Frame Length: 30 (0x001e)
Configuration.#4: len 0x02 type 0x05
Configuration.Frame Blocks per SDU: 1 (0x01)
Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
State: idle
Volume: 0x00c8 (200)
Endpoint: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0
QoS.CIG: 0x00 (0)
QoS.CIS: 0x01 (1)
QoS.Framing: 0x00 (0)
QoS.PresentationDelay: 0x00009c40 (40000)
QoS.Interval: 0x00001d4c (7500)
QoS.Latency: 0x0008 (8)
QoS.SDU: 0x001e (30)
QoS.PHY: 0x02 (2)
QoS.Retransmissions: 0x02 (2)
Location: 0x00000003 (3)
Links: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0/fd4
Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0/fd3
UUID: Source PAC (00002bcb-0000-1000-8000-00805f9b34fb)
Codec: 0x06 (6)
Configuration.#0: len 0x02 type 0x01
Configuration.Sampling Frequency: 48 Khz (0x08)
Configuration.#1: len 0x02 type 0x02
Configuration.Frame Duration: 7.5 ms (0x00)
Configuration.#2: len 0x05 type 0x03
Configuration.Location: 0x00000001
Configuration.Location: Front Left (0x00000001)
Configuration.#3: len 0x03 type 0x04
Configuration.Frame Length: 90 (0x005a)
Configuration.#4: len 0x02 type 0x05
Configuration.Frame Blocks per SDU: 1 (0x01)
Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
State: idle
Volume: 0x00c8 (200)
Endpoint: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0
QoS.CIG: 0x00 (0)
QoS.CIS: 0x00 (0)
QoS.Framing: 0x00 (0)
QoS.PresentationDelay: 0x00009c40 (40000)
QoS.Interval: 0x00001d4c (7500)
QoS.Latency: 0x000f (15)
QoS.SDU: 0x005a (90)
QoS.PHY: 0x02 (2)
QoS.Retransmissions: 0x05 (5)
Location: 0x00000003 (3)
Links: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0/fd1
Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0/fd4
UUID: Source PAC (00002bcb-0000-1000-8000-00805f9b34fb)
Codec: 0x06 (6)
Configuration.#0: len 0x02 type 0x01
Configuration.Sampling Frequency: 48 Khz (0x08)
Configuration.#1: len 0x02 type 0x02
Configuration.Frame Duration: 7.5 ms (0x00)
Configuration.#2: len 0x05 type 0x03
Configuration.Location: 0x00000002
Configuration.Location: Front Right (0x00000002)
Configuration.#3: len 0x03 type 0x04
Configuration.Frame Length: 90 (0x005a)
Configuration.#4: len 0x02 type 0x05
Configuration.Frame Blocks per SDU: 1 (0x01)
Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
State: idle
Volume: 0x00c8 (200)
Endpoint: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0
QoS.CIG: 0x00 (0)
QoS.CIS: 0x01 (1)
QoS.Framing: 0x00 (0)
QoS.PresentationDelay: 0x00009c40 (40000)
QoS.Interval: 0x00001d4c (7500)
QoS.Latency: 0x000f (15)
QoS.SDU: 0x005a (90)
QoS.PHY: 0x02 (2)
QoS.Retransmissions: 0x05 (5)
Location: 0x00000003 (3)
Links: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0/fd2
Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/fd5
UUID: Audio Source (0000110a-0000-1000-8000-00805f9b34fb)
Codec: 0x02 (2)
Media Codec: MPEG24
Object Types: MPEG-4 AAC LC
Frequencies: 48kHz
Channels: 2
Bitrate: 320000
VBR: Yes
Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
State: idle
Delay: 0x0960 (2400)
Volume: 0x0064 (100)
We might need to check if other devices have such behavior, perhaps
the headset is saving the last bearer it connected to so it tries to
restore it or something like that, this may messes up with that, in
the other hand the bearer can be selected even before first connecting
so we may decide to default to bredr instead of last seen for this
type of devices (Classic+LE Audio).
Anyway there are some pieces left that I still need to implement like
save the bearer in the storage so when the daemon is reloaded, or in
case of reboot, it restores the last mode properly.
--
Luiz Augusto von Dentz
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH BlueZ v2 3/3] client: Add support get/set PreferredBearer
2025-02-25 22:10 ` Luiz Augusto von Dentz
@ 2025-02-25 22:12 ` Luiz Augusto von Dentz
2025-03-01 16:17 ` Pauli Virtanen
0 siblings, 1 reply; 9+ messages in thread
From: Luiz Augusto von Dentz @ 2025-02-25 22:12 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Pauli Virtanen, Bastien Nocera
Hi Pauli,
On Tue, Feb 25, 2025 at 5:10 PM Luiz Augusto von Dentz
<luiz.dentz@gmail.com> wrote:
>
> Hi Pauli, Bastien,
>
> On Tue, Feb 25, 2025 at 5:01 PM Luiz Augusto von Dentz
> <luiz.dentz@gmail.com> wrote:
> >
> > From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
> >
> > This adds support for PreferredBearer which is printed with the likes of
> > info command:
> >
> > bluetoothctl> info <addr>
> > ...
> > PreferredBearer: last-seen
> >
> > It also introduces a new command to get/set the PreferredBearer:
> >
> > [bluetoothctl]> bearer --help
> > Get/Set preferred bearer
> > Usage:
> > bearer <dev> [last-seen/bredr/le]
> >
> > [bluetoothctl]> bearer <addr>
> > PreferredBearer: last-seen
> > [bluetoothctl]> bearer <addr> le
> > bluetoothd: @ MGMT Command: Add Device (0x0033) plen 8
> > LE Address: <addr>
> > Action: Auto-connect remote device (0x02)
> > [CHG] Device <addr> PreferredBearer: le
> > Changing le succeeded
> > [bluetoothctl]> bearer <addr>
> > PreferredBearer: le
> > [bluetoothctl]> bearer <addr> bredr
> > bluetoothd: @ MGMT Command: Remove Device (0x0034) plen 7
> > LE Address: <addr>
> > [CHG] Device <addr> PreferredBearer: bredr
> > Changing bredr succeeded
> > ---
> > client/main.c | 27 +++++++++++++++++++++++++++
> > 1 file changed, 27 insertions(+)
> >
> > diff --git a/client/main.c b/client/main.c
> > index feb21a1163d2..76c9bc329c96 100644
> > --- a/client/main.c
> > +++ b/client/main.c
> > @@ -1714,6 +1714,7 @@ static void cmd_info(int argc, char *argv[])
> > print_property(proxy, "AdvertisingFlags");
> > print_property(proxy, "AdvertisingData");
> > print_property(proxy, "Sets");
> > + print_property(proxy, "PreferredBearer");
> >
> > battery_proxy = find_proxies_by_path(battery_proxies,
> > g_dbus_proxy_get_path(proxy));
> > @@ -2086,6 +2087,30 @@ static void cmd_wake(int argc, char *argv[])
> > return bt_shell_noninteractive_quit(EXIT_FAILURE);
> > }
> >
> > +static void cmd_bearer(int argc, char *argv[])
> > +{
> > + GDBusProxy *proxy;
> > + char *str;
> > +
> > + proxy = find_device(argc, argv);
> > + if (!proxy)
> > + return bt_shell_noninteractive_quit(EXIT_FAILURE);
> > +
> > + if (argc <= 2) {
> > + print_property(proxy, "PreferredBearer");
> > + return;
> > + }
> > +
> > + str = strdup(argv[2]);
> > +
> > + if (g_dbus_proxy_set_property_basic(proxy, "PreferredBearer",
> > + DBUS_TYPE_STRING, &str,
> > + generic_callback, str, free))
> > + return;
> > +
> > + return bt_shell_noninteractive_quit(EXIT_FAILURE);
> > +}
> > +
> > static void cmd_list_attributes(int argc, char *argv[])
> > {
> > GDBusProxy *proxy;
> > @@ -3247,6 +3272,8 @@ static const struct bt_shell_menu main_menu = {
> > dev_generator },
> > { "wake", "[dev] [on/off]", cmd_wake, "Get/Set wake support",
> > dev_generator },
> > + { "bearer", "<dev> [last-seen/bredr/le]", cmd_bearer,
> > + "Get/Set preferred bearer", dev_generator },
> > { } },
> > };
> >
> > --
> > 2.48.1
>
> So I went ahead and implemented the idea of having PreferredBearer,
> this works great when setting bredr it really stops from connecting to
> LE, the said the other way around when setting to le seems to confuse
> some headsets like EarFun and it ends up connecting both bearers:
>
> [EarFun Air Pro 3]> transport.show
> Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0/fd1
> UUID: Sink PAC (00002bc9-0000-1000-8000-00805f9b34fb)
> Codec: 0x06 (6)
> Configuration.#0: len 0x02 type 0x01
> Configuration.Sampling Frequency: 16 Khz (0x03)
> Configuration.#1: len 0x02 type 0x02
> Configuration.Frame Duration: 7.5 ms (0x00)
> Configuration.#2: len 0x05 type 0x03
> Configuration.Location: 0x00000001
> Configuration.Location: Front Left (0x00000001)
> Configuration.#3: len 0x03 type 0x04
> Configuration.Frame Length: 30 (0x001e)
> Configuration.#4: len 0x02 type 0x05
> Configuration.Frame Blocks per SDU: 1 (0x01)
> Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
> State: idle
> Volume: 0x00c8 (200)
> Endpoint: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0
> QoS.CIG: 0x00 (0)
> QoS.CIS: 0x00 (0)
> QoS.Framing: 0x00 (0)
> QoS.PresentationDelay: 0x00009c40 (40000)
> QoS.Interval: 0x00001d4c (7500)
> QoS.Latency: 0x0008 (8)
> QoS.SDU: 0x001e (30)
> QoS.PHY: 0x02 (2)
> QoS.Retransmissions: 0x02 (2)
> Location: 0x00000003 (3)
> Links: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0/fd3
> Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0/fd2
> UUID: Sink PAC (00002bc9-0000-1000-8000-00805f9b34fb)
> Codec: 0x06 (6)
> Configuration.#0: len 0x02 type 0x01
> Configuration.Sampling Frequency: 16 Khz (0x03)
> Configuration.#1: len 0x02 type 0x02
> Configuration.Frame Duration: 7.5 ms (0x00)
> Configuration.#2: len 0x05 type 0x03
> Configuration.Location: 0x00000002
> Configuration.Location: Front Right (0x00000002)
> Configuration.#3: len 0x03 type 0x04
> Configuration.Frame Length: 30 (0x001e)
> Configuration.#4: len 0x02 type 0x05
> Configuration.Frame Blocks per SDU: 1 (0x01)
> Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
> State: idle
> Volume: 0x00c8 (200)
> Endpoint: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0
> QoS.CIG: 0x00 (0)
> QoS.CIS: 0x01 (1)
> QoS.Framing: 0x00 (0)
> QoS.PresentationDelay: 0x00009c40 (40000)
> QoS.Interval: 0x00001d4c (7500)
> QoS.Latency: 0x0008 (8)
> QoS.SDU: 0x001e (30)
> QoS.PHY: 0x02 (2)
> QoS.Retransmissions: 0x02 (2)
> Location: 0x00000003 (3)
> Links: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0/fd4
> Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0/fd3
> UUID: Source PAC (00002bcb-0000-1000-8000-00805f9b34fb)
> Codec: 0x06 (6)
> Configuration.#0: len 0x02 type 0x01
> Configuration.Sampling Frequency: 48 Khz (0x08)
> Configuration.#1: len 0x02 type 0x02
> Configuration.Frame Duration: 7.5 ms (0x00)
> Configuration.#2: len 0x05 type 0x03
> Configuration.Location: 0x00000001
> Configuration.Location: Front Left (0x00000001)
> Configuration.#3: len 0x03 type 0x04
> Configuration.Frame Length: 90 (0x005a)
> Configuration.#4: len 0x02 type 0x05
> Configuration.Frame Blocks per SDU: 1 (0x01)
> Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
> State: idle
> Volume: 0x00c8 (200)
> Endpoint: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0
> QoS.CIG: 0x00 (0)
> QoS.CIS: 0x00 (0)
> QoS.Framing: 0x00 (0)
> QoS.PresentationDelay: 0x00009c40 (40000)
> QoS.Interval: 0x00001d4c (7500)
> QoS.Latency: 0x000f (15)
> QoS.SDU: 0x005a (90)
> QoS.PHY: 0x02 (2)
> QoS.Retransmissions: 0x05 (5)
> Location: 0x00000003 (3)
> Links: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0/fd1
> Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0/fd4
> UUID: Source PAC (00002bcb-0000-1000-8000-00805f9b34fb)
> Codec: 0x06 (6)
> Configuration.#0: len 0x02 type 0x01
> Configuration.Sampling Frequency: 48 Khz (0x08)
> Configuration.#1: len 0x02 type 0x02
> Configuration.Frame Duration: 7.5 ms (0x00)
> Configuration.#2: len 0x05 type 0x03
> Configuration.Location: 0x00000002
> Configuration.Location: Front Right (0x00000002)
> Configuration.#3: len 0x03 type 0x04
> Configuration.Frame Length: 90 (0x005a)
> Configuration.#4: len 0x02 type 0x05
> Configuration.Frame Blocks per SDU: 1 (0x01)
> Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
> State: idle
> Volume: 0x00c8 (200)
> Endpoint: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0
> QoS.CIG: 0x00 (0)
> QoS.CIS: 0x01 (1)
> QoS.Framing: 0x00 (0)
> QoS.PresentationDelay: 0x00009c40 (40000)
> QoS.Interval: 0x00001d4c (7500)
> QoS.Latency: 0x000f (15)
> QoS.SDU: 0x005a (90)
> QoS.PHY: 0x02 (2)
> QoS.Retransmissions: 0x05 (5)
> Location: 0x00000003 (3)
> Links: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0/fd2
> Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/fd5
> UUID: Audio Source (0000110a-0000-1000-8000-00805f9b34fb)
> Codec: 0x02 (2)
> Media Codec: MPEG24
> Object Types: MPEG-4 AAC LC
> Frequencies: 48kHz
> Channels: 2
> Bitrate: 320000
> VBR: Yes
> Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
> State: idle
> Delay: 0x0960 (2400)
> Volume: 0x0064 (100)
Forgot to mention, but with the above transports it seems to confuse
the gnome audio output selection, it doesn't seem to be able to mix
A2DP and BAP transports for some reason, so when I select the device
it enables BAP but A2DP is not shown as an option.
> We might need to check if other devices have such behavior, perhaps
> the headset is saving the last bearer it connected to so it tries to
> restore it or something like that, this may messes up with that, in
> the other hand the bearer can be selected even before first connecting
> so we may decide to default to bredr instead of last seen for this
> type of devices (Classic+LE Audio).
>
> Anyway there are some pieces left that I still need to implement like
> save the bearer in the storage so when the daemon is reloaded, or in
> case of reboot, it restores the last mode properly.
>
> --
> Luiz Augusto von Dentz
--
Luiz Augusto von Dentz
^ permalink raw reply [flat|nested] 9+ messages in thread
* RE: [BlueZ,v2,1/3] org.bluez.Device: Introduced PreferredBearer
2025-02-25 22:00 [PATCH BlueZ v2 1/3] org.bluez.Device: Introduced PreferredBearer Luiz Augusto von Dentz
2025-02-25 22:00 ` [PATCH BlueZ v2 2/3] device: Add implementation of PreferredBearer Luiz Augusto von Dentz
2025-02-25 22:00 ` [PATCH BlueZ v2 3/3] client: Add support get/set PreferredBearer Luiz Augusto von Dentz
@ 2025-02-25 23:12 ` bluez.test.bot
2 siblings, 0 replies; 9+ messages in thread
From: bluez.test.bot @ 2025-02-25 23:12 UTC (permalink / raw)
To: linux-bluetooth, luiz.dentz
[-- Attachment #1: Type: text/plain, Size: 10059 bytes --]
This is automated email and please do not reply to this email!
Dear submitter,
Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=937740
---Test result---
Test Summary:
CheckPatch PENDING 0.38 seconds
GitLint PENDING 0.31 seconds
BuildEll PASS 20.45 seconds
BluezMake FAIL 86.37 seconds
MakeCheck FAIL 1944.05 seconds
MakeDistcheck PASS 159.44 seconds
CheckValgrind FAIL 62.84 seconds
CheckSmatch FAIL 152.00 seconds
bluezmakeextell FAIL 69.03 seconds
IncrementalBuild PENDING 0.35 seconds
ScanBuild PASS 872.45 seconds
Details
##############################
Test: CheckPatch - PENDING
Desc: Run checkpatch.pl script
Output:
##############################
Test: GitLint - PENDING
Desc: Run gitlint
Output:
##############################
Test: BluezMake - FAIL
Desc: Build BlueZ
Output:
tools/mgmt-tester.c: In function ‘main’:
tools/mgmt-tester.c:12893:5: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without
12893 | int main(int argc, char *argv[])
| ^~~~
src/device.c: In function ‘dev_property_prefer_bearer_exists’:
src/device.c:3420:68: error: suggest parentheses around ‘&&’ within ‘||’ [-Werror=parentheses]
3420 | if ((device->bredr_state.connected || device->bredr_state.bonded) &&
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
3421 | device->le_state.connected || device->le_state.bonded)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [Makefile:11137: src/bluetoothd-device.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:4682: all] Error 2
##############################
Test: MakeCheck - FAIL
Desc: Run Bluez Make Check
Output:
unit/test-avdtp.c: In function ‘main’:
unit/test-avdtp.c:766:5: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without
766 | int main(int argc, char *argv[])
| ^~~~
unit/test-avrcp.c: In function ‘main’:
unit/test-avrcp.c:989:5: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without
989 | int main(int argc, char *argv[])
| ^~~~
src/device.c: In function ‘dev_property_prefer_bearer_exists’:
src/device.c:3420:68: error: suggest parentheses around ‘&&’ within ‘||’ [-Werror=parentheses]
3420 | if ((device->bredr_state.connected || device->bredr_state.bonded) &&
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
3421 | device->le_state.connected || device->le_state.bonded)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [Makefile:11137: src/bluetoothd-device.o] Error 1
make: *** [Makefile:12320: check] Error 2
##############################
Test: CheckValgrind - FAIL
Desc: Run Bluez Make Check with Valgrind
Output:
tools/mgmt-tester.c: In function ‘main’:
tools/mgmt-tester.c:12893:5: note: variable tracking size limit exceeded with ‘-fvar-tracking-assignments’, retrying without
12893 | int main(int argc, char *argv[])
| ^~~~
src/device.c: In function ‘dev_property_prefer_bearer_exists’:
src/device.c:3420:68: error: suggest parentheses around ‘&&’ within ‘||’ [-Werror=parentheses]
3420 | if ((device->bredr_state.connected || device->bredr_state.bonded) &&
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
3421 | device->le_state.connected || device->le_state.bonded)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [Makefile:11137: src/bluetoothd-device.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:12320: check] Error 2
##############################
Test: CheckSmatch - FAIL
Desc: Run smatch tool with source
Output:
src/shared/crypto.c:271:21: warning: Variable length array is used.
src/shared/crypto.c:272:23: warning: Variable length array is used.
src/shared/gatt-helpers.c:768:31: warning: Variable length array is used.
src/shared/gatt-helpers.c:830:31: warning: Variable length array is used.
src/shared/gatt-helpers.c:1323:31: warning: Variable length array is used.
src/shared/gatt-helpers.c:1354:23: warning: Variable length array is used.
src/shared/gatt-server.c:278:25: warning: Variable length array is used.
src/shared/gatt-server.c:618:25: warning: Variable length array is used.
src/shared/gatt-server.c:716:25: warning: Variable length array is used.
src/shared/bap.c:296:25: warning: array of flexible structures
src/shared/bap.c: note: in included file:
./src/shared/ascs.h:88:25: warning: array of flexible structures
src/shared/shell.c: note: in included file (through /usr/include/readline/readline.h):
/usr/include/readline/rltypedefs.h:35:23: warning: non-ANSI function declaration of function 'Function'
/usr/include/readline/rltypedefs.h:36:25: warning: non-ANSI function declaration of function 'VFunction'
/usr/include/readline/rltypedefs.h:37:27: warning: non-ANSI function declaration of function 'CPFunction'
/usr/include/readline/rltypedefs.h:38:29: warning: non-ANSI function declaration of function 'CPPFunction'
src/shared/crypto.c:271:21: warning: Variable length array is used.
src/shared/crypto.c:272:23: warning: Variable length array is used.
src/shared/gatt-helpers.c:768:31: warning: Variable length array is used.
src/shared/gatt-helpers.c:830:31: warning: Variable length array is used.
src/shared/gatt-helpers.c:1323:31: warning: Variable length array is used.
src/shared/gatt-helpers.c:1354:23: warning: Variable length array is used.
src/shared/gatt-server.c:278:25: warning: Variable length array is used.
src/shared/gatt-server.c:618:25: warning: Variable length array is used.
src/shared/gatt-server.c:716:25: warning: Variable length array is used.
src/shared/bap.c:296:25: warning: array of flexible structures
src/shared/bap.c: note: in included file:
./src/shared/ascs.h:88:25: warning: array of flexible structures
src/shared/shell.c: note: in included file (through /usr/include/readline/readline.h):
/usr/include/readline/rltypedefs.h:35:23: warning: non-ANSI function declaration of function 'Function'
/usr/include/readline/rltypedefs.h:36:25: warning: non-ANSI function declaration of function 'VFunction'
/usr/include/readline/rltypedefs.h:37:27: warning: non-ANSI function declaration of function 'CPFunction'
/usr/include/readline/rltypedefs.h:38:29: warning: non-ANSI function declaration of function 'CPPFunction'
tools/mesh-cfgtest.c:1453:17: warning: unknown escape sequence: '\%'
tools/sco-tester.c: note: in included file:
./lib/bluetooth.h:232:15: warning: array of flexible structures
./lib/bluetooth.h:237:31: warning: array of flexible structures
tools/bneptest.c:634:39: warning: unknown escape sequence: '\%'
tools/seq2bseq.c:57:26: warning: Variable length array is used.
tools/obex-client-tool.c: note: in included file (through /usr/include/readline/readline.h):
/usr/include/readline/rltypedefs.h:35:23: warning: non-ANSI function declaration of function 'Function'
/usr/include/readline/rltypedefs.h:36:25: warning: non-ANSI function declaration of function 'VFunction'
/usr/include/readline/rltypedefs.h:37:27: warning: non-ANSI function declaration of function 'CPFunction'
/usr/include/readline/rltypedefs.h:38:29: warning: non-ANSI function declaration of function 'CPPFunction'
android/avctp.c:505:34: warning: Variable length array is used.
android/avctp.c:556:34: warning: Variable length array is used.
unit/test-avrcp.c:373:26: warning: Variable length array is used.
unit/test-avrcp.c:398:26: warning: Variable length array is used.
unit/test-avrcp.c:414:24: warning: Variable length array is used.
android/avrcp-lib.c:1085:34: warning: Variable length array is used.
android/avrcp-lib.c:1583:34: warning: Variable length array is used.
android/avrcp-lib.c:1612:34: warning: Variable length array is used.
android/avrcp-lib.c:1638:34: warning: Variable length array is used.
src/device.c: In function ‘dev_property_prefer_bearer_exists’:
src/device.c:3420:68: error: suggest parentheses around ‘&&’ within ‘||’ [-Werror=parentheses]
3420 | if ((device->bredr_state.connected || device->bredr_state.bonded) &&
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
3421 | device->le_state.connected || device->le_state.bonded)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [Makefile:11137: src/bluetoothd-device.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:4682: all] Error 2
##############################
Test: bluezmakeextell - FAIL
Desc: Build Bluez with External ELL
Output:
src/device.c: In function ‘dev_property_prefer_bearer_exists’:
src/device.c:3420:68: error: suggest parentheses around ‘&&’ within ‘||’ [-Werror=parentheses]
3420 | if ((device->bredr_state.connected || device->bredr_state.bonded) &&
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
3421 | device->le_state.connected || device->le_state.bonded)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [Makefile:11137: src/bluetoothd-device.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:4682: all] Error 2
##############################
Test: IncrementalBuild - PENDING
Desc: Incremental build with the patches in the series
Output:
---
Regards,
Linux Bluetooth
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH BlueZ v2 3/3] client: Add support get/set PreferredBearer
2025-02-25 22:12 ` Luiz Augusto von Dentz
@ 2025-03-01 16:17 ` Pauli Virtanen
2025-03-06 16:41 ` Luiz Augusto von Dentz
0 siblings, 1 reply; 9+ messages in thread
From: Pauli Virtanen @ 2025-03-01 16:17 UTC (permalink / raw)
To: Luiz Augusto von Dentz, linux-bluetooth; +Cc: Bastien Nocera
ti, 2025-02-25 kello 17:12 -0500, Luiz Augusto von Dentz kirjoitti:
> Hi Pauli,
>
> On Tue, Feb 25, 2025 at 5:10 PM Luiz Augusto von Dentz
> <luiz.dentz@gmail.com> wrote:
> >
> > Hi Pauli, Bastien,
> >
> > On Tue, Feb 25, 2025 at 5:01 PM Luiz Augusto von Dentz
> > <luiz.dentz@gmail.com> wrote:
> > >
> > > From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
> > >
> > > This adds support for PreferredBearer which is printed with the likes of
> > > info command:
> > >
> > > bluetoothctl> info <addr>
> > > ...
> > > PreferredBearer: last-seen
> > >
> > > It also introduces a new command to get/set the PreferredBearer:
> > >
> > > [bluetoothctl]> bearer --help
> > > Get/Set preferred bearer
> > > Usage:
> > > bearer <dev> [last-seen/bredr/le]
> > >
> > > [bluetoothctl]> bearer <addr>
> > > PreferredBearer: last-seen
> > > [bluetoothctl]> bearer <addr> le
> > > bluetoothd: @ MGMT Command: Add Device (0x0033) plen 8
> > > LE Address: <addr>
> > > Action: Auto-connect remote device (0x02)
> > > [CHG] Device <addr> PreferredBearer: le
> > > Changing le succeeded
> > > [bluetoothctl]> bearer <addr>
> > > PreferredBearer: le
> > > [bluetoothctl]> bearer <addr> bredr
> > > bluetoothd: @ MGMT Command: Remove Device (0x0034) plen 7
> > > LE Address: <addr>
> > > [CHG] Device <addr> PreferredBearer: bredr
> > > Changing bredr succeeded
> > > ---
> > > client/main.c | 27 +++++++++++++++++++++++++++
> > > 1 file changed, 27 insertions(+)
> > >
> > > diff --git a/client/main.c b/client/main.c
> > > index feb21a1163d2..76c9bc329c96 100644
> > > --- a/client/main.c
> > > +++ b/client/main.c
> > > @@ -1714,6 +1714,7 @@ static void cmd_info(int argc, char *argv[])
> > > print_property(proxy, "AdvertisingFlags");
> > > print_property(proxy, "AdvertisingData");
> > > print_property(proxy, "Sets");
> > > + print_property(proxy, "PreferredBearer");
> > >
> > > battery_proxy = find_proxies_by_path(battery_proxies,
> > > g_dbus_proxy_get_path(proxy));
> > > @@ -2086,6 +2087,30 @@ static void cmd_wake(int argc, char *argv[])
> > > return bt_shell_noninteractive_quit(EXIT_FAILURE);
> > > }
> > >
> > > +static void cmd_bearer(int argc, char *argv[])
> > > +{
> > > + GDBusProxy *proxy;
> > > + char *str;
> > > +
> > > + proxy = find_device(argc, argv);
> > > + if (!proxy)
> > > + return bt_shell_noninteractive_quit(EXIT_FAILURE);
> > > +
> > > + if (argc <= 2) {
> > > + print_property(proxy, "PreferredBearer");
> > > + return;
> > > + }
> > > +
> > > + str = strdup(argv[2]);
> > > +
> > > + if (g_dbus_proxy_set_property_basic(proxy, "PreferredBearer",
> > > + DBUS_TYPE_STRING, &str,
> > > + generic_callback, str, free))
> > > + return;
> > > +
> > > + return bt_shell_noninteractive_quit(EXIT_FAILURE);
> > > +}
> > > +
> > > static void cmd_list_attributes(int argc, char *argv[])
> > > {
> > > GDBusProxy *proxy;
> > > @@ -3247,6 +3272,8 @@ static const struct bt_shell_menu main_menu = {
> > > dev_generator },
> > > { "wake", "[dev] [on/off]", cmd_wake, "Get/Set wake support",
> > > dev_generator },
> > > + { "bearer", "<dev> [last-seen/bredr/le]", cmd_bearer,
> > > + "Get/Set preferred bearer", dev_generator },
> > > { } },
> > > };
> > >
> > > --
> > > 2.48.1
> >
> > So I went ahead and implemented the idea of having PreferredBearer,
> > this works great when setting bredr it really stops from connecting to
> > LE, the said the other way around when setting to le seems to confuse
> > some headsets like EarFun and it ends up connecting both bearers:
> >
> > [EarFun Air Pro 3]> transport.show
> > Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0/fd1
> > UUID: Sink PAC (00002bc9-0000-1000-8000-00805f9b34fb)
> > Codec: 0x06 (6)
> > Configuration.#0: len 0x02 type 0x01
> > Configuration.Sampling Frequency: 16 Khz (0x03)
> > Configuration.#1: len 0x02 type 0x02
> > Configuration.Frame Duration: 7.5 ms (0x00)
> > Configuration.#2: len 0x05 type 0x03
> > Configuration.Location: 0x00000001
> > Configuration.Location: Front Left (0x00000001)
> > Configuration.#3: len 0x03 type 0x04
> > Configuration.Frame Length: 30 (0x001e)
> > Configuration.#4: len 0x02 type 0x05
> > Configuration.Frame Blocks per SDU: 1 (0x01)
> > Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
> > State: idle
> > Volume: 0x00c8 (200)
> > Endpoint: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0
> > QoS.CIG: 0x00 (0)
> > QoS.CIS: 0x00 (0)
> > QoS.Framing: 0x00 (0)
> > QoS.PresentationDelay: 0x00009c40 (40000)
> > QoS.Interval: 0x00001d4c (7500)
> > QoS.Latency: 0x0008 (8)
> > QoS.SDU: 0x001e (30)
> > QoS.PHY: 0x02 (2)
> > QoS.Retransmissions: 0x02 (2)
> > Location: 0x00000003 (3)
> > Links: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0/fd3
> > Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0/fd2
> > UUID: Sink PAC (00002bc9-0000-1000-8000-00805f9b34fb)
> > Codec: 0x06 (6)
> > Configuration.#0: len 0x02 type 0x01
> > Configuration.Sampling Frequency: 16 Khz (0x03)
> > Configuration.#1: len 0x02 type 0x02
> > Configuration.Frame Duration: 7.5 ms (0x00)
> > Configuration.#2: len 0x05 type 0x03
> > Configuration.Location: 0x00000002
> > Configuration.Location: Front Right (0x00000002)
> > Configuration.#3: len 0x03 type 0x04
> > Configuration.Frame Length: 30 (0x001e)
> > Configuration.#4: len 0x02 type 0x05
> > Configuration.Frame Blocks per SDU: 1 (0x01)
> > Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
> > State: idle
> > Volume: 0x00c8 (200)
> > Endpoint: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0
> > QoS.CIG: 0x00 (0)
> > QoS.CIS: 0x01 (1)
> > QoS.Framing: 0x00 (0)
> > QoS.PresentationDelay: 0x00009c40 (40000)
> > QoS.Interval: 0x00001d4c (7500)
> > QoS.Latency: 0x0008 (8)
> > QoS.SDU: 0x001e (30)
> > QoS.PHY: 0x02 (2)
> > QoS.Retransmissions: 0x02 (2)
> > Location: 0x00000003 (3)
> > Links: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0/fd4
> > Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0/fd3
> > UUID: Source PAC (00002bcb-0000-1000-8000-00805f9b34fb)
> > Codec: 0x06 (6)
> > Configuration.#0: len 0x02 type 0x01
> > Configuration.Sampling Frequency: 48 Khz (0x08)
> > Configuration.#1: len 0x02 type 0x02
> > Configuration.Frame Duration: 7.5 ms (0x00)
> > Configuration.#2: len 0x05 type 0x03
> > Configuration.Location: 0x00000001
> > Configuration.Location: Front Left (0x00000001)
> > Configuration.#3: len 0x03 type 0x04
> > Configuration.Frame Length: 90 (0x005a)
> > Configuration.#4: len 0x02 type 0x05
> > Configuration.Frame Blocks per SDU: 1 (0x01)
> > Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
> > State: idle
> > Volume: 0x00c8 (200)
> > Endpoint: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0
> > QoS.CIG: 0x00 (0)
> > QoS.CIS: 0x00 (0)
> > QoS.Framing: 0x00 (0)
> > QoS.PresentationDelay: 0x00009c40 (40000)
> > QoS.Interval: 0x00001d4c (7500)
> > QoS.Latency: 0x000f (15)
> > QoS.SDU: 0x005a (90)
> > QoS.PHY: 0x02 (2)
> > QoS.Retransmissions: 0x05 (5)
> > Location: 0x00000003 (3)
> > Links: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0/fd1
> > Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0/fd4
> > UUID: Source PAC (00002bcb-0000-1000-8000-00805f9b34fb)
> > Codec: 0x06 (6)
> > Configuration.#0: len 0x02 type 0x01
> > Configuration.Sampling Frequency: 48 Khz (0x08)
> > Configuration.#1: len 0x02 type 0x02
> > Configuration.Frame Duration: 7.5 ms (0x00)
> > Configuration.#2: len 0x05 type 0x03
> > Configuration.Location: 0x00000002
> > Configuration.Location: Front Right (0x00000002)
> > Configuration.#3: len 0x03 type 0x04
> > Configuration.Frame Length: 90 (0x005a)
> > Configuration.#4: len 0x02 type 0x05
> > Configuration.Frame Blocks per SDU: 1 (0x01)
> > Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
> > State: idle
> > Volume: 0x00c8 (200)
> > Endpoint: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0
> > QoS.CIG: 0x00 (0)
> > QoS.CIS: 0x01 (1)
> > QoS.Framing: 0x00 (0)
> > QoS.PresentationDelay: 0x00009c40 (40000)
> > QoS.Interval: 0x00001d4c (7500)
> > QoS.Latency: 0x000f (15)
> > QoS.SDU: 0x005a (90)
> > QoS.PHY: 0x02 (2)
> > QoS.Retransmissions: 0x05 (5)
> > Location: 0x00000003 (3)
> > Links: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0/fd2
> > Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/fd5
> > UUID: Audio Source (0000110a-0000-1000-8000-00805f9b34fb)
> > Codec: 0x02 (2)
> > Media Codec: MPEG24
> > Object Types: MPEG-4 AAC LC
> > Frequencies: 48kHz
> > Channels: 2
> > Bitrate: 320000
> > VBR: Yes
> > Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
> > State: idle
> > Delay: 0x0960 (2400)
> > Volume: 0x0064 (100)
>
> Forgot to mention, but with the above transports it seems to confuse
> the gnome audio output selection, it doesn't seem to be able to mix
> A2DP and BAP transports for some reason, so when I select the device
> it enables BAP but A2DP is not shown as an option.
I'll have to see if I can reproduce that on current PW master branch.
The visibility of profiles in theory should only cares about whether
the UUIDs appear in both device properties and transport.
--
Pauli Virtanen
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH BlueZ v2 3/3] client: Add support get/set PreferredBearer
2025-03-01 16:17 ` Pauli Virtanen
@ 2025-03-06 16:41 ` Luiz Augusto von Dentz
2025-03-06 17:38 ` Pauli Virtanen
0 siblings, 1 reply; 9+ messages in thread
From: Luiz Augusto von Dentz @ 2025-03-06 16:41 UTC (permalink / raw)
To: Pauli Virtanen; +Cc: linux-bluetooth, Bastien Nocera
Hi Pauli,
On Sat, Mar 1, 2025 at 11:17 AM Pauli Virtanen <pav@iki.fi> wrote:
>
> ti, 2025-02-25 kello 17:12 -0500, Luiz Augusto von Dentz kirjoitti:
> > Hi Pauli,
> >
> > On Tue, Feb 25, 2025 at 5:10 PM Luiz Augusto von Dentz
> > <luiz.dentz@gmail.com> wrote:
> > >
> > > Hi Pauli, Bastien,
> > >
> > > On Tue, Feb 25, 2025 at 5:01 PM Luiz Augusto von Dentz
> > > <luiz.dentz@gmail.com> wrote:
> > > >
> > > > From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
> > > >
> > > > This adds support for PreferredBearer which is printed with the likes of
> > > > info command:
> > > >
> > > > bluetoothctl> info <addr>
> > > > ...
> > > > PreferredBearer: last-seen
> > > >
> > > > It also introduces a new command to get/set the PreferredBearer:
> > > >
> > > > [bluetoothctl]> bearer --help
> > > > Get/Set preferred bearer
> > > > Usage:
> > > > bearer <dev> [last-seen/bredr/le]
> > > >
> > > > [bluetoothctl]> bearer <addr>
> > > > PreferredBearer: last-seen
> > > > [bluetoothctl]> bearer <addr> le
> > > > bluetoothd: @ MGMT Command: Add Device (0x0033) plen 8
> > > > LE Address: <addr>
> > > > Action: Auto-connect remote device (0x02)
> > > > [CHG] Device <addr> PreferredBearer: le
> > > > Changing le succeeded
> > > > [bluetoothctl]> bearer <addr>
> > > > PreferredBearer: le
> > > > [bluetoothctl]> bearer <addr> bredr
> > > > bluetoothd: @ MGMT Command: Remove Device (0x0034) plen 7
> > > > LE Address: <addr>
> > > > [CHG] Device <addr> PreferredBearer: bredr
> > > > Changing bredr succeeded
> > > > ---
> > > > client/main.c | 27 +++++++++++++++++++++++++++
> > > > 1 file changed, 27 insertions(+)
> > > >
> > > > diff --git a/client/main.c b/client/main.c
> > > > index feb21a1163d2..76c9bc329c96 100644
> > > > --- a/client/main.c
> > > > +++ b/client/main.c
> > > > @@ -1714,6 +1714,7 @@ static void cmd_info(int argc, char *argv[])
> > > > print_property(proxy, "AdvertisingFlags");
> > > > print_property(proxy, "AdvertisingData");
> > > > print_property(proxy, "Sets");
> > > > + print_property(proxy, "PreferredBearer");
> > > >
> > > > battery_proxy = find_proxies_by_path(battery_proxies,
> > > > g_dbus_proxy_get_path(proxy));
> > > > @@ -2086,6 +2087,30 @@ static void cmd_wake(int argc, char *argv[])
> > > > return bt_shell_noninteractive_quit(EXIT_FAILURE);
> > > > }
> > > >
> > > > +static void cmd_bearer(int argc, char *argv[])
> > > > +{
> > > > + GDBusProxy *proxy;
> > > > + char *str;
> > > > +
> > > > + proxy = find_device(argc, argv);
> > > > + if (!proxy)
> > > > + return bt_shell_noninteractive_quit(EXIT_FAILURE);
> > > > +
> > > > + if (argc <= 2) {
> > > > + print_property(proxy, "PreferredBearer");
> > > > + return;
> > > > + }
> > > > +
> > > > + str = strdup(argv[2]);
> > > > +
> > > > + if (g_dbus_proxy_set_property_basic(proxy, "PreferredBearer",
> > > > + DBUS_TYPE_STRING, &str,
> > > > + generic_callback, str, free))
> > > > + return;
> > > > +
> > > > + return bt_shell_noninteractive_quit(EXIT_FAILURE);
> > > > +}
> > > > +
> > > > static void cmd_list_attributes(int argc, char *argv[])
> > > > {
> > > > GDBusProxy *proxy;
> > > > @@ -3247,6 +3272,8 @@ static const struct bt_shell_menu main_menu = {
> > > > dev_generator },
> > > > { "wake", "[dev] [on/off]", cmd_wake, "Get/Set wake support",
> > > > dev_generator },
> > > > + { "bearer", "<dev> [last-seen/bredr/le]", cmd_bearer,
> > > > + "Get/Set preferred bearer", dev_generator },
> > > > { } },
> > > > };
> > > >
> > > > --
> > > > 2.48.1
> > >
> > > So I went ahead and implemented the idea of having PreferredBearer,
> > > this works great when setting bredr it really stops from connecting to
> > > LE, the said the other way around when setting to le seems to confuse
> > > some headsets like EarFun and it ends up connecting both bearers:
> > >
> > > [EarFun Air Pro 3]> transport.show
> > > Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0/fd1
> > > UUID: Sink PAC (00002bc9-0000-1000-8000-00805f9b34fb)
> > > Codec: 0x06 (6)
> > > Configuration.#0: len 0x02 type 0x01
> > > Configuration.Sampling Frequency: 16 Khz (0x03)
> > > Configuration.#1: len 0x02 type 0x02
> > > Configuration.Frame Duration: 7.5 ms (0x00)
> > > Configuration.#2: len 0x05 type 0x03
> > > Configuration.Location: 0x00000001
> > > Configuration.Location: Front Left (0x00000001)
> > > Configuration.#3: len 0x03 type 0x04
> > > Configuration.Frame Length: 30 (0x001e)
> > > Configuration.#4: len 0x02 type 0x05
> > > Configuration.Frame Blocks per SDU: 1 (0x01)
> > > Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
> > > State: idle
> > > Volume: 0x00c8 (200)
> > > Endpoint: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0
> > > QoS.CIG: 0x00 (0)
> > > QoS.CIS: 0x00 (0)
> > > QoS.Framing: 0x00 (0)
> > > QoS.PresentationDelay: 0x00009c40 (40000)
> > > QoS.Interval: 0x00001d4c (7500)
> > > QoS.Latency: 0x0008 (8)
> > > QoS.SDU: 0x001e (30)
> > > QoS.PHY: 0x02 (2)
> > > QoS.Retransmissions: 0x02 (2)
> > > Location: 0x00000003 (3)
> > > Links: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0/fd3
> > > Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0/fd2
> > > UUID: Sink PAC (00002bc9-0000-1000-8000-00805f9b34fb)
> > > Codec: 0x06 (6)
> > > Configuration.#0: len 0x02 type 0x01
> > > Configuration.Sampling Frequency: 16 Khz (0x03)
> > > Configuration.#1: len 0x02 type 0x02
> > > Configuration.Frame Duration: 7.5 ms (0x00)
> > > Configuration.#2: len 0x05 type 0x03
> > > Configuration.Location: 0x00000002
> > > Configuration.Location: Front Right (0x00000002)
> > > Configuration.#3: len 0x03 type 0x04
> > > Configuration.Frame Length: 30 (0x001e)
> > > Configuration.#4: len 0x02 type 0x05
> > > Configuration.Frame Blocks per SDU: 1 (0x01)
> > > Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
> > > State: idle
> > > Volume: 0x00c8 (200)
> > > Endpoint: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0
> > > QoS.CIG: 0x00 (0)
> > > QoS.CIS: 0x01 (1)
> > > QoS.Framing: 0x00 (0)
> > > QoS.PresentationDelay: 0x00009c40 (40000)
> > > QoS.Interval: 0x00001d4c (7500)
> > > QoS.Latency: 0x0008 (8)
> > > QoS.SDU: 0x001e (30)
> > > QoS.PHY: 0x02 (2)
> > > QoS.Retransmissions: 0x02 (2)
> > > Location: 0x00000003 (3)
> > > Links: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0/fd4
> > > Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0/fd3
> > > UUID: Source PAC (00002bcb-0000-1000-8000-00805f9b34fb)
> > > Codec: 0x06 (6)
> > > Configuration.#0: len 0x02 type 0x01
> > > Configuration.Sampling Frequency: 48 Khz (0x08)
> > > Configuration.#1: len 0x02 type 0x02
> > > Configuration.Frame Duration: 7.5 ms (0x00)
> > > Configuration.#2: len 0x05 type 0x03
> > > Configuration.Location: 0x00000001
> > > Configuration.Location: Front Left (0x00000001)
> > > Configuration.#3: len 0x03 type 0x04
> > > Configuration.Frame Length: 90 (0x005a)
> > > Configuration.#4: len 0x02 type 0x05
> > > Configuration.Frame Blocks per SDU: 1 (0x01)
> > > Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
> > > State: idle
> > > Volume: 0x00c8 (200)
> > > Endpoint: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0
> > > QoS.CIG: 0x00 (0)
> > > QoS.CIS: 0x00 (0)
> > > QoS.Framing: 0x00 (0)
> > > QoS.PresentationDelay: 0x00009c40 (40000)
> > > QoS.Interval: 0x00001d4c (7500)
> > > QoS.Latency: 0x000f (15)
> > > QoS.SDU: 0x005a (90)
> > > QoS.PHY: 0x02 (2)
> > > QoS.Retransmissions: 0x05 (5)
> > > Location: 0x00000003 (3)
> > > Links: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0/fd1
> > > Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0/fd4
> > > UUID: Source PAC (00002bcb-0000-1000-8000-00805f9b34fb)
> > > Codec: 0x06 (6)
> > > Configuration.#0: len 0x02 type 0x01
> > > Configuration.Sampling Frequency: 48 Khz (0x08)
> > > Configuration.#1: len 0x02 type 0x02
> > > Configuration.Frame Duration: 7.5 ms (0x00)
> > > Configuration.#2: len 0x05 type 0x03
> > > Configuration.Location: 0x00000002
> > > Configuration.Location: Front Right (0x00000002)
> > > Configuration.#3: len 0x03 type 0x04
> > > Configuration.Frame Length: 90 (0x005a)
> > > Configuration.#4: len 0x02 type 0x05
> > > Configuration.Frame Blocks per SDU: 1 (0x01)
> > > Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
> > > State: idle
> > > Volume: 0x00c8 (200)
> > > Endpoint: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0
> > > QoS.CIG: 0x00 (0)
> > > QoS.CIS: 0x01 (1)
> > > QoS.Framing: 0x00 (0)
> > > QoS.PresentationDelay: 0x00009c40 (40000)
> > > QoS.Interval: 0x00001d4c (7500)
> > > QoS.Latency: 0x000f (15)
> > > QoS.SDU: 0x005a (90)
> > > QoS.PHY: 0x02 (2)
> > > QoS.Retransmissions: 0x05 (5)
> > > Location: 0x00000003 (3)
> > > Links: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0/fd2
> > > Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/fd5
> > > UUID: Audio Source (0000110a-0000-1000-8000-00805f9b34fb)
> > > Codec: 0x02 (2)
> > > Media Codec: MPEG24
> > > Object Types: MPEG-4 AAC LC
> > > Frequencies: 48kHz
> > > Channels: 2
> > > Bitrate: 320000
> > > VBR: Yes
> > > Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
> > > State: idle
> > > Delay: 0x0960 (2400)
> > > Volume: 0x0064 (100)
> >
> > Forgot to mention, but with the above transports it seems to confuse
> > the gnome audio output selection, it doesn't seem to be able to mix
> > A2DP and BAP transports for some reason, so when I select the device
> > it enables BAP but A2DP is not shown as an option.
>
> I'll have to see if I can reproduce that on current PW master branch.
>
> The visibility of profiles in theory should only cares about whether
> the UUIDs appear in both device properties and transport.
I think I will merge these changes since the property is marked as
experimental; we can always change it or revert later.
--
Luiz Augusto von Dentz
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH BlueZ v2 3/3] client: Add support get/set PreferredBearer
2025-03-06 16:41 ` Luiz Augusto von Dentz
@ 2025-03-06 17:38 ` Pauli Virtanen
0 siblings, 0 replies; 9+ messages in thread
From: Pauli Virtanen @ 2025-03-06 17:38 UTC (permalink / raw)
To: Luiz Augusto von Dentz; +Cc: linux-bluetooth, Bastien Nocera
Hi,
to, 2025-03-06 kello 11:41 -0500, Luiz Augusto von Dentz kirjoitti:
> On Sat, Mar 1, 2025 at 11:17 AM Pauli Virtanen <pav@iki.fi> wrote:
> >
> > ti, 2025-02-25 kello 17:12 -0500, Luiz Augusto von Dentz kirjoitti:
> > > Hi Pauli,
> > >
> > > On Tue, Feb 25, 2025 at 5:10 PM Luiz Augusto von Dentz
> > > <luiz.dentz@gmail.com> wrote:
> > > >
> > > > Hi Pauli, Bastien,
> > > >
> > > > On Tue, Feb 25, 2025 at 5:01 PM Luiz Augusto von Dentz
> > > > <luiz.dentz@gmail.com> wrote:
> > > > >
> > > > > From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
> > > > >
> > > > > This adds support for PreferredBearer which is printed with the likes of
> > > > > info command:
> > > > >
> > > > > bluetoothctl> info <addr>
> > > > > ...
> > > > > PreferredBearer: last-seen
> > > > >
> > > > > It also introduces a new command to get/set the PreferredBearer:
> > > > >
> > > > > [bluetoothctl]> bearer --help
> > > > > Get/Set preferred bearer
> > > > > Usage:
> > > > > bearer <dev> [last-seen/bredr/le]
> > > > >
> > > > > [bluetoothctl]> bearer <addr>
> > > > > PreferredBearer: last-seen
> > > > > [bluetoothctl]> bearer <addr> le
> > > > > bluetoothd: @ MGMT Command: Add Device (0x0033) plen 8
> > > > > LE Address: <addr>
> > > > > Action: Auto-connect remote device (0x02)
> > > > > [CHG] Device <addr> PreferredBearer: le
> > > > > Changing le succeeded
> > > > > [bluetoothctl]> bearer <addr>
> > > > > PreferredBearer: le
> > > > > [bluetoothctl]> bearer <addr> bredr
> > > > > bluetoothd: @ MGMT Command: Remove Device (0x0034) plen 7
> > > > > LE Address: <addr>
> > > > > [CHG] Device <addr> PreferredBearer: bredr
> > > > > Changing bredr succeeded
> > > > > ---
> > > > > client/main.c | 27 +++++++++++++++++++++++++++
> > > > > 1 file changed, 27 insertions(+)
> > > > >
> > > > > diff --git a/client/main.c b/client/main.c
> > > > > index feb21a1163d2..76c9bc329c96 100644
> > > > > --- a/client/main.c
> > > > > +++ b/client/main.c
> > > > > @@ -1714,6 +1714,7 @@ static void cmd_info(int argc, char *argv[])
> > > > > print_property(proxy, "AdvertisingFlags");
> > > > > print_property(proxy, "AdvertisingData");
> > > > > print_property(proxy, "Sets");
> > > > > + print_property(proxy, "PreferredBearer");
> > > > >
> > > > > battery_proxy = find_proxies_by_path(battery_proxies,
> > > > > g_dbus_proxy_get_path(proxy));
> > > > > @@ -2086,6 +2087,30 @@ static void cmd_wake(int argc, char *argv[])
> > > > > return bt_shell_noninteractive_quit(EXIT_FAILURE);
> > > > > }
> > > > >
> > > > > +static void cmd_bearer(int argc, char *argv[])
> > > > > +{
> > > > > + GDBusProxy *proxy;
> > > > > + char *str;
> > > > > +
> > > > > + proxy = find_device(argc, argv);
> > > > > + if (!proxy)
> > > > > + return bt_shell_noninteractive_quit(EXIT_FAILURE);
> > > > > +
> > > > > + if (argc <= 2) {
> > > > > + print_property(proxy, "PreferredBearer");
> > > > > + return;
> > > > > + }
> > > > > +
> > > > > + str = strdup(argv[2]);
> > > > > +
> > > > > + if (g_dbus_proxy_set_property_basic(proxy, "PreferredBearer",
> > > > > + DBUS_TYPE_STRING, &str,
> > > > > + generic_callback, str, free))
> > > > > + return;
> > > > > +
> > > > > + return bt_shell_noninteractive_quit(EXIT_FAILURE);
> > > > > +}
> > > > > +
> > > > > static void cmd_list_attributes(int argc, char *argv[])
> > > > > {
> > > > > GDBusProxy *proxy;
> > > > > @@ -3247,6 +3272,8 @@ static const struct bt_shell_menu main_menu = {
> > > > > dev_generator },
> > > > > { "wake", "[dev] [on/off]", cmd_wake, "Get/Set wake support",
> > > > > dev_generator },
> > > > > + { "bearer", "<dev> [last-seen/bredr/le]", cmd_bearer,
> > > > > + "Get/Set preferred bearer", dev_generator },
> > > > > { } },
> > > > > };
> > > > >
> > > > > --
> > > > > 2.48.1
> > > >
> > > > So I went ahead and implemented the idea of having PreferredBearer,
> > > > this works great when setting bredr it really stops from connecting to
> > > > LE, the said the other way around when setting to le seems to confuse
> > > > some headsets like EarFun and it ends up connecting both bearers:
> > > >
> > > > [EarFun Air Pro 3]> transport.show
> > > > Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0/fd1
> > > > UUID: Sink PAC (00002bc9-0000-1000-8000-00805f9b34fb)
> > > > Codec: 0x06 (6)
> > > > Configuration.#0: len 0x02 type 0x01
> > > > Configuration.Sampling Frequency: 16 Khz (0x03)
> > > > Configuration.#1: len 0x02 type 0x02
> > > > Configuration.Frame Duration: 7.5 ms (0x00)
> > > > Configuration.#2: len 0x05 type 0x03
> > > > Configuration.Location: 0x00000001
> > > > Configuration.Location: Front Left (0x00000001)
> > > > Configuration.#3: len 0x03 type 0x04
> > > > Configuration.Frame Length: 30 (0x001e)
> > > > Configuration.#4: len 0x02 type 0x05
> > > > Configuration.Frame Blocks per SDU: 1 (0x01)
> > > > Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
> > > > State: idle
> > > > Volume: 0x00c8 (200)
> > > > Endpoint: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0
> > > > QoS.CIG: 0x00 (0)
> > > > QoS.CIS: 0x00 (0)
> > > > QoS.Framing: 0x00 (0)
> > > > QoS.PresentationDelay: 0x00009c40 (40000)
> > > > QoS.Interval: 0x00001d4c (7500)
> > > > QoS.Latency: 0x0008 (8)
> > > > QoS.SDU: 0x001e (30)
> > > > QoS.PHY: 0x02 (2)
> > > > QoS.Retransmissions: 0x02 (2)
> > > > Location: 0x00000003 (3)
> > > > Links: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0/fd3
> > > > Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0/fd2
> > > > UUID: Sink PAC (00002bc9-0000-1000-8000-00805f9b34fb)
> > > > Codec: 0x06 (6)
> > > > Configuration.#0: len 0x02 type 0x01
> > > > Configuration.Sampling Frequency: 16 Khz (0x03)
> > > > Configuration.#1: len 0x02 type 0x02
> > > > Configuration.Frame Duration: 7.5 ms (0x00)
> > > > Configuration.#2: len 0x05 type 0x03
> > > > Configuration.Location: 0x00000002
> > > > Configuration.Location: Front Right (0x00000002)
> > > > Configuration.#3: len 0x03 type 0x04
> > > > Configuration.Frame Length: 30 (0x001e)
> > > > Configuration.#4: len 0x02 type 0x05
> > > > Configuration.Frame Blocks per SDU: 1 (0x01)
> > > > Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
> > > > State: idle
> > > > Volume: 0x00c8 (200)
> > > > Endpoint: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0
> > > > QoS.CIG: 0x00 (0)
> > > > QoS.CIS: 0x01 (1)
> > > > QoS.Framing: 0x00 (0)
> > > > QoS.PresentationDelay: 0x00009c40 (40000)
> > > > QoS.Interval: 0x00001d4c (7500)
> > > > QoS.Latency: 0x0008 (8)
> > > > QoS.SDU: 0x001e (30)
> > > > QoS.PHY: 0x02 (2)
> > > > QoS.Retransmissions: 0x02 (2)
> > > > Location: 0x00000003 (3)
> > > > Links: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0/fd4
> > > > Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0/fd3
> > > > UUID: Source PAC (00002bcb-0000-1000-8000-00805f9b34fb)
> > > > Codec: 0x06 (6)
> > > > Configuration.#0: len 0x02 type 0x01
> > > > Configuration.Sampling Frequency: 48 Khz (0x08)
> > > > Configuration.#1: len 0x02 type 0x02
> > > > Configuration.Frame Duration: 7.5 ms (0x00)
> > > > Configuration.#2: len 0x05 type 0x03
> > > > Configuration.Location: 0x00000001
> > > > Configuration.Location: Front Left (0x00000001)
> > > > Configuration.#3: len 0x03 type 0x04
> > > > Configuration.Frame Length: 90 (0x005a)
> > > > Configuration.#4: len 0x02 type 0x05
> > > > Configuration.Frame Blocks per SDU: 1 (0x01)
> > > > Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
> > > > State: idle
> > > > Volume: 0x00c8 (200)
> > > > Endpoint: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0
> > > > QoS.CIG: 0x00 (0)
> > > > QoS.CIS: 0x00 (0)
> > > > QoS.Framing: 0x00 (0)
> > > > QoS.PresentationDelay: 0x00009c40 (40000)
> > > > QoS.Interval: 0x00001d4c (7500)
> > > > QoS.Latency: 0x000f (15)
> > > > QoS.SDU: 0x005a (90)
> > > > QoS.PHY: 0x02 (2)
> > > > QoS.Retransmissions: 0x05 (5)
> > > > Location: 0x00000003 (3)
> > > > Links: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0/fd1
> > > > Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0/fd4
> > > > UUID: Source PAC (00002bcb-0000-1000-8000-00805f9b34fb)
> > > > Codec: 0x06 (6)
> > > > Configuration.#0: len 0x02 type 0x01
> > > > Configuration.Sampling Frequency: 48 Khz (0x08)
> > > > Configuration.#1: len 0x02 type 0x02
> > > > Configuration.Frame Duration: 7.5 ms (0x00)
> > > > Configuration.#2: len 0x05 type 0x03
> > > > Configuration.Location: 0x00000002
> > > > Configuration.Location: Front Right (0x00000002)
> > > > Configuration.#3: len 0x03 type 0x04
> > > > Configuration.Frame Length: 90 (0x005a)
> > > > Configuration.#4: len 0x02 type 0x05
> > > > Configuration.Frame Blocks per SDU: 1 (0x01)
> > > > Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
> > > > State: idle
> > > > Volume: 0x00c8 (200)
> > > > Endpoint: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_sink0
> > > > QoS.CIG: 0x00 (0)
> > > > QoS.CIS: 0x01 (1)
> > > > QoS.Framing: 0x00 (0)
> > > > QoS.PresentationDelay: 0x00009c40 (40000)
> > > > QoS.Interval: 0x00001d4c (7500)
> > > > QoS.Latency: 0x000f (15)
> > > > QoS.SDU: 0x005a (90)
> > > > QoS.PHY: 0x02 (2)
> > > > QoS.Retransmissions: 0x05 (5)
> > > > Location: 0x00000003 (3)
> > > > Links: /org/bluez/hci0/dev_70_5A_6F_63_B6_41/pac_source0/fd2
> > > > Transport /org/bluez/hci0/dev_70_5A_6F_63_B6_41/fd5
> > > > UUID: Audio Source (0000110a-0000-1000-8000-00805f9b34fb)
> > > > Codec: 0x02 (2)
> > > > Media Codec: MPEG24
> > > > Object Types: MPEG-4 AAC LC
> > > > Frequencies: 48kHz
> > > > Channels: 2
> > > > Bitrate: 320000
> > > > VBR: Yes
> > > > Device: /org/bluez/hci0/dev_70_5A_6F_63_B6_41
> > > > State: idle
> > > > Delay: 0x0960 (2400)
> > > > Volume: 0x0064 (100)
> > >
> > > Forgot to mention, but with the above transports it seems to confuse
> > > the gnome audio output selection, it doesn't seem to be able to mix
> > > A2DP and BAP transports for some reason, so when I select the device
> > > it enables BAP but A2DP is not shown as an option.
> >
> > I'll have to see if I can reproduce that on current PW master branch.
> >
> > The visibility of profiles in theory should only cares about whether
> > the UUIDs appear in both device properties and transport.
>
> I think I will merge these changes since the property is marked as
> experimental; we can always change it or revert later.
Since the default value retains previous behavior, I think that's a
good idea as it makes it easier to iterate on this.
--
Pauli Virtanen
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2025-03-06 17:38 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-02-25 22:00 [PATCH BlueZ v2 1/3] org.bluez.Device: Introduced PreferredBearer Luiz Augusto von Dentz
2025-02-25 22:00 ` [PATCH BlueZ v2 2/3] device: Add implementation of PreferredBearer Luiz Augusto von Dentz
2025-02-25 22:00 ` [PATCH BlueZ v2 3/3] client: Add support get/set PreferredBearer Luiz Augusto von Dentz
2025-02-25 22:10 ` Luiz Augusto von Dentz
2025-02-25 22:12 ` Luiz Augusto von Dentz
2025-03-01 16:17 ` Pauli Virtanen
2025-03-06 16:41 ` Luiz Augusto von Dentz
2025-03-06 17:38 ` Pauli Virtanen
2025-02-25 23:12 ` [BlueZ,v2,1/3] org.bluez.Device: Introduced PreferredBearer bluez.test.bot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox