From patchwork Wed Sep 27 21:53:43 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 726740 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4E7BDE7109E for ; Wed, 27 Sep 2023 21:54:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229511AbjI0VyA (ORCPT ); Wed, 27 Sep 2023 17:54:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42410 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229458AbjI0Vx7 (ORCPT ); Wed, 27 Sep 2023 17:53:59 -0400 Received: from mail-io1-xd2b.google.com (mail-io1-xd2b.google.com [IPv6:2607:f8b0:4864:20::d2b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E2681FB for ; Wed, 27 Sep 2023 14:53:57 -0700 (PDT) Received: by mail-io1-xd2b.google.com with SMTP id ca18e2360f4ac-77acb04309dso433508039f.2 for ; Wed, 27 Sep 2023 14:53:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1695851636; x=1696456436; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:from:to:cc:subject:date:message-id:reply-to; bh=O8UvCzpydCqEJ8G9A6NMOVjDAbhJMdAdjKtdbYeGZO0=; b=VXKMNvCiMcGw/CEme4WvKu+v6dqpZbF5P7C0kAfj+CN9yuAkQgxUtXzJYYYF03FXnO 4D4hQaOPJsWUVqtlDer3n0aNp/+nlxM2XAYVXgIwc6It3lttbH3hwhgNf9KJdgv6LNEc U2xg7QlQJmDoV8xYiHJkLFPAjbeYIW7DSA79okNrJl+8cb2IqbhxqH4hpq2M2pOR8xdM dhgOP6KcyUSr3In/IpPePNPFx0VOxUdH95CgrW5gx7eRntcJZa/3Afgwjh5eQLON2IVy GlEYz6PkVcr6I+scnjhwQnfz4Nci9x6cCbpCJ7afAIRygvk9xxayYZYqF29agU9MLWPP Idlw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695851636; x=1696456436; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=O8UvCzpydCqEJ8G9A6NMOVjDAbhJMdAdjKtdbYeGZO0=; b=MljMEhHm83X/wLp/fBUgLSSvA4xevJfvzxQMiJMGaelhTRX/We9XZ4dEMTw4k00AiV roYLT+6vcdI0Y9cFP3nmCYNm3HEOQUx+lD/8pK9luW5FnwimTnBeVp5HRp3cJ3N/SWmI UoBsN134pIajECRVclx1XvgnR/36VZQ3QGp490WQFnzdvxerKZjj+wKh1CRJ7Hddqw4V xZNxmogTrJ7+v8dp0gTeK+KRgnnkQWHKUhI1gUELDgHwZ7p8zUrPjv6PMvnB32XBji8k ArlDvq2cxV0JfhTVfH5JKLXqYjA+q3wrJelSaFiR2WbdqQ0W90BCuj3F06o5N0tvu6dk RTkA== X-Gm-Message-State: AOJu0YxSgQ10A+sccIrGCiDxuhfsJLVMfGsCMGxSgx9Uz7IpPyygTfu5 OZAJbWRFFETuLMFo6X8OrZ8Anwzuxr8hfAMA X-Google-Smtp-Source: AGHT+IG0vmsetSRWPfrxTW8JRpA+l/cjoAl5KGp6Re/AGdBHXe1TRBF0q8bxI7MC77+aI4NYibFmLA== X-Received: by 2002:a5e:d60d:0:b0:79f:ca2f:9198 with SMTP id w13-20020a5ed60d000000b0079fca2f9198mr3731161iom.2.1695851636450; Wed, 27 Sep 2023 14:53:56 -0700 (PDT) Received: from lvondent-mobl4.. (c-98-232-221-87.hsd1.or.comcast.net. [98.232.221.87]) by smtp.gmail.com with ESMTPSA id g15-20020a02cd0f000000b0042bbfe3dc42sm4225331jaq.173.2023.09.27.14.53.55 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Sep 2023 14:53:55 -0700 (PDT) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH v4 01/12] media-api: Update to reflect the last code changes Date: Wed, 27 Sep 2023 14:53:43 -0700 Message-ID: <20230927215354.1874835-1-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.41.0 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz This reflect the last code changes adding the missing Broadcast properties. --- doc/media-api.rst | 179 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 138 insertions(+), 41 deletions(-) diff --git a/doc/media-api.rst b/doc/media-api.rst index 34bf44e8ffbb..b37ae8f01630 100644 --- a/doc/media-api.rst +++ b/doc/media-api.rst @@ -710,28 +710,45 @@ void SetConfiguration(object transport, dict properties) properties: :array{byte} Capabilities [Mandatory]: + + See Endpoint.Capabilities property. + :array{byte} Metadata [ISO only]: - :byte CIG [ISO only]: - :byte CIS [ISO only]: - :uint32 Interval [ISO only]: - :bool Framing [ISO only]: - :string PHY [ISO only]: - :uint16 SDU [ISO only]: - :byte Retransmissions [ISO only]: - :uint16 Latency [ISO only]: - :uint32 Delay [ISO only]: - :uint8 TargetLatency [ISO Latency]: - :byte BIG [ISO broadcast only]: - :byte BIS [ISO broadcast only]: - :byte SyncInterval [ISO broadcast only]: - :byte Encryption [ISO broadcast only]: - :byte Options [ISO broadcast only]: - :uint16 Skip [ISO broadcast only]: - :uint16 SyncTimeout [ISO broadcast only]: - :byte SyncCteType [ISO broadcast only]: - :byte MSE [ISO broadcast only]: - :uint16 Timeout [ISO broadcast only]: - :array{byte} BroadcastCode [ISO broadcast only]: + + See Endpoint.Metadata property. + + :uint32 Location [ISO only]: + + See Endpoint.Location property. + + :byte Framing [ISO only]: + + See Endpoint.Framing property. + + :byte PHY [ISO only]: + + See Endpoint.PHY property. + + :uint16 MaximumLatency [ISO only]: + + See Endpoint.MaximumLatency property. + + :uint32 MinimumDelay [ISO only]: + + See Endpoint.MinimumDelay property. + + :uint32 MaximumDelay [ISO only]: + + See Endpoint.MaximumDelay property. + + :uint32 PreferredMinimumDelay [ISO only]: + + See Endpoint.PreferredMinimumDelay property. + + :uint32 PreferredMaximumDelay [ISO only]: + + See Endpoint.PreferredMaximumDelay property. + array{byte} SelectConfiguration(array{byte} capabilities) ````````````````````````````````````````````````````````` @@ -984,33 +1001,65 @@ dict QoS [readonly, optional, ISO only, experimental] Indicates configured CIG. + Possible values: + + :0x00 - 0xef: + + Valid ID range. + + :0xff: + + Auto allocate. + :byte CIS: Indicates configured CIS. - :uint32 Interval: + Possible values: - Indicates configured ISO interval. + :0x00 - 0xef: - :boolean Framing: + Valid ID range. + + :0xff: + + Auto allocate. + + :byte Framing: Indicates configured framing. - :byte PHY: + Possible values: - Indicates configured PHY. + :0x00: - :uint16 SDU: + Unframed. - Indicates configured SDU. + :0x01: - :byte Retransmissions: + Framed. - Indicates configured retransmissions. + :uint32 PresentationDelay: - :uint16 Latency: + Indicates configured transport presentation delay (us). - Indicates configured transport latency. + :byte TargetLatency: + + Indicates the requested target latency. + + Possible values: + + :0x01: + + Low Latency. + + :0x02: + + Balanced Latency/Reliability. + + :0x03: + + High Reliability. Possible values for Broadcast: @@ -1022,26 +1071,74 @@ dict QoS [readonly, optional, ISO only, experimental] Indicates configured BIS. - :uint32 SyncFactor: + :byte SyncFactor: - Indicates configured sync factor. + Indicates configured broadcast sync factor. - :uint32 Interval: + :byte Packing: - Indicates configured ISO interval. + Indicates configured packing. - :byte PHY: + :byte Framing: - Indicates configured PHY. + Indicates configured framing. - :uint16 SDU: + :byte Options: - Indicates configured maximum SDU. + Indicates configured broadcast options. + + :uint16 Skip: + + Indicates configured broadcast skip. :byte SyncTimeout: Indicates configured broadcast sync timeout. + :byte SyncType: + + Indicates configured broadcast sync CTE type. + + :byte MSE: + + Indicates configured broadcast MSE. + + :uint16 Timeout: + + Indicates configured broadcast timeout. + + Possible values for both Unicast and Broadcast: + + :uint32 Interval: + + Indicates configured ISO interval (us). + :uint16 Latency: - Indicates configured transport latency. + Indicates configured transport latency (ms). + + :uint16 SDU: + + Indicates configured maximum SDU. + + :byte PHY: + + Indicates configured PHY. + + Possible values: + + :bit 0: + + LE 1M + + :bit 1: + + LE 2M + + :bit 2: + + LE Coded + + :byte Retransmissions: + + Indicates configured retransmissions. From patchwork Wed Sep 27 21:53:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 728236 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1905EE82CC0 for ; Wed, 27 Sep 2023 21:54:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229731AbjI0VyD (ORCPT ); Wed, 27 Sep 2023 17:54:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42426 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229458AbjI0VyC (ORCPT ); Wed, 27 Sep 2023 17:54:02 -0400 Received: from mail-io1-xd2c.google.com (mail-io1-xd2c.google.com [IPv6:2607:f8b0:4864:20::d2c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EBB65FB for ; Wed, 27 Sep 2023 14:53:59 -0700 (PDT) Received: by mail-io1-xd2c.google.com with SMTP id ca18e2360f4ac-79f8e4108c3so404099939f.3 for ; Wed, 27 Sep 2023 14:53:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1695851638; x=1696456438; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=bLRjLlaoWXCdXJECDkADcOZLMqt8RCUscACboAgme1A=; b=MENPwOd169PhSAyzO7TA4zY8UgRzjJ0Dn8be4mjQ7+4RaJgIeeCjEtZIaQxzrSwUaK M7KGgmamsU6jjC8alYpoSxpKOHNQcfSY/5T+0KF7bdI+fTOMdKu0jhwhJCuqkie13ixU fDQ7ycqqdepYUtXZBwUs95UBeT+JOrDjWJ8gRP96rr97uCXpmkbghWc4URZuHI5jAm7B iVkr4W1amcHyIpPn0wVsIbR1VHnSZeWT7JC3O9QWULGCTcHY5EUdIhj0Gv16BpdPW8qT FYomWXisYxuRaij/BKR7a4ydWb6qecu+9ICuYb5kZ2zPHWKE1HawHG8pcaTb+I/MB7vS ToKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695851638; x=1696456438; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=bLRjLlaoWXCdXJECDkADcOZLMqt8RCUscACboAgme1A=; b=H6s4YOdFwKftLqnOldw7PMtybRVlXKj+BKOGsZwMjedgOzmqy+IP5pR+VQHiboD0cc ECxHspXvHsDjMH4sCEkSoCC9UGGCzopzoZCdogvvJl36K8XNr/uWYXz6ofhwxOFEXz6N /PdK2YG9NdvOpLYecuVGELxPvJAmgzuKwQ5Zr0KkLF/Zpk6yZkq91lthK5JzK5/s7V+a yJ7X/mNs34JbhHlGJn68vQvR99MuyJyzJnKVtx56PIFF3WOJmXlZIu31fgft096jzU5O lJezdgvP3m0fDpVwAFE9i46CgnyZNB6+srbO1HpOY4KgMw1EmYL+56nqxkdttrTrVP0Q mpZg== X-Gm-Message-State: AOJu0YwLznnPKGM73PENimdO3meT8ufcciUd7+0MV1Z2R3SuSPixx26E NQKd8hYC2ZkDesCEsCKdlkPS6twI+l/L+pFh X-Google-Smtp-Source: AGHT+IEKg/MJPB2xer+MHrnEIVNsVlBrq9s0Cw1aI4BZJGeJHNvIeE5temew+YQOsLIO3VMvOTnBnw== X-Received: by 2002:a5d:8050:0:b0:791:16ba:d764 with SMTP id b16-20020a5d8050000000b0079116bad764mr3964139ior.16.1695851638276; Wed, 27 Sep 2023 14:53:58 -0700 (PDT) Received: from lvondent-mobl4.. (c-98-232-221-87.hsd1.or.comcast.net. [98.232.221.87]) by smtp.gmail.com with ESMTPSA id g15-20020a02cd0f000000b0042bbfe3dc42sm4225331jaq.173.2023.09.27.14.53.56 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Sep 2023 14:53:56 -0700 (PDT) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH v4 02/12] transport: Implement QoS property Date: Wed, 27 Sep 2023 14:53:44 -0700 Message-ID: <20230927215354.1874835-2-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230927215354.1874835-1-luiz.dentz@gmail.com> References: <20230927215354.1874835-1-luiz.dentz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz This implements Transport.QoS as a dict instead of listing each field as a individual property. --- client/player.c | 6 +- lib/bluetooth.h | 2 +- profiles/audio/bap.c | 6 +- profiles/audio/transport.c | 431 ++++++++----------------------------- src/shared/bap.h | 2 +- src/shared/bass.c | 2 +- tools/iso-tester.c | 6 +- tools/isotest.c | 2 +- 8 files changed, 98 insertions(+), 359 deletions(-) diff --git a/client/player.c b/client/player.c index 42721c21062b..fdc27c281ed8 100644 --- a/client/player.c +++ b/client/player.c @@ -1756,7 +1756,7 @@ static struct bt_iso_qos bcast_qos = { .bcast = { .big = BT_ISO_QOS_BIG_UNSET, .bis = BT_ISO_QOS_BIS_UNSET, - .sync_interval = 24, + .sync_factor = 24, .packing = 0x00, .framing = 0x00, .encryption = 0x00, @@ -1874,10 +1874,10 @@ static void append_properties(DBusMessageIter *iter, if (!cfg->ep->broadcast) goto done; - bt_shell_printf("SyncInterval %u\n", bcast_qos.bcast.sync_interval); + bt_shell_printf("SyncInterval %u\n", bcast_qos.bcast.sync_factor); g_dbus_dict_append_entry(&dict, "SyncInterval", DBUS_TYPE_BYTE, - &bcast_qos.bcast.sync_interval); + &bcast_qos.bcast.sync_factor); bt_shell_printf("Encryption %u\n", bcast_qos.bcast.encryption); diff --git a/lib/bluetooth.h b/lib/bluetooth.h index 1286aa763208..ba08c70e61b8 100644 --- a/lib/bluetooth.h +++ b/lib/bluetooth.h @@ -174,7 +174,7 @@ struct bt_iso_ucast_qos { struct bt_iso_bcast_qos { uint8_t big; uint8_t bis; - uint8_t sync_interval; + uint8_t sync_factor; uint8_t packing; uint8_t framing; struct bt_iso_io_qos in; diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c index d70ad872eb87..b05d7a2d9675 100644 --- a/profiles/audio/bap.c +++ b/profiles/audio/bap.c @@ -533,7 +533,7 @@ static int parse_properties(DBusMessageIter *props, struct iovec **caps, goto fail; dbus_message_iter_get_basic(&value, - &qos->bcast.sync_interval); + &qos->bcast.sync_factor); } else if (!strcasecmp(key, "MSE")) { if (var != DBUS_TYPE_BYTE) goto fail; @@ -744,7 +744,7 @@ static void update_bcast_qos(struct bt_iso_qos *qos, { bap_qos->bcast.big = qos->bcast.big; bap_qos->bcast.bis = qos->bcast.bis; - bap_qos->bcast.sync_interval = qos->bcast.sync_interval; + bap_qos->bcast.sync_factor = qos->bcast.sync_factor; bap_qos->bcast.packing = qos->bcast.packing; bap_qos->bcast.framing = qos->bcast.framing; bap_qos->bcast.encryption = qos->bcast.encryption; @@ -1659,7 +1659,7 @@ static void bap_create_bcast_io(struct bap_data *data, struct bap_ep *ep, iso_qos.bcast.big = ep->qos.bcast.big; iso_qos.bcast.bis = ep->qos.bcast.bis; - iso_qos.bcast.sync_interval = ep->qos.bcast.sync_interval; + iso_qos.bcast.sync_factor = ep->qos.bcast.sync_factor; iso_qos.bcast.packing = ep->qos.bcast.packing; iso_qos.bcast.framing = ep->qos.bcast.framing; iso_qos.bcast.encryption = ep->qos.bcast.encryption; diff --git a/profiles/audio/transport.c b/profiles/audio/transport.c index dd923b03ed9d..1e03b7b51475 100644 --- a/profiles/audio/transport.c +++ b/profiles/audio/transport.c @@ -850,160 +850,41 @@ static const GDBusPropertyTable a2dp_properties[] = { { } }; -static gboolean qos_exists(const GDBusPropertyTable *property, void *data) +static void append_io_qos(DBusMessageIter *dict, struct bt_bap_io_qos *qos) { - struct media_transport *transport = data; - struct bap_transport *bap = transport->data; - - if (media_endpoint_is_broadcast(transport->endpoint)) - return bap->qos.bcast.io_qos.sdu != 0x00; - - return bap->qos.ucast.io_qos.phy != 0x00; + dict_append_entry(dict, "Interval", DBUS_TYPE_UINT32, &qos->interval); + dict_append_entry(dict, "Latency", DBUS_TYPE_UINT16, &qos->latency); + dict_append_entry(dict, "SDU", DBUS_TYPE_UINT16, &qos->sdu); + dict_append_entry(dict, "PHY", DBUS_TYPE_BYTE, &qos->phy); + dict_append_entry(dict, "Retransmissions", DBUS_TYPE_BYTE, &qos->rtn); } -static gboolean get_cig(const GDBusPropertyTable *property, +static gboolean get_ucast_qos(const GDBusPropertyTable *property, DBusMessageIter *iter, void *data) { struct media_transport *transport = data; struct bap_transport *bap = transport->data; + DBusMessageIter dict; - dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE, - &bap->qos.ucast.cig_id); + dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, + DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING + DBUS_TYPE_STRING_AS_STRING + DBUS_TYPE_VARIANT_AS_STRING + DBUS_DICT_ENTRY_END_CHAR_AS_STRING, + &dict); - return TRUE; -} + dict_append_entry(&dict, "CIG", DBUS_TYPE_BYTE, + &bap->qos.ucast.cig_id); + dict_append_entry(&dict, "CIS", DBUS_TYPE_BYTE, + &bap->qos.ucast.cis_id); + dict_append_entry(&dict, "Framing", DBUS_TYPE_BYTE, + &bap->qos.ucast.framing); + dict_append_entry(&dict, "PresentationDelay", DBUS_TYPE_UINT32, + &bap->qos.ucast.delay); -static gboolean get_big(const GDBusPropertyTable *property, - DBusMessageIter *iter, void *data) -{ - struct media_transport *transport = data; - struct bap_transport *bap = transport->data; + append_io_qos(&dict, &bap->qos.ucast.io_qos); - dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE, - &bap->qos.bcast.big); - - return TRUE; -} - -static gboolean get_cis(const GDBusPropertyTable *property, - DBusMessageIter *iter, void *data) -{ - struct media_transport *transport = data; - struct bap_transport *bap = transport->data; - - dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE, - &bap->qos.ucast.cis_id); - - return TRUE; -} - -static gboolean get_bis(const GDBusPropertyTable *property, - DBusMessageIter *iter, void *data) -{ - struct media_transport *transport = data; - struct bap_transport *bap = transport->data; - - dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE, - &bap->qos.bcast.bis); - - return TRUE; -} - -static gboolean get_interval(const GDBusPropertyTable *property, - DBusMessageIter *iter, void *data) -{ - struct media_transport *transport = data; - struct bap_transport *bap = transport->data; - - dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, - &bap->qos.ucast.io_qos.interval); - - return TRUE; -} - -static gboolean get_framing(const GDBusPropertyTable *property, - DBusMessageIter *iter, void *data) -{ - struct media_transport *transport = data; - struct bap_transport *bap = transport->data; - dbus_bool_t val = bap->qos.ucast.framing; - - if (media_endpoint_is_broadcast(transport->endpoint)) - val = bap->qos.bcast.framing; - - dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &val); - - return TRUE; -} - -static gboolean get_phy(const GDBusPropertyTable *property, - DBusMessageIter *iter, void *data) -{ - struct media_transport *transport = data; - struct bap_transport *bap = transport->data; - - if (media_endpoint_is_broadcast(transport->endpoint)) { - dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE, - &bap->qos.bcast.io_qos.phy); - return TRUE; - } - - dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE, - &bap->qos.ucast.io_qos.phy); - - return TRUE; -} - -static gboolean get_sdu(const GDBusPropertyTable *property, - DBusMessageIter *iter, void *data) -{ - struct media_transport *transport = data; - struct bap_transport *bap = transport->data; - - if (media_endpoint_is_broadcast(transport->endpoint)) { - dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16, - &bap->qos.bcast.io_qos.sdu); - return TRUE; - } - - dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16, - &bap->qos.ucast.io_qos.sdu); - - return TRUE; -} - -static gboolean get_retransmissions(const GDBusPropertyTable *property, - DBusMessageIter *iter, void *data) -{ - struct media_transport *transport = data; - struct bap_transport *bap = transport->data; - - dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE, - &bap->qos.ucast.io_qos.rtn); - - return TRUE; -} - -static gboolean get_latency(const GDBusPropertyTable *property, - DBusMessageIter *iter, void *data) -{ - struct media_transport *transport = data; - struct bap_transport *bap = transport->data; - - dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16, - &bap->qos.ucast.io_qos.latency); - - return TRUE; -} - -static gboolean get_delay(const GDBusPropertyTable *property, - DBusMessageIter *iter, void *data) -{ - struct media_transport *transport = data; - struct bap_transport *bap = transport->data; - - dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, - &bap->qos.ucast.delay); + dbus_message_iter_close_container(iter, &dict); return TRUE; } @@ -1084,119 +965,12 @@ static gboolean get_links(const GDBusPropertyTable *property, return TRUE; } -static gboolean get_sync_interval(const GDBusPropertyTable *property, - DBusMessageIter *iter, void *data) +static gboolean qos_ucast_exists(const GDBusPropertyTable *property, void *data) { struct media_transport *transport = data; struct bap_transport *bap = transport->data; - dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE, - &bap->qos.bcast.sync_interval); - - return TRUE; -} - -static gboolean get_packing(const GDBusPropertyTable *property, - DBusMessageIter *iter, void *data) -{ - struct media_transport *transport = data; - struct bap_transport *bap = transport->data; - - dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE, - &bap->qos.bcast.packing); - - return TRUE; -} - -static gboolean get_bcode(const GDBusPropertyTable *property, - DBusMessageIter *iter, void *data) -{ - struct media_transport *transport = data; - struct bap_transport *bap = transport->data; - DBusMessageIter array; - - dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, - DBUS_TYPE_BYTE_AS_STRING, &array); - - if (bap->qos.bcast.bcode && bap->qos.bcast.bcode->iov_len) - dbus_message_iter_append_fixed_array(&array, DBUS_TYPE_BYTE, - &bap->qos.bcast.bcode->iov_base, - bap->qos.bcast.bcode->iov_len); - - dbus_message_iter_close_container(iter, &array); - return TRUE; -} - -static gboolean get_options(const GDBusPropertyTable *property, - DBusMessageIter *iter, void *data) -{ - struct media_transport *transport = data; - struct bap_transport *bap = transport->data; - - dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE, - &bap->qos.bcast.options); - - return TRUE; -} - -static gboolean get_skip(const GDBusPropertyTable *property, - DBusMessageIter *iter, void *data) -{ - struct media_transport *transport = data; - struct bap_transport *bap = transport->data; - - dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16, - &bap->qos.bcast.skip); - - return TRUE; -} - -static gboolean get_sync_timeout(const GDBusPropertyTable *property, - DBusMessageIter *iter, void *data) -{ - struct media_transport *transport = data; - struct bap_transport *bap = transport->data; - - dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16, - &bap->qos.bcast.sync_timeout); - - return TRUE; -} - -static gboolean get_sync_cte_type(const GDBusPropertyTable *property, - DBusMessageIter *iter, void *data) -{ - struct media_transport *transport = data; - struct bap_transport *bap = transport->data; - - dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE, - &bap->qos.bcast.sync_cte_type); - - return TRUE; -} - -static gboolean get_mse(const GDBusPropertyTable *property, - DBusMessageIter *iter, void *data) -{ - struct media_transport *transport = data; - struct bap_transport *bap = transport->data; - - dbus_message_iter_append_basic(iter, DBUS_TYPE_BYTE, - &bap->qos.bcast.mse); - - return TRUE; -} - -static gboolean get_timeout(const GDBusPropertyTable *property, - DBusMessageIter *iter, void *data) -{ - struct media_transport *transport = data; - struct bap_transport *bap = transport->data; - - dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16, - &bap->qos.bcast.timeout); - - return TRUE; + return bap->qos.ucast.io_qos.phy != 0x00; } static const GDBusPropertyTable bap_ucast_properties[] = { @@ -1205,15 +979,7 @@ static const GDBusPropertyTable bap_ucast_properties[] = { { "Codec", "y", get_codec }, { "Configuration", "ay", get_configuration }, { "State", "s", get_state }, - { "CIG", "y", get_cig, NULL, qos_exists }, - { "CIS", "y", get_cis, NULL, qos_exists }, - { "Interval", "u", get_interval, NULL, qos_exists }, - { "Framing", "b", get_framing, NULL, qos_exists }, - { "PHY", "y", get_phy, NULL, qos_exists }, - { "SDU", "q", get_sdu, NULL, qos_exists }, - { "Retransmissions", "y", get_retransmissions, NULL, qos_exists }, - { "Latency", "q", get_latency, NULL, qos_exists }, - { "Delay", "u", get_delay, NULL, qos_exists }, + { "QoS", "a{sv}", get_ucast_qos, NULL, qos_ucast_exists }, { "Endpoint", "o", get_endpoint, NULL, endpoint_exists }, { "Location", "u", get_location }, { "Metadata", "ay", get_metadata }, @@ -1221,6 +987,61 @@ static const GDBusPropertyTable bap_ucast_properties[] = { { } }; +static gboolean get_bcast_qos(const GDBusPropertyTable *property, + DBusMessageIter *iter, void *data) +{ + struct media_transport *transport = data; + struct bap_transport *bap = transport->data; + DBusMessageIter dict; + + dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, + DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING + DBUS_TYPE_STRING_AS_STRING + DBUS_TYPE_VARIANT_AS_STRING + DBUS_DICT_ENTRY_END_CHAR_AS_STRING, + &dict); + + dict_append_entry(&dict, "BIG", DBUS_TYPE_BYTE, + &bap->qos.bcast.big); + dict_append_entry(&dict, "BIS", DBUS_TYPE_BYTE, + &bap->qos.bcast.bis); + dict_append_entry(&dict, "SyncFactor", DBUS_TYPE_BYTE, + &bap->qos.bcast.sync_factor); + dict_append_entry(&dict, "Packing", DBUS_TYPE_BYTE, + &bap->qos.bcast.packing); + dict_append_entry(&dict, "Framing", DBUS_TYPE_BYTE, + &bap->qos.bcast.framing); + if (bap->qos.bcast.bcode) + dict_append_array(&dict, "BCode", DBUS_TYPE_BYTE, + &bap->qos.bcast.bcode->iov_base, + bap->qos.bcast.bcode->iov_len); + dict_append_entry(&dict, "Options", DBUS_TYPE_BYTE, + &bap->qos.bcast.options); + dict_append_entry(&dict, "Skip", DBUS_TYPE_UINT16, + &bap->qos.bcast.skip); + dict_append_entry(&dict, "SyncTimeout", DBUS_TYPE_UINT16, + &bap->qos.bcast.sync_timeout); + dict_append_entry(&dict, "SyncType", DBUS_TYPE_BYTE, + &bap->qos.bcast.sync_cte_type); + dict_append_entry(&dict, "MSE", DBUS_TYPE_BYTE, + &bap->qos.bcast.mse); + dict_append_entry(&dict, "Timeout", DBUS_TYPE_UINT16, + &bap->qos.bcast.timeout); + + append_io_qos(&dict, &bap->qos.bcast.io_qos); + + dbus_message_iter_close_container(iter, &dict); + + return TRUE; +} + +static gboolean qos_bcast_exists(const GDBusPropertyTable *property, void *data) +{ + struct media_transport *transport = data; + struct bap_transport *bap = transport->data; + + return bap->qos.bcast.io_qos.phy != 0x00; +} static const GDBusPropertyTable bap_bcast_properties[] = { { "Device", "o", get_device }, @@ -1228,17 +1049,7 @@ static const GDBusPropertyTable bap_bcast_properties[] = { { "Codec", "y", get_codec }, { "Configuration", "ay", get_configuration }, { "State", "s", get_state }, - { "BIG", "y", get_big, NULL, qos_exists }, - { "BIS", "y", get_bis, NULL, qos_exists }, - { "SyncInterval", "y", get_sync_interval, NULL, qos_exists }, - { "Packing", "y", get_packing, NULL, qos_exists }, - { "BCode", "ay", get_bcode, NULL, qos_exists }, - { "Options", "y", get_options, NULL, qos_exists }, - { "Skip", "q", get_skip, NULL, qos_exists }, - { "SyncTimeout", "q", get_sync_timeout, NULL, qos_exists }, - { "SyncCteType", "y", get_sync_cte_type, NULL, qos_exists }, - { "MSE", "y", get_mse, NULL, qos_exists }, - { "Timeout", "q", get_timeout, NULL, qos_exists }, + { "QoS", "a{sv}", get_bcast_qos, NULL, qos_bcast_exists }, { "Endpoint", "o", get_endpoint, NULL, endpoint_exists }, { "Location", "u", get_location }, { "Metadata", "ay", get_metadata }, @@ -1471,31 +1282,7 @@ static void bap_update_qos(const struct media_transport *transport) g_dbus_emit_property_changed(btd_get_dbus_connection(), transport->path, MEDIA_TRANSPORT_INTERFACE, - "CIG"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "CIS"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "Interval"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "Framing"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "PHY"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "SDU"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "Retransmissions"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "Latency"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "Delay"); + "QoS"); } static gboolean bap_resume_complete_cb(void *data) @@ -1538,55 +1325,7 @@ static void bap_update_bcast_qos(const struct media_transport *transport) g_dbus_emit_property_changed(btd_get_dbus_connection(), transport->path, MEDIA_TRANSPORT_INTERFACE, - "BIG"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "BIS"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "SyncInterval"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "Packing"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "Framing"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "BCode"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "Options"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "Skip"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "SyncTimeout"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "SyncCteType"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "MSE"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "Timeout"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "Interval"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "Latency"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "PHY"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "SDU"); - g_dbus_emit_property_changed(btd_get_dbus_connection(), - transport->path, MEDIA_TRANSPORT_INTERFACE, - "RTN"); + "QoS"); g_dbus_emit_property_changed(btd_get_dbus_connection(), transport->path, MEDIA_TRANSPORT_INTERFACE, "Codec"); diff --git a/src/shared/bap.h b/src/shared/bap.h index edb5c1bed27e..e4eae86502f3 100644 --- a/src/shared/bap.h +++ b/src/shared/bap.h @@ -75,7 +75,7 @@ struct bt_bap_ucast_qos { struct bt_bap_bcast_qos { uint8_t big; uint8_t bis; - uint8_t sync_interval; + uint8_t sync_factor; uint8_t packing; uint8_t framing; uint8_t encryption; diff --git a/src/shared/bass.c b/src/shared/bass.c index 86dab03e3993..37255aff64f3 100644 --- a/src/shared/bass.c +++ b/src/shared/bass.c @@ -102,7 +102,7 @@ static struct bt_iso_qos default_qos = { .bcast = { .big = BT_ISO_QOS_BIG_UNSET, .bis = BT_ISO_QOS_BIS_UNSET, - .sync_interval = 0x07, + .sync_factor = 0x07, .packing = 0x00, .framing = 0x00, .in = DEFAULT_IO_QOS, diff --git a/tools/iso-tester.c b/tools/iso-tester.c index 410da2c930ac..a392a06ebcb3 100644 --- a/tools/iso-tester.c +++ b/tools/iso-tester.c @@ -241,7 +241,7 @@ .bcast = { \ .big = _big, \ .bis = _bis, \ - .sync_interval = 0x07, \ + .sync_factor = 0x07, \ .packing = 0x00, \ .framing = 0x00, \ .in = _in, \ @@ -1676,9 +1676,9 @@ static bool check_bcast_qos(const struct bt_iso_qos *qos1, return false; } - if (qos1->bcast.sync_interval != qos2->bcast.sync_interval) { + if (qos1->bcast.sync_factor != qos2->bcast.sync_factor) { tester_warn("Unexpected QoS sync interval: 0x%02x != 0x%02x", - qos1->bcast.sync_interval, qos2->bcast.sync_interval); + qos1->bcast.sync_factor, qos2->bcast.sync_factor); return false; } diff --git a/tools/isotest.c b/tools/isotest.c index 68729d97730e..234e4f1b0453 100644 --- a/tools/isotest.c +++ b/tools/isotest.c @@ -1028,7 +1028,7 @@ static void multy_connect_mode(char *peer) .bcast = { \ .big = BT_ISO_QOS_BIG_UNSET, \ .bis = BT_ISO_QOS_BIS_UNSET, \ - .sync_interval = 0x07, \ + .sync_factor = 0x07, \ .packing = 0x00, \ .framing = 0x00, \ .out = QOS_IO(_interval, _latency, _sdu, _phy, _rtn), \ From patchwork Wed Sep 27 21:53:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 726739 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1F0D9E7F14F for ; Wed, 27 Sep 2023 21:54:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229816AbjI0VyE (ORCPT ); Wed, 27 Sep 2023 17:54:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42442 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229458AbjI0VyD (ORCPT ); Wed, 27 Sep 2023 17:54:03 -0400 Received: from mail-il1-x136.google.com (mail-il1-x136.google.com [IPv6:2607:f8b0:4864:20::136]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2614EAF for ; Wed, 27 Sep 2023 14:54:02 -0700 (PDT) Received: by mail-il1-x136.google.com with SMTP id e9e14a558f8ab-3512f905f6cso28704995ab.3 for ; Wed, 27 Sep 2023 14:54:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1695851641; x=1696456441; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=FOmbSCSuxl/iBoDJgSbUBLhFhdtVyCAjbkktwlieTt8=; b=CEyWEotAFtiLJkZ9nbF191rPap+7rFPV9hMTnsbXvLU/MX8z8ZJFlLLOsg3DUow5pU WIQcDD5jGQHMGm0brw0J0n1nybdsBCXbaCxfQiEjcZr8N5uA/RU6KiD4eG0kxiFFL0s7 RySfkku3ksSQopDQ6oN5DqRcg+P03LtMbSnPssV7SSInZc75YqRYl0kWEn2Wl+t+yJ9I pZHLASJdYPEgHkEBrnLhuM+cSDD9rS0Z5RmiDljvtfqtia/c54BjzNibma8nqnK26DQN Uzup99UnTVmhNKTcBYj8tBvnFb83HzxoKqbdw0vyZbZMCxa5zXoYi83vHh8g0E4SfFXm DwpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695851641; x=1696456441; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=FOmbSCSuxl/iBoDJgSbUBLhFhdtVyCAjbkktwlieTt8=; b=Rjo9FT99CUpgsyDVQtR0e/IrbyB+4cHV7rLIzOw5rIgtKvgtdjpzjhdFQ4XZEt+WIA EAEMM37nhULOhb+A619y17Bzm8fr54CY7dJw1HSSZud4vuOasn8A7rp67meBOZaCPrS+ /xhP4HekWf2jvF4c88W4hIXkE5KuKfRtkGdVQgm5CSbLpqKgmLmyW/wCyouJqNNSpain Ex2z+ngHurriAir3uriGFe+cfHjfFgTPfaj6JL3CFRdaorbswlvlqenJRKsZt7yFmhyJ 7CqN/FrriXMBKM5zuipUxxFw3x3hkLx7V61tT373erZMs+rwB5He9CKDZSivniZbiPWI zFEA== X-Gm-Message-State: AOJu0YybRZWyfhGKsWygca/CYeXQQs3vRSpywzuldUkTLqIUflp7TwjN VJ3MHUHexqTEAnLivcHMppL+QolYHaqa6ShQ X-Google-Smtp-Source: AGHT+IF5pkNgmNiAAuzxmgWLKVbWWAJu5OR1ZTPbmpRPUJQyahYFxgu9HS5sLiyPd5nVXS7SLvHn2A== X-Received: by 2002:a05:6e02:13f0:b0:34f:6837:6ab7 with SMTP id w16-20020a056e0213f000b0034f68376ab7mr3167020ilj.16.1695851640695; Wed, 27 Sep 2023 14:54:00 -0700 (PDT) Received: from lvondent-mobl4.. (c-98-232-221-87.hsd1.or.comcast.net. [98.232.221.87]) by smtp.gmail.com with ESMTPSA id g15-20020a02cd0f000000b0042bbfe3dc42sm4225331jaq.173.2023.09.27.14.53.58 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Sep 2023 14:53:58 -0700 (PDT) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH v4 03/12] client: Make transport.show to print QoS configuration Date: Wed, 27 Sep 2023 14:53:45 -0700 Message-ID: <20230927215354.1874835-3-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230927215354.1874835-1-luiz.dentz@gmail.com> References: <20230927215354.1874835-1-luiz.dentz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz This makes transport.show to print QoS configuration since it is now a single property: transport.show Transport /org/bluez/hci0/dev_00_AA_01_01_00_03/pac_sink0/fd1 UUID: 00002bcb-0000-1000-8000-00805f9b34fb Codec: 0x06 (6) Configuration: 02 01 03 02 02 01 03 04 28 00 ........(. Device: /org/bluez/hci0/dev_00_AA_01_01_00_03 State: idle Endpoint: /org/bluez/hci0/dev_00_AA_01_01_00_03/pac_sink0 QoS Key: CIG QoS Value: 0x00 (0) QoS Key: CIS QoS Value: 0x00 (0) QoS Key: Framing QoS Value: 0x00 (0) QoS Key: PresentationDelay QoS Value: 0x00009c40 (40000) QoS Key: Interval QoS Value: 0x00002710 (10000) QoS Key: Latency QoS Value: 0x000a (10) QoS Key: SDU QoS Value: 0x0028 (40) QoS Key: PHY QoS Value: 0x02 (2) QoS Key: Retransmissions QoS Value: 0x02 (2) Location: 0x00000003 (3) Links: /org/bluez/hci0/dev_00_AA_01_01_00_03/pac_source0/fd0 --- client/player.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/client/player.c b/client/player.c index fdc27c281ed8..d72ad6a5da01 100644 --- a/client/player.c +++ b/client/player.c @@ -3799,11 +3799,7 @@ static void cmd_show_transport(int argc, char *argv[]) print_property(proxy, "Volume"); print_property(proxy, "Endpoint"); - print_property(proxy, "Interval"); - print_property(proxy, "Framing"); - print_property(proxy, "SDU"); - print_property(proxy, "Retransmissions"); - print_property(proxy, "Latency"); + print_property(proxy, "QoS"); print_property(proxy, "Location"); print_property(proxy, "Metadata"); print_property(proxy, "Links"); From patchwork Wed Sep 27 21:53:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 728235 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 90782E7109E for ; Wed, 27 Sep 2023 21:54:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229779AbjI0VyG (ORCPT ); Wed, 27 Sep 2023 17:54:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42472 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229517AbjI0VyF (ORCPT ); Wed, 27 Sep 2023 17:54:05 -0400 Received: from mail-io1-xd35.google.com (mail-io1-xd35.google.com [IPv6:2607:f8b0:4864:20::d35]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B1D9110A for ; Wed, 27 Sep 2023 14:54:03 -0700 (PDT) Received: by mail-io1-xd35.google.com with SMTP id ca18e2360f4ac-79fa416b7ffso373207239f.2 for ; Wed, 27 Sep 2023 14:54:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1695851642; x=1696456442; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=pCOAwzZquIAA6I0LJRrSHC+IC23oO0R9zJDyQaULYio=; b=WmWcO9Xf3CjcuiZW2L6R41JrY8uZZJ87exiOKtNQchrHy+pL26SWlh5eFWIqx/z9Ne etTr9jg7+UhpZl3JGQXqLFGp6xNbDEKwREdWx3DBhCxUiMboXeb8AWHwlP9H1Ji8uuAh 0R+WxjHUSqCL2YTVcWUuBMFgiUVFAvOp/eFqdWm+UDgyrRa+PHycqWgpK35Uweq5fe0N kN8+UxYzKe+jRFBgftwebAVfGvnC/HIJSWyXQ1zKOz9eTNiOjtKX6tehUK1n7eGkkCmz 6JIUbw3rxkd6FgNkY5ta9kbRQa+HqPt6j5b0j2M/5AKpNnH0PaqsNghIhVcZKddvAWsb qt0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695851642; x=1696456442; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=pCOAwzZquIAA6I0LJRrSHC+IC23oO0R9zJDyQaULYio=; b=QijMxXmQnNHn3RiROUB6eneXSfSIj9KVx4k3vIR567jpDjQ3EAJ1iUgeNm5zCK/4Z6 ToyNxIQkwjWlz9zMDBDKWFCCY5GJtlrKzW5bB1kvbZp1exxCTCuX00ylpImeV8mkX/Vz kGfeKSdDLgG+IOe5HgcbpNfVw7X/FlLh7bECs3IfFc8F1mxra5bFR8EeFAMHcCntlR9J oXdjdj9QQLTb9xKUcpntCrg+q8fhj+QGIRljHybhDX5l15TYu6/qyruJnrFvh2Cz7HHR eDAjgNCdZ6EoYBOgsgRjxN70H1TlXXfyVcG6xh8tUH+8huRImM8EEHiYC91LxytPMvaJ NjKw== X-Gm-Message-State: AOJu0Yyy4o2NLFzodKoWGhxOZ59AgiaOPGJmxUM+z5DrJdPIyzJXwiZX pZ0Nbt//fzW22HYilEzIgXnnZXPpkF9zi/0f X-Google-Smtp-Source: AGHT+IEUZfiwCEPp3CZ6/O1IdPCP5OnfLc/g9vvYEwwaUPzn4/RARD0Gfs3kdN8yiicXTgkvNSL3UQ== X-Received: by 2002:a6b:dd14:0:b0:784:314f:8d68 with SMTP id f20-20020a6bdd14000000b00784314f8d68mr3285093ioc.1.1695851642182; Wed, 27 Sep 2023 14:54:02 -0700 (PDT) Received: from lvondent-mobl4.. (c-98-232-221-87.hsd1.or.comcast.net. [98.232.221.87]) by smtp.gmail.com with ESMTPSA id g15-20020a02cd0f000000b0042bbfe3dc42sm4225331jaq.173.2023.09.27.14.54.00 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Sep 2023 14:54:01 -0700 (PDT) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH v4 04/12] media: Implement QoS property Date: Wed, 27 Sep 2023 14:53:46 -0700 Message-ID: <20230927215354.1874835-4-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230927215354.1874835-1-luiz.dentz@gmail.com> References: <20230927215354.1874835-1-luiz.dentz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz This implements QoS as a dict instead of listing each field as a individual property. --- profiles/audio/bap.c | 15 +--- profiles/audio/media.c | 159 ++++++++++++++++++++++++----------------- profiles/audio/media.h | 3 +- 3 files changed, 96 insertions(+), 81 deletions(-) diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c index b05d7a2d9675..ed02db40be8c 100644 --- a/profiles/audio/bap.c +++ b/profiles/audio/bap.c @@ -457,19 +457,10 @@ static int parse_properties(DBusMessageIter *props, struct iovec **caps, framing = val; } else if (!strcasecmp(key, "PHY")) { - const char *str; - - if (var != DBUS_TYPE_STRING) + if (var != DBUS_TYPE_BYTE) goto fail; - dbus_message_iter_get_basic(&value, &str); - - if (!strcasecmp(str, "1M")) - io_qos.phy = 0x01; - else if (!strcasecmp(str, "2M")) - io_qos.phy = 0x02; - else - goto fail; + dbus_message_iter_get_basic(&value, &io_qos.phy); } else if (!strcasecmp(key, "SDU")) { if (var != DBUS_TYPE_UINT16) goto fail; @@ -546,7 +537,7 @@ static int parse_properties(DBusMessageIter *props, struct iovec **caps, dbus_message_iter_get_basic(&value, &qos->bcast.timeout); - } else if (!strcasecmp(key, "BroadcastCode")) { + } else if (!strcasecmp(key, "BCode")) { if (var != DBUS_TYPE_ARRAY) goto fail; parse_array(&value, &qos->bcast.bcode); diff --git a/profiles/audio/media.c b/profiles/audio/media.c index 66f512e007e4..8345487d7a45 100644 --- a/profiles/audio/media.c +++ b/profiles/audio/media.c @@ -743,15 +743,100 @@ static int parse_array(DBusMessageIter *iter, struct iovec *iov) return 0; } +static int parse_ucast_qos(DBusMessageIter *iter, struct bt_bap_qos *qos) +{ + DBusMessageIter array; + const char *key; + struct bt_bap_io_qos io_qos; + + dbus_message_iter_recurse(iter, &array); + + memset(&io_qos, 0, sizeof(io_qos)); + while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_DICT_ENTRY) { + DBusMessageIter value, entry; + int var; + + dbus_message_iter_recurse(&array, &entry); + dbus_message_iter_get_basic(&entry, &key); + + dbus_message_iter_next(&entry); + dbus_message_iter_recurse(&entry, &value); + + var = dbus_message_iter_get_arg_type(&value); + + if (!strcasecmp(key, "CIG")) { + if (var != DBUS_TYPE_BYTE) + goto fail; + + dbus_message_iter_get_basic(&value, &qos->ucast.cig_id); + } else if (!strcasecmp(key, "CIS")) { + if (var != DBUS_TYPE_BYTE) + goto fail; + + dbus_message_iter_get_basic(&value, &qos->ucast.cis_id); + } else if (!strcasecmp(key, "Interval")) { + if (var != DBUS_TYPE_UINT32) + goto fail; + + dbus_message_iter_get_basic(&value, &io_qos.interval); + } else if (!strcasecmp(key, "Framing")) { + if (var != DBUS_TYPE_BYTE) + goto fail; + + dbus_message_iter_get_basic(&value, + &qos->ucast.framing); + } else if (!strcasecmp(key, "PHY")) { + if (var != DBUS_TYPE_BYTE) + goto fail; + + dbus_message_iter_get_basic(&value, &io_qos.phy); + } else if (!strcasecmp(key, "SDU")) { + if (var != DBUS_TYPE_UINT16) + goto fail; + + dbus_message_iter_get_basic(&value, &io_qos.sdu); + } else if (!strcasecmp(key, "Retransmissions")) { + if (var != DBUS_TYPE_BYTE) + goto fail; + + dbus_message_iter_get_basic(&value, &io_qos.rtn); + } else if (!strcasecmp(key, "Latency")) { + if (var != DBUS_TYPE_UINT16) + goto fail; + + dbus_message_iter_get_basic(&value, &io_qos.latency); + } else if (!strcasecmp(key, "PresentationDelay")) { + if (var != DBUS_TYPE_UINT32) + goto fail; + + dbus_message_iter_get_basic(&value, &qos->ucast.delay); + } else if (!strcasecmp(key, "TargetLatency")) { + if (var != DBUS_TYPE_BYTE) + goto fail; + + dbus_message_iter_get_basic(&value, + &qos->ucast.target_latency); + } + + dbus_message_iter_next(&array); + } + + memcpy(&qos->ucast.io_qos, &io_qos, sizeof(io_qos)); + + return 0; + +fail: + DBG("Failed parsing %s", key); + + return -EINVAL; +} + static int parse_select_properties(DBusMessageIter *props, struct iovec *caps, struct iovec *metadata, struct bt_bap_qos *qos) { const char *key; - struct bt_bap_io_qos io_qos; - uint8_t framing = 0; - memset(&io_qos, 0, sizeof(io_qos)); while (dbus_message_iter_get_arg_type(props) == DBUS_TYPE_DICT_ENTRY) { DBusMessageIter value, entry; int var; @@ -776,77 +861,17 @@ static int parse_select_properties(DBusMessageIter *props, struct iovec *caps, if (parse_array(&value, metadata)) goto fail; - } else if (!strcasecmp(key, "CIG")) { - if (var != DBUS_TYPE_BYTE) + } else if (!strcasecmp(key, "QoS")) { + if (var != DBUS_TYPE_ARRAY) goto fail; - dbus_message_iter_get_basic(&value, &qos->ucast.cig_id); - } else if (!strcasecmp(key, "CIS")) { - if (var != DBUS_TYPE_BYTE) + if (parse_ucast_qos(&value, qos)) goto fail; - - dbus_message_iter_get_basic(&value, &qos->ucast.cis_id); - } else if (!strcasecmp(key, "Interval")) { - if (var != DBUS_TYPE_UINT32) - goto fail; - - dbus_message_iter_get_basic(&value, &io_qos.interval); - } else if (!strcasecmp(key, "Framing")) { - dbus_bool_t val; - - if (var != DBUS_TYPE_BOOLEAN) - goto fail; - - dbus_message_iter_get_basic(&value, &val); - - framing = val; - } else if (!strcasecmp(key, "PHY")) { - const char *str; - - if (var != DBUS_TYPE_STRING) - goto fail; - - dbus_message_iter_get_basic(&value, &str); - - if (!strcasecmp(str, "1M")) - io_qos.phy = 0x01; - else if (!strcasecmp(str, "2M")) - io_qos.phy = 0x02; - else - goto fail; - } else if (!strcasecmp(key, "SDU")) { - if (var != DBUS_TYPE_UINT16) - goto fail; - - dbus_message_iter_get_basic(&value, &io_qos.sdu); - } else if (!strcasecmp(key, "Retransmissions")) { - if (var != DBUS_TYPE_BYTE) - goto fail; - - dbus_message_iter_get_basic(&value, &io_qos.rtn); - } else if (!strcasecmp(key, "Latency")) { - if (var != DBUS_TYPE_UINT16) - goto fail; - - dbus_message_iter_get_basic(&value, &io_qos.latency); - } else if (!strcasecmp(key, "Delay")) { - if (var != DBUS_TYPE_UINT32) - goto fail; - - dbus_message_iter_get_basic(&value, &qos->ucast.delay); - } else if (!strcasecmp(key, "TargetLatency")) { - if (var != DBUS_TYPE_BYTE) - goto fail; - - dbus_message_iter_get_basic(&value, - &qos->ucast.target_latency); } dbus_message_iter_next(props); } - memcpy(&qos->ucast.io_qos, &io_qos, sizeof(io_qos)); - qos->ucast.framing = framing; return 0; fail: @@ -1549,7 +1574,7 @@ static int parse_properties(DBusMessageIter *props, const char **uuid, if (var != DBUS_TYPE_BYTE) return -EINVAL; dbus_message_iter_get_basic(&value, &qos->phy); - } else if (strcasecmp(key, "RTN") == 0) { + } else if (strcasecmp(key, "Retransmissions") == 0) { if (var != DBUS_TYPE_BYTE) return -EINVAL; dbus_message_iter_get_basic(&value, &qos->rtn); diff --git a/profiles/audio/media.h b/profiles/audio/media.h index 0eeb5746a4fa..2b579877ba34 100644 --- a/profiles/audio/media.h +++ b/profiles/audio/media.h @@ -22,6 +22,5 @@ const char *media_endpoint_get_uuid(struct media_endpoint *endpoint); uint8_t media_endpoint_get_codec(struct media_endpoint *endpoint); struct btd_adapter *media_endpoint_get_btd_adapter( struct media_endpoint *endpoint); -bool media_endpoint_is_broadcast( - struct media_endpoint *endpoint); +bool media_endpoint_is_broadcast(struct media_endpoint *endpoint); int8_t media_player_get_device_volume(struct btd_device *device); From patchwork Wed Sep 27 21:53:47 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 726738 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 57C39E7F14F for ; Wed, 27 Sep 2023 21:54:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229846AbjI0VyI (ORCPT ); Wed, 27 Sep 2023 17:54:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37996 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229517AbjI0VyH (ORCPT ); Wed, 27 Sep 2023 17:54:07 -0400 Received: from mail-il1-x135.google.com (mail-il1-x135.google.com [IPv6:2607:f8b0:4864:20::135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7A5DEFB for ; Wed, 27 Sep 2023 14:54:05 -0700 (PDT) Received: by mail-il1-x135.google.com with SMTP id e9e14a558f8ab-351365e47f6so26040465ab.1 for ; Wed, 27 Sep 2023 14:54:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1695851644; x=1696456444; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=7LYirlf9dOaUzJulMGXdd1bw4TsoU8BSK/GBa/WWho8=; b=LlKPycqyf3zV2gOrDsiOivhFrRu2Vs75JnIZEA+nJjRM90tdoew+61pYl/yCp7c4na aDD38I++knlSQnAR7lbZbTq44OKi2J6jMezHT2MCX1L47KCog5fL8zCy/PpUBHdCxUmA Vk8KUlZPqh3YnLGp2H9MdHQlYu9zohzvvloqOWRA2c3D70W94WVxhTheyKkoTs/zxm+0 1UDsbiSFQ8ImdDJ5LuLWG3+JVr1YJAgsgV6Mk0DTokVKvxpPZN5/+mxeoPl4a/h+WyJO fR23qyyhvLhOFuqFJAUMDQ0qn71kNukbBuik1QW3cbCijqNHcjmBo4cExSBBsCfexGEa /Rdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695851644; x=1696456444; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7LYirlf9dOaUzJulMGXdd1bw4TsoU8BSK/GBa/WWho8=; b=Xb4B+klSz3zESDk95aKf/j43DUoNfFIzCTxASoutjFZFUZcTwbyneTkcmDWqH0hBUy O+f5G0Lk+WhXczVjvXMgFhzo/oAL/TA1KvQok3foq6z9X25+1v7kRBoSXa/xoX+4NFId JaCeeDj6KtP9GG0qwgvAyXKMTgQpTYWRukcyBEM8NKVfoscb5kTKvfxuA86zXR2KwBEg HxbjsvIklMysoChHPnJ8yyfd09N+m5Hsf3+VbkbmUQovZFhEcWG/4CWwVCihRgpszkvh LjC6WnPBzwy4bUSubYMHbB9NDXvCulmuXZM00V8WvkBHpD0OReExojP0mwodDXAnlkiT CcGA== X-Gm-Message-State: AOJu0Yx9IocQ0nQZqc+7hVe6d6q2CKKZO2Bep81oOjEZQLjncm3nxlBk yjNf64k8gcEv2uyAtMos9Eev+Jm3qJJOEZcs X-Google-Smtp-Source: AGHT+IESa7nKrF1Kl5wZegFhe/Lz0rCPyGOiMgZXyKG8SsUNmJA5F1Lkxw42NkZu50ifgiPR1nH1ig== X-Received: by 2002:a92:cc82:0:b0:34f:fdbd:244a with SMTP id x2-20020a92cc82000000b0034ffdbd244amr2762212ilo.32.1695851643857; Wed, 27 Sep 2023 14:54:03 -0700 (PDT) Received: from lvondent-mobl4.. (c-98-232-221-87.hsd1.or.comcast.net. [98.232.221.87]) by smtp.gmail.com with ESMTPSA id g15-20020a02cd0f000000b0042bbfe3dc42sm4225331jaq.173.2023.09.27.14.54.02 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Sep 2023 14:54:02 -0700 (PDT) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH v4 05/12] client: Make Endpoint.SelectProperties reply properly Date: Wed, 27 Sep 2023 14:53:47 -0700 Message-ID: <20230927215354.1874835-5-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230927215354.1874835-1-luiz.dentz@gmail.com> References: <20230927215354.1874835-1-luiz.dentz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz This makes Endpoint.SelectProperties reply with QoS property since it is now a single property. --- client/player.c | 316 +++++++++++++++++++++++++++--------------------- client/print.c | 16 ++- 2 files changed, 188 insertions(+), 144 deletions(-) diff --git a/client/player.c b/client/player.c index d72ad6a5da01..6953eff28543 100644 --- a/client/player.c +++ b/client/player.c @@ -1199,7 +1199,7 @@ static const struct capabilities { struct codec_qos { uint32_t interval; uint8_t framing; - char *phy; + uint8_t phy; uint16_t sdu; uint8_t rtn; uint16_t latency; @@ -1274,22 +1274,22 @@ static struct codec_preset sbc_presets[] = { QOS_CONFIG(_interval, 0x01, _phy, _sdu, _rtn, _latency, _delay) #define QOS_UNFRAMED_1M(_interval, _sdu, _rtn, _latency, _delay) \ - QOS_UNFRAMED(_interval, "1M", _sdu, _rtn, _latency, _delay) \ + QOS_UNFRAMED(_interval, 0x01, _sdu, _rtn, _latency, _delay) \ #define QOS_FRAMED_1M(_interval, _sdu, _rtn, _latency, _delay) \ - QOS_FRAMED(_interval, "1M", _sdu, _rtn, _latency, _delay) \ + QOS_FRAMED(_interval, 0x01, _sdu, _rtn, _latency, _delay) \ #define QOS_UNFRAMED_2M(_interval, _sdu, _rtn, _latency, _delay) \ - QOS_UNFRAMED(_interval, "2M", _sdu, _rtn, _latency, _delay) \ + QOS_UNFRAMED(_interval, 0x02, _sdu, _rtn, _latency, _delay) \ #define QOS_FRAMED_2M(_interval, _sdu, _rtn, _latency, _delay) \ - QOS_FRAMED(_interval, "2M", _sdu, _rtn, _latency, _delay) \ + QOS_FRAMED(_interval, 0x02, _sdu, _rtn, _latency, _delay) \ #define LC3_7_5_UNFRAMED(_sdu, _rtn, _latency, _delay) \ - QOS_UNFRAMED(7500u, "2M", _sdu, _rtn, _latency, _delay) + QOS_UNFRAMED(7500u, 0x02, _sdu, _rtn, _latency, _delay) #define LC3_7_5_FRAMED(_sdu, _rtn, _latency, _delay) \ - QOS_FRAMED(7500u, "2M", _sdu, _rtn, _latency, _delay) + QOS_FRAMED(7500u, 0x02, _sdu, _rtn, _latency, _delay) #define LC3_10_UNFRAMED(_sdu, _rtn, _latency, _delay) \ QOS_UNFRAMED_2M(10000u, _sdu, _rtn, _latency, _delay) @@ -1770,14 +1770,174 @@ static struct bt_iso_qos bcast_qos = { } }; +static void append_io_qos(DBusMessageIter *iter, struct endpoint_config *cfg) +{ + struct codec_qos *qos = (void *)cfg->qos; + + bt_shell_printf("Interval %u\n", qos->interval); + + g_dbus_dict_append_entry(iter, "Interval", DBUS_TYPE_UINT32, + &qos->interval); + + bt_shell_printf("PHY 0x%02x\n", qos->phy); + + g_dbus_dict_append_entry(iter, "PHY", DBUS_TYPE_BYTE, &qos->phy); + + bt_shell_printf("SDU %u\n", cfg->qos->sdu); + + g_dbus_dict_append_entry(iter, "SDU", DBUS_TYPE_UINT16, &qos->sdu); + + bt_shell_printf("Retransmissions %u\n", qos->rtn); + + g_dbus_dict_append_entry(iter, "Retransmissions", + DBUS_TYPE_BYTE, &qos->rtn); + + bt_shell_printf("Latency %u\n", qos->latency); + + g_dbus_dict_append_entry(iter, "Latency", + DBUS_TYPE_UINT16, &qos->latency); +} + +static void append_ucast_qos(DBusMessageIter *iter, struct endpoint_config *cfg) +{ + struct codec_qos *qos = (void *)cfg->qos; + + if (cfg->ep->iso_group != BT_ISO_QOS_GROUP_UNSET) { + bt_shell_printf("CIG 0x%2.2x\n", cfg->ep->iso_group); + g_dbus_dict_append_entry(iter, "CIG", DBUS_TYPE_BYTE, + &cfg->ep->iso_group); + } + + if (cfg->ep->iso_stream != BT_ISO_QOS_STREAM_UNSET) { + bt_shell_printf("CIS 0x%2.2x\n", cfg->ep->iso_stream); + g_dbus_dict_append_entry(iter, "CIS", DBUS_TYPE_BYTE, + &cfg->ep->iso_stream); + } + + bt_shell_printf("Framing 0x%02x\n", qos->framing); + + g_dbus_dict_append_entry(iter, "Framing", DBUS_TYPE_BYTE, + &qos->framing); + + bt_shell_printf("PresentationDelay %u\n", qos->delay); + + g_dbus_dict_append_entry(iter, "PresentationDelay", + DBUS_TYPE_UINT32, &qos->delay); + + if (cfg->target_latency) { + bt_shell_printf("TargetLatency 0x%02x\n", cfg->target_latency); + g_dbus_dict_append_entry(iter, "TargetLatency", + DBUS_TYPE_BYTE, &cfg->target_latency); + } + + append_io_qos(iter, cfg); +} + +static void append_bcast_qos(DBusMessageIter *iter, struct endpoint_config *cfg) +{ + if (bcast_qos.bcast.big != BT_ISO_QOS_BIG_UNSET) { + bt_shell_printf("BIG 0x%2.2x\n", bcast_qos.bcast.big); + g_dbus_dict_append_entry(iter, "BIG", DBUS_TYPE_BYTE, + &bcast_qos.bcast.big); + } + + if (bcast_qos.bcast.bis != BT_ISO_QOS_BIS_UNSET) { + bt_shell_printf("BIS 0x%2.2x\n", bcast_qos.bcast.bis); + g_dbus_dict_append_entry(iter, "BIS", DBUS_TYPE_BYTE, + &bcast_qos.bcast.bis); + } + + bt_shell_printf("Framing 0x%02x\n", bcast_qos.bcast.framing); + + g_dbus_dict_append_entry(iter, "Framing", DBUS_TYPE_BYTE, + &bcast_qos.bcast.framing); + + bt_shell_printf("SyncFactor %u\n", bcast_qos.bcast.sync_factor); + + g_dbus_dict_append_entry(iter, "SyncFactor", DBUS_TYPE_BYTE, + &bcast_qos.bcast.sync_factor); + + bt_shell_printf("Options %u\n", bcast_qos.bcast.options); + + g_dbus_dict_append_entry(iter, "Options", DBUS_TYPE_BYTE, + &bcast_qos.bcast.options); + + bt_shell_printf("Skip %u\n", bcast_qos.bcast.skip); + + g_dbus_dict_append_entry(iter, "Skip", DBUS_TYPE_UINT16, + &bcast_qos.bcast.skip); + + bt_shell_printf("SyncTimeout %u\n", bcast_qos.bcast.sync_timeout); + + g_dbus_dict_append_entry(iter, "SyncTimeout", DBUS_TYPE_UINT16, + &bcast_qos.bcast.sync_timeout); + + bt_shell_printf("SyncCteType %u\n", bcast_qos.bcast.sync_cte_type); + + g_dbus_dict_append_entry(iter, "SyncType", DBUS_TYPE_BYTE, + &bcast_qos.bcast.sync_cte_type); + + bt_shell_printf("MSE %u\n", bcast_qos.bcast.mse); + + g_dbus_dict_append_entry(iter, "MSE", DBUS_TYPE_BYTE, + &bcast_qos.bcast.mse); + + bt_shell_printf("Timeout %u\n", bcast_qos.bcast.timeout); + + g_dbus_dict_append_entry(iter, "Timeout", DBUS_TYPE_UINT16, + &bcast_qos.bcast.timeout); + + if (cfg->ep->bcode) { + const char *key = "BCode"; + + bt_shell_printf("BCode:\n"); + bt_shell_hexdump(cfg->ep->bcode->iov_base, + cfg->ep->bcode->iov_len); + + g_dbus_dict_append_basic_array(iter, DBUS_TYPE_STRING, + &key, DBUS_TYPE_BYTE, + &cfg->ep->bcode->iov_base, + cfg->ep->bcode->iov_len); + } + + append_io_qos(iter, cfg); +} + +static void append_qos(DBusMessageIter *iter, struct endpoint_config *cfg) +{ + DBusMessageIter entry, var, dict; + struct codec_qos *qos = (void *)cfg->qos; + const char *key = "QoS"; + + if (!qos) + return; + + dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY, + NULL, &entry); + + dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key); + + dbus_message_iter_open_container(&entry, DBUS_TYPE_VARIANT, + "a{sv}", &var); + + dbus_message_iter_open_container(&var, DBUS_TYPE_ARRAY, "{sv}", + &dict); + + if (cfg->ep->broadcast) + append_bcast_qos(&dict, cfg); + else + append_ucast_qos(&dict, cfg); + + dbus_message_iter_close_container(&var, &dict); + dbus_message_iter_close_container(&entry, &var); + dbus_message_iter_close_container(iter, &entry); +} + static void append_properties(DBusMessageIter *iter, struct endpoint_config *cfg) { DBusMessageIter dict; - struct codec_qos *qos = (void *)cfg->qos; const char *key = "Capabilities"; - const char *meta = "Metadata"; - const char *keyBCode = "BroadcastCode"; dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, "{sv}", &dict); @@ -1789,6 +1949,8 @@ static void append_properties(DBusMessageIter *iter, cfg->caps->iov_len); if (cfg->meta && cfg->meta->iov_len) { + const char *meta = "Metadata"; + g_dbus_dict_append_basic_array(&dict, DBUS_TYPE_STRING, &meta, DBUS_TYPE_BYTE, &cfg->meta->iov_base, cfg->meta->iov_len); @@ -1797,132 +1959,8 @@ static void append_properties(DBusMessageIter *iter, bt_shell_hexdump(cfg->meta->iov_base, cfg->meta->iov_len); } - if (!qos) - goto done; + append_qos(&dict, cfg); - if (cfg->target_latency) { - bt_shell_printf("TargetLatency 0x%02x\n", qos->interval); - g_dbus_dict_append_entry(&dict, "TargetLatency", - DBUS_TYPE_BYTE, &cfg->target_latency); - } - - if ((!cfg->ep->broadcast) && - (cfg->ep->iso_group != BT_ISO_QOS_GROUP_UNSET)) { - bt_shell_printf("CIG 0x%2.2x\n", cfg->ep->iso_group); - g_dbus_dict_append_entry(&dict, "CIG", DBUS_TYPE_BYTE, - &cfg->ep->iso_group); - } else { - bt_shell_printf("BIG 0x%2.2x\n", bcast_qos.bcast.big); - g_dbus_dict_append_entry(&dict, "BIG", DBUS_TYPE_BYTE, - &bcast_qos.bcast.big); - } - - if ((!cfg->ep->broadcast) && - (cfg->ep->iso_stream != BT_ISO_QOS_STREAM_UNSET)) { - bt_shell_printf("CIS 0x%2.2x\n", cfg->ep->iso_stream); - g_dbus_dict_append_entry(&dict, "CIS", DBUS_TYPE_BYTE, - &cfg->ep->iso_stream); - - } else { - bt_shell_printf("BIS 0x%2.2x\n", bcast_qos.bcast.bis); - g_dbus_dict_append_entry(&dict, "BIS", DBUS_TYPE_BYTE, - &bcast_qos.bcast.bis); - } - - bt_shell_printf("Interval %u\n", qos->interval); - - g_dbus_dict_append_entry(&dict, "Interval", DBUS_TYPE_UINT32, - &qos->interval); - - if (!cfg->ep->broadcast) { - bt_shell_printf("Framing %s\n", - qos->framing ? "true" : "false"); - - g_dbus_dict_append_entry(&dict, "Framing", DBUS_TYPE_BOOLEAN, - &qos->framing); - } else { - bt_shell_printf("Framing %s\n", - bcast_qos.bcast.framing ? "true" : "false"); - - g_dbus_dict_append_entry(&dict, "Framing", DBUS_TYPE_BOOLEAN, - &bcast_qos.bcast.framing); - } - - bt_shell_printf("PHY %s\n", qos->phy); - - g_dbus_dict_append_entry(&dict, "PHY", DBUS_TYPE_STRING, &qos->phy); - - bt_shell_printf("SDU %u\n", cfg->qos->sdu); - - g_dbus_dict_append_entry(&dict, "SDU", DBUS_TYPE_UINT16, &qos->sdu); - - bt_shell_printf("Retransmissions %u\n", qos->rtn); - - g_dbus_dict_append_entry(&dict, "Retransmissions", DBUS_TYPE_BYTE, - &qos->rtn); - - bt_shell_printf("Latency %u\n", qos->latency); - - g_dbus_dict_append_entry(&dict, "Latency", DBUS_TYPE_UINT16, - &qos->latency); - - bt_shell_printf("Delay %u\n", qos->delay); - - g_dbus_dict_append_entry(&dict, "Delay", DBUS_TYPE_UINT32, - &qos->delay); - - if (!cfg->ep->broadcast) - goto done; - - bt_shell_printf("SyncInterval %u\n", bcast_qos.bcast.sync_factor); - - g_dbus_dict_append_entry(&dict, "SyncInterval", DBUS_TYPE_BYTE, - &bcast_qos.bcast.sync_factor); - - bt_shell_printf("Encryption %u\n", bcast_qos.bcast.encryption); - - g_dbus_dict_append_entry(&dict, "Encryption", DBUS_TYPE_BYTE, - &bcast_qos.bcast.encryption); - - bt_shell_printf("Options %u\n", bcast_qos.bcast.options); - - g_dbus_dict_append_entry(&dict, "Options", DBUS_TYPE_BYTE, - &bcast_qos.bcast.options); - - bt_shell_printf("Skip %u\n", bcast_qos.bcast.skip); - - g_dbus_dict_append_entry(&dict, "Skip", DBUS_TYPE_UINT16, - &bcast_qos.bcast.skip); - - bt_shell_printf("SyncTimeout %u\n", bcast_qos.bcast.sync_timeout); - - g_dbus_dict_append_entry(&dict, "SyncTimeout", DBUS_TYPE_UINT16, - &bcast_qos.bcast.sync_timeout); - - bt_shell_printf("SyncCteType %u\n", bcast_qos.bcast.sync_cte_type); - - g_dbus_dict_append_entry(&dict, "SyncCteType", DBUS_TYPE_BYTE, - &bcast_qos.bcast.sync_cte_type); - - bt_shell_printf("MSE %u\n", bcast_qos.bcast.mse); - - g_dbus_dict_append_entry(&dict, "MSE", DBUS_TYPE_BYTE, - &bcast_qos.bcast.mse); - - bt_shell_printf("Timeout %u\n", bcast_qos.bcast.timeout); - - g_dbus_dict_append_entry(&dict, "Timeout", DBUS_TYPE_UINT16, - &bcast_qos.bcast.timeout); - - bt_shell_printf("BroadcastCode:\n"); - bt_shell_hexdump(cfg->ep->bcode->iov_base, cfg->ep->bcode->iov_len); - - g_dbus_dict_append_basic_array(&dict, DBUS_TYPE_STRING, &keyBCode, - DBUS_TYPE_BYTE, - &cfg->ep->bcode->iov_base, - cfg->ep->bcode->iov_len); - -done: dbus_message_iter_close_container(iter, &dict); } @@ -2892,9 +2930,9 @@ static void custom_phy(const char *input, void *user_data) struct codec_qos *qos = (void *)&p->qos; if (!strcmp(input, "1M")) - qos->phy = "1M"; + qos->phy = 0x01; else if (!strcmp(input, "2M")) - qos->phy = "2M"; + qos->phy = 0x02; else { char *endptr = NULL; uint8_t phy = strtol(input, &endptr, 0); @@ -2906,10 +2944,8 @@ static void custom_phy(const char *input, void *user_data) switch (phy) { case 0x01: - qos->phy = "1M"; - break; case 0x02: - qos->phy = "2M"; + qos->phy = phy; break; default: bt_shell_printf("Invalid argument: %s\n", input); diff --git a/client/print.c b/client/print.c index 66439e541307..8d721e21df4b 100644 --- a/client/print.c +++ b/client/print.c @@ -165,11 +165,19 @@ void print_iter(const char *label, const char *name, DBusMessageIter *iter) break; case DBUS_TYPE_DICT_ENTRY: dbus_message_iter_recurse(iter, &subiter); - entry = g_strconcat(name, " Key", NULL); - print_iter(label, entry, &subiter); - g_free(entry); - entry = g_strconcat(name, " Value", NULL); + if (dbus_message_iter_get_arg_type(&subiter) == + DBUS_TYPE_STRING) { + dbus_message_iter_get_basic(&subiter, &valstr); + entry = g_strconcat(name, ".", valstr, NULL); + } else { + entry = g_strconcat(name, ".Key", NULL); + print_iter(label, entry, &subiter); + g_free(entry); + + entry = g_strconcat(name, ".Value", NULL); + } + dbus_message_iter_next(&subiter); print_iter(label, entry, &subiter); g_free(entry); From patchwork Wed Sep 27 21:53:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 726736 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6FDBAE7109E for ; Wed, 27 Sep 2023 21:54:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229731AbjI0VyR (ORCPT ); Wed, 27 Sep 2023 17:54:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38156 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229511AbjI0VyP (ORCPT ); Wed, 27 Sep 2023 17:54:15 -0400 Received: from mail-io1-xd2f.google.com (mail-io1-xd2f.google.com [IPv6:2607:f8b0:4864:20::d2f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AF1F5122 for ; Wed, 27 Sep 2023 14:54:09 -0700 (PDT) Received: by mail-io1-xd2f.google.com with SMTP id ca18e2360f4ac-79faba5fe12so332930839f.3 for ; Wed, 27 Sep 2023 14:54:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1695851647; x=1696456447; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=AITTg7wzMfwstGQCpgCXYeNHsCBEEvHmneYfk2K9WCQ=; b=WJP+hTU1J9DK4FZnBEeTk7WTXXiBAg+eSaUw/qmZot7DMM4EF5HSX6xE2MsQm7LtAT X6cUQudAiExf4hZvz67XO1eQm29/OxT21ONFP/YPzhIvW0RXytnFJzqzmU3Dc8NPhGpk Qun1mS2O7QI8f4gZUzkl/svMbyXD1j58OuH/wwhDs68Wr2cq5Gd+jC4ZFaPTefPW+J2G MmAof6QZgDIQAEnYAkA0d1GAuTrNgaei9nMOC/HmuS85iVHD4R1hGNw9gaGV0M/XnAv8 jGR90GNpkI/WxL14EikAhoA1SBjZRn9CRYXfL0pXbYGcpHnwnm2D+iAAW0tDyP/R0SQ2 Yg7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695851647; x=1696456447; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=AITTg7wzMfwstGQCpgCXYeNHsCBEEvHmneYfk2K9WCQ=; b=rZRIvHdIxAsXQ/kILUaOqvxC3OhmJSpsHGXErarwQBVcOZ9Ux7u74ry8yUU31xRZY4 6ci7Xa9UfxlHXl/TqhOXYnkreqCDXjvSzaNc3hstyuwvo6Ewd7VTttq3AUwpAYhOmFdW yrzy9+CWbRwfnRoKukmNfgumH1wwAApe8S+FkIRcuPUuFTJQUOtxaYy9ORSOchyu81Dt XL90AxXucDYJHzGMbahA4nBQuofGY171f7vJXRTIFsbk0/Qbn/6zp7NDi9CcJ/xN6XM0 e1fUPV565UsMlJ8DTlXGGheuggR21J00owiX7RulP7DM0BsTc4qG28cfNmHVYYTAE7DN ToHg== X-Gm-Message-State: AOJu0YwuremszYAw0jy/ojg/zvGKTdOs1JCfckjJgI3jk/HIND0FmY0f OodQgChB2DRIbtLiMUgMe57C3B2O8Dwry0z4 X-Google-Smtp-Source: AGHT+IFypr+cM8s+j5vs2wJ/WZWgnPReS0Y6iGKjThwdLRyzIRB0eeIm55b6Nr61H9FqjYqHUsENeA== X-Received: by 2002:a92:6f07:0:b0:34f:2484:64cb with SMTP id k7-20020a926f07000000b0034f248464cbmr3194398ilc.20.1695851645994; Wed, 27 Sep 2023 14:54:05 -0700 (PDT) Received: from lvondent-mobl4.. (c-98-232-221-87.hsd1.or.comcast.net. [98.232.221.87]) by smtp.gmail.com with ESMTPSA id g15-20020a02cd0f000000b0042bbfe3dc42sm4225331jaq.173.2023.09.27.14.54.04 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Sep 2023 14:54:05 -0700 (PDT) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH v4 06/12] doc/media: Convert media-api.rst into manpages Date: Wed, 27 Sep 2023 14:53:48 -0700 Message-ID: <20230927215354.1874835-6-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230927215354.1874835-1-luiz.dentz@gmail.com> References: <20230927215354.1874835-1-luiz.dentz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz This splits media-api.rst into org.bluez.Media.rst and generate manpages for them. --- Makefile.am | 21 +- doc/media-api.rst | 1144 ------------------------------ doc/org.bluez.Media.rst | 133 ++++ doc/org.bluez.MediaControl.rst | 80 +++ doc/org.bluez.MediaEndpoint.rst | 224 ++++++ doc/org.bluez.MediaFolder.rst | 117 +++ doc/org.bluez.MediaItem.rst | 131 ++++ doc/org.bluez.MediaPlayer.rst | 315 ++++++++ doc/org.bluez.MediaTransport.rst | 274 +++++++ 9 files changed, 1292 insertions(+), 1147 deletions(-) delete mode 100644 doc/media-api.rst create mode 100644 doc/org.bluez.Media.rst create mode 100644 doc/org.bluez.MediaControl.rst create mode 100644 doc/org.bluez.MediaEndpoint.rst create mode 100644 doc/org.bluez.MediaFolder.rst create mode 100644 doc/org.bluez.MediaItem.rst create mode 100644 doc/org.bluez.MediaPlayer.rst create mode 100644 doc/org.bluez.MediaTransport.rst diff --git a/Makefile.am b/Makefile.am index 30db74a0c441..a17841b0668d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -357,8 +357,16 @@ CLEANFILES += $(builtin_files) src/bluetooth.service if MANPAGES man_MANS += src/bluetoothd.8 +man_MANS += doc/org.bluez.Media.5 doc/org.bluez.MediaControl.5 \ + doc/org.bluez.MediaPlayer.5 doc/org.bluez.MediaFolder.5 \ + doc/org.bluez.MediaItem.5 doc/org.bluez.MediaEndpoint.5 \ + doc/org.bluez.MediaTransport.5 endif manual_pages += src/bluetoothd.8 +manual_pages += doc/org.bluez.Media.5 doc/org.bluez.MediaControl.5 \ + doc/org.bluez.MediaPlayer.5 doc/org.bluez.MediaFolder.5 \ + doc/org.bluez.MediaItem.5 doc/org.bluez.MediaEndpoint.5 \ + doc/org.bluez.MediaTransport.5 EXTRA_DIST += src/genbuiltin src/bluetooth.conf \ src/main.conf profiles/network/network.conf \ @@ -397,9 +405,13 @@ EXTRA_DIST += doc/assigned-numbers.txt doc/supported-features.txt \ EXTRA_DIST += doc/mgmt-api.txt \ doc/adapter-api.txt doc/device-api.txt \ doc/agent-api.txt doc/profile-api.txt \ - doc/network-api.txt doc/media-api.rst \ - doc/health-api.txt doc/sap-api.txt \ - doc/input-api.txt + doc/network-api.txt doc/health-api.txt \ + doc/sap-api.txt doc/input-api.txt + +EXTRA_DIST += doc/org.bluez.Media.rst doc/org.bluez.MediaControl.rst \ + doc/org.bluez.MediaPlayer.rst doc/org.bluez.MediaFolder.rst \ + doc/org.bluez.MediaItem.rst doc/org.bluez.MediaEndpoint.rst \ + doc/org.bluez.MediaTransport.rst EXTRA_DIST += doc/gatt-api.txt doc/advertising-api.txt @@ -667,6 +679,9 @@ endif %.1: %.rst Makefile $(RST2MAN_PROCESS) +%.5: %.rst Makefile + $(RST2MAN_PROCESS) + %.8: %.rst Makefile $(RST2MAN_PROCESS) diff --git a/doc/media-api.rst b/doc/media-api.rst deleted file mode 100644 index b37ae8f01630..000000000000 --- a/doc/media-api.rst +++ /dev/null @@ -1,1144 +0,0 @@ -=================================== -BlueZ D-Bus Media API documentation -=================================== - - -Media interface -=============== - -:Service: org.bluez -:Interface: org.bluez.Media1 -:Object path: [variable prefix]/{hci0,hci1,...} - -Methods -------- - -void RegisterEndpoint(object endpoint, dict properties) -``````````````````````````````````````````````````````` - - Register a local end point to sender, the sender can register as many - end points as it likes. - - Note: If the sender disconnects the end points are automatically - unregistered. - - possible properties: - - :string UUID: - - UUID of the profile which the endpoint is for. - - UUID must be in the list of SupportedUUIDS. - - :byte Codec: - - Assigned number of codec that the endpoint implements. The - values should match the profile specification which is - indicated by the UUID. - - :uint32_t Vendor [Optional]: - - Vendor-specific Company ID, Codec ID tuple that the endpoint - implements. - - It shall be set to appropriate value when Vendor Specific Codec - (0xff) is used. - - :array{byte} Capabilities: - - Capabilities blob, it is used as it is so the size and byte - order must match. - - :array{byte} Metadata [Optional]: - - Metadata blob, it is used as it is so the size and byte order - must match. - - Possible Errors: - - :org.bluez.Error.InvalidArguments: - :org.bluez.Error.NotSupported: - - emitted when interface for the end-point is disabled - -void UnregisterEndpoint(object endpoint) -```````````````````````````````````````` - Unregister sender end point. - -void RegisterPlayer(object player, dict properties) -``````````````````````````````````````````````````` - - Register a media player object to sender, the sender can register as - many objects as it likes. - - Object must implement at least org.mpris.MediaPlayer2.Player as defined - in MPRIS 2.2 spec: - - http://specifications.freedesktop.org/mpris-spec/latest/ - - Note: If the sender disconnects its objects are automatically - unregistered. - - Possible Errors: - - :org.bluez.Error.InvalidArguments: - :org.bluez.Error.NotSupported: - -void UnregisterPlayer(object player) -```````````````````````````````````` - - Unregister sender media player. - -void RegisterApplication(object root, dict options) -``````````````````````````````````````````````````` - - Register endpoints an player objects within root object which must - implement ObjectManager. - - The application object path together with the D-Bus system bus - connection ID define the identification of the application. - - Possible errors: - - :org.bluez.Error.InvalidArguments: - :org.bluez.Error.AlreadyExists: - -void UnregisterApplication(object application) -`````````````````````````````````````````````` - - This unregisters the services that has been previously registered. The - object path parameter must match the same value that has been used on - registration. - - Possible errors: - - :org.bluez.Error.InvalidArguments: - :org.bluez.Error.DoesNotExist: - -Properties ----------- - -array{string} SupportedUUIDs [readonly] -``````````````````````````````````````` - - List of 128-bit UUIDs that represents the supported Endpoint - registration. - -MediaControl interface -====================== - -:Service: org.bluez -:Interface: org.bluez.MediaControl1 -:Object path: [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX - -Methods -------- - -void Play() [Deprecated] -```````````````````````` - - Resume playback. - -void Pause() [Deprecated] -````````````````````````` - - Pause playback. - -void Stop() [Deprecated] -```````````````````````` - - Stop playback. - -void Next() [Deprecated] -```````````````````````` - - Next item. - -void Previous() [Deprecated] -```````````````````````````` - - Previous item. - -void VolumeUp() [Deprecated] -```````````````````````````` - - Adjust remote volume one step up - -void VolumeDown() [Deprecated] -`````````````````````````````` - - Adjust remote volume one step down - -void FastForward() [Deprecated] -``````````````````````````````` - - Fast forward playback, this action is only stopped when another method - in this interface is called. - -void Rewind() [Deprecated] -`````````````````````````` - - Rewind playback, this action is only stopped when another method in - this interface is called. - -Properties ----------- - -boolean Connected [readonly] -```````````````````````````` - -object Player [readonly, optional] -`````````````````````````````````` - - Addressed Player object path. - -MediaPlayer interface -===================== - -:Service: org.bluez (Controller role) -:Interface: org.bluez.MediaPlayer1 -:Object path: [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/playerX - -Methods -------- - -void Play() -``````````` - - Resume playback. - - Possible Errors: - - :org.bluez.Error.NotSupported: - :org.bluez.Error.Failed: - -void Pause() -```````````` - - Pause playback. - - Possible Errors: - - :org.bluez.Error.NotSupported: - :org.bluez.Error.Failed: - -void Stop() -``````````` - - Stop playback. - - Possible Errors: - - :org.bluez.Error.NotSupported: - :org.bluez.Error.Failed: - -void Next() -``````````` - - Next item. - - Possible Errors: - - :org.bluez.Error.NotSupported: - :org.bluez.Error.Failed: - -void Previous() -``````````````` - - Previous item. - - Possible Errors: - - :org.bluez.Error.NotSupported: - :org.bluez.Error.Failed: - -void FastForward() -`````````````````` - - Fast forward playback, this action is only stopped when another method - in this interface is called. - - Possible Errors: - - :org.bluez.Error.NotSupported: - :org.bluez.Error.Failed: - -void Rewind() -````````````` - - Rewind playback, this action is only stopped when another method in - this interface is called. - - Possible Errors: - - :org.bluez.Error.NotSupported: - :org.bluez.Error.Failed: - -void Press(byte avc_key) -```````````````````````` - - Press a specific key to send as passthrough command. The key will be - released automatically. Use Hold() instead if the intention is to hold - down the key. - - Possible Errors: - - :org.bluez.Error.InvalidArguments: - :org.bluez.Error.NotSupported: - :org.bluez.Error.Failed: - -void Hold(byte avc_key) -``````````````````````` - - Press and hold a specific key to send as passthrough command. It is - your responsibility to make sure that Release() is called after calling - this method. The held key will also be released when any other method - in this interface is called. - - Possible Errors: - - :org.bluez.Error.InvalidArguments: - :org.bluez.Error.NotSupported: - :org.bluez.Error.Failed: - -void Release() -`````````````` - - Release the previously held key invoked using Hold(). - - Possible Errors: - - :org.bluez.Error.NotSupported: - :org.bluez.Error.Failed: - -Properties ----------- - -string Equalizer [readwrite] -```````````````````````````` - - Possible values: "off" or "on" - -string Repeat [readwrite] -````````````````````````` - - Possible values: "off", "singletrack", "alltracks" or "group" - -string Shuffle [readwrite] -`````````````````````````` - - Possible values: "off", "alltracks" or "group" - -string Scan [readwrite] -``````````````````````` - - Possible values: "off", "alltracks" or "group" - -string Status [readonly] -```````````````````````` - - Possible status: "playing", "stopped", "paused", "forward-seek", - "reverse-seek" or "error" - -uint32 Position [readonly] -`````````````````````````` - - Playback position in milliseconds. Changing the position may generate - additional events that will be sent to the remote device. When position - is 0 it means the track is starting and when it's greater than or equal - to track's duration the track has ended. - - Note that even if duration is not available in metadata it's possible - to signal its end by setting position to the maximum uint32 value. - -dict Track [readonly] -````````````````````` - - Track metadata. - - Possible values: - - :string Title: - - Track title name - - :string Artist: - - Track artist name - - :string Album: - - Track album name - - :string Genre: - - Track genre name - - :uint32 NumberOfTracks: - - Number of tracks in total - - :uint32 TrackNumber: - - Track number - - :uint32 Duration: - - Track duration in milliseconds - -object Device [readonly] -```````````````````````` - - Device object path. - -string Name [readonly] -`````````````````````` - - Player name - -string Type [readonly] -`````````````````````` - - Player type - - Possible values: - - "Audio" - "Video" - "Audio Broadcasting" - "Video Broadcasting" - -string Subtype [readonly] -````````````````````````` - - Player subtype - - Possible values: - - "Audio Book" - "Podcast" - -boolean Browsable [readonly] -```````````````````````````` - - If present indicates the player can be browsed using MediaFolder - interface. - - Possible values: - - :True: - - Supported and active - - :False: - - Supported but inactive - - Note: If supported but inactive clients can enable it by using - MediaFolder interface but it might interfere in the playback of other - players. - -boolean Searchable [readonly] -````````````````````````````` - - If present indicates the player can be searched using MediaFolder - interface. - - Possible values: - - :True: - - Supported and active - - :False: - - Supported but inactive - - Note: If supported but inactive clients can enable it by using - MediaFolder interface but it might interfere in the playback of other - players. - -object Playlist -``````````````` - - Playlist object path. - -MediaFolder interface -===================== - -:Service: unique name (Target role) - org.bluez (Controller role) -:Interface: org.bluez.MediaFolder1 -:Object path: freely definable (Target role) - [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/playerX - (Controller role) - -Methods -------- - -object Search(string value, dict filter) -```````````````````````````````````````` - - Return a folder object containing the search result. - - To list the items found use the folder object returned and pass to - ChangeFolder. - - Possible Errors: - - :org.bluez.Error.NotSupported: - :org.bluez.Error.Failed: - -array{objects, properties} ListItems(dict filter) -````````````````````````````````````````````````` - - Return a list of items found - - Possible Errors: - - :org.bluez.Error.InvalidArguments: - :org.bluez.Error.NotSupported: - :org.bluez.Error.Failed: - -void ChangeFolder(object folder) -```````````````````````````````` - - Change current folder. - - Note: By changing folder the items of previous folder might be destroyed - and have to be listed again, the exception is NowPlaying folder which - should be always present while the player is active. - - Possible Errors: - - :org.bluez.Error.InvalidArguments: - :org.bluez.Error.NotSupported: - :org.bluez.Error.Failed: - -Properties ----------- - -uint32 NumberOfItems [readonly] -``````````````````````````````` - - Number of items in the folder - -string Name [readonly] -`````````````````````` - - Folder name: - - Possible values: - - :"/Filesystem/...": - - Filesystem scope - - :"/NowPlaying/...": - - NowPlaying scope - - Note: /NowPlaying folder might not be listed if player is stopped, - folders created by Search are virtual so once another Search is perform - or the folder is changed using ChangeFolder it will no longer be listed. - -Filters -------- - -:uint32 Start: - - Offset of the first item. - - Default value: 0 - -:uint32 End: - - Offset of the last item. - - Default value: NumbeOfItems - -:array{string} Attributes: - - Item properties that should be included in the list. - - Possible Values: - - "title", "artist", "album", "genre", "number-of-tracks", - "number", "duration" - - Default Value: All - -MediaItem interface -=================== - -:Service: unique name (Target role) - org.bluez (Controller role) -:Interface: org.bluez.MediaItem1 -:Object path: freely definable (Target role) - [variable - prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/playerX/itemX - (Controller role) - -Methods -------- - -void Play() -``````````` - - Play item - - Possible Errors: - - :org.bluez.Error.NotSupported: - :org.bluez.Error.Failed: - -void AddtoNowPlaying() -`````````````````````` - - Add item to now playing list - - Possible Errors: - - :org.bluez.Error.NotSupported: - :org.bluez.Error.Failed: - -Properties ----------- - -object Player [readonly] -```````````````````````` - - Player object path the item belongs to - -string Name [readonly] -`````````````````````` - - Item displayable name - -string Type [readonly] -`````````````````````` - - Item type - - Possible values: "video", "audio", "folder" - -string FolderType [readonly, optional] -`````````````````````````````````````` - - Folder type. - - Possible values: "mixed", "titles", "albums", "artists" - - Available if property Type is "Folder" - -boolean Playable [readonly, optional] -````````````````````````````````````` - - Indicates if the item can be played - - Available if property Type is "folder" - -dict Metadata [readonly] -```````````````````````` - - Item metadata. - - Possible values: - - :string Title: - - Item title name - - Available if property Type is "audio" or "video" - - :string Artist: - - Item artist name - - Available if property Type is "audio" or "video" - - :string Album: - - Item album name - - Available if property Type is "audio" or "video" - - :string Genre: - - Item genre name - - Available if property Type is "audio" or "video" - - :uint32 NumberOfTracks: - - Item album number of tracks in total - - Available if property Type is "audio" or "video" - - :uint32 Number: - - Item album number - - Available if property Type is "audio" or "video" - - :uint32 Duration: - - Item duration in milliseconds - - Available if property Type is "audio" or "video" - -MediaEndpoint interface -======================= - -:Service: unique name (Server role) - org.bluez (Client role) -:Interface: org.bluez.MediaEndpoint1 -:Object path: freely definable (Server role) - [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/sepX - (Client role) - -Methods -------- - -void SetConfiguration(object transport, dict properties) -```````````````````````````````````````````````````````` - - Set configuration for the transport. - - For client role transport must be set with a server endpoint oject which - will be configured and the properties must contain the following - properties: - - :array{byte} Capabilities [Mandatory]: - - See Endpoint.Capabilities property. - - :array{byte} Metadata [ISO only]: - - See Endpoint.Metadata property. - - :uint32 Location [ISO only]: - - See Endpoint.Location property. - - :byte Framing [ISO only]: - - See Endpoint.Framing property. - - :byte PHY [ISO only]: - - See Endpoint.PHY property. - - :uint16 MaximumLatency [ISO only]: - - See Endpoint.MaximumLatency property. - - :uint32 MinimumDelay [ISO only]: - - See Endpoint.MinimumDelay property. - - :uint32 MaximumDelay [ISO only]: - - See Endpoint.MaximumDelay property. - - :uint32 PreferredMinimumDelay [ISO only]: - - See Endpoint.PreferredMinimumDelay property. - - :uint32 PreferredMaximumDelay [ISO only]: - - See Endpoint.PreferredMaximumDelay property. - - -array{byte} SelectConfiguration(array{byte} capabilities) -````````````````````````````````````````````````````````` - - Select preferable configuration from the supported capabilities. - - Returns a configuration which can be used to setup a transport. - - Note: There is no need to cache the selected configuration since on - success the configuration is send back as parameter of SetConfiguration. - -dict SelectProperties(dict properties) -`````````````````````````````````````` - - Select preferable properties from the supported properties: - - :object Endpoint [ISO only]: - :Refer to SetConfiguration for the list of other possible properties.: - - Returns propeties which can be used to setup a transport. - - Note: There is no need to cache the selected properties since on - success the configuration is send back as parameter of SetConfiguration. - -void ClearConfiguration(object transport) -````````````````````````````````````````` - - Clear transport configuration. - -void Release() -`````````````` - - This method gets called when the service daemon unregisters the - endpoint. An endpoint can use it to do cleanup tasks. There is no need - to unregister the endpoint, because when this method gets called it has - already been unregistered. - -Properties ----------- - -string UUID [readonly, optional] -```````````````````````````````` - - UUID of the profile which the endpoint is for. - -byte Codec [readonly, optional] -``````````````````````````````` - - Assigned number of codec that the endpoint implements. - The values should match the profile specification which is indicated by - the UUID. - -uint32_t Vendor [readonly, Optional] -```````````````````````````````````` - - Vendor-specific Company ID, Codec ID tuple that the endpoint implements. - - It shall be set to appropriate value when Vendor Specific Codec (0xff) - is used. - -array{byte} Capabilities [readonly, optional] -````````````````````````````````````````````` - - Capabilities blob, it is used as it is so the size and byte order must - match. - -array{byte} Metadata [readonly, Optional] -````````````````````````````````````````` - - Metadata blob, it is used as it is so the size and byte order must - match. - -object Device [readonly, optional] -`````````````````````````````````` - - Device object which the endpoint is belongs to. - -bool DelayReporting [readonly, optional] -```````````````````````````````````````` - - Indicates if endpoint supports Delay Reporting. - -byte Framing [ISO only] -``````````````````````` - - Indicates endpoint support framing. - -byte PHY [ISO only] -``````````````````` - - Indicates endpoint supported PHY. - -uint16_t MaximumLatency [ISO only] -`````````````````````````````````` - - Indicates endpoint maximum latency. - -uint32_t MinimumDelay [ISO only] -```````````````````````````````` - - Indicates endpoint minimum presentation delay. - -uint32_t MaximumDelay [ISO only] -```````````````````````````````` - - Indicates endpoint maximum presentation delay. - -uint32_t PreferredMinimumDelay [ISO only] -````````````````````````````````````````` - - Indicates endpoint preferred minimum presentation delay. - -uint32_t PreferredMinimumDelay [ISO only] -````````````````````````````````````````` - - Indicates endpoint preferred minimum presentation delay. - -uint32 Location [ISO only] -`````````````````````````` - - Indicates endpoint supported locations. - -uint16 SupportedContext [ISO only] -`````````````````````````````````` - - Indicates endpoint supported audio context. - -uint16 Context [ISO only] -````````````````````````` - - Indicates endpoint available audio context. - -MediaTransport interface -======================== - -:Service: org.bluez -:Interface: org.bluez.MediaTransport1 -:Object path: [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/fdX - -Methods -------- - -fd, uint16, uint16 Acquire() -```````````````````````````` - - Acquire transport file descriptor and the MTU for read and write - respectively. - - Possible Errors: - - :org.bluez.Error.NotAuthorized: - :org.bluez.Error.Failed: - -fd, uint16, uint16 TryAcquire() -``````````````````````````````` - - Acquire transport file descriptor only if the transport is in "pending" - state at the time the message is received by BlueZ. Otherwise no request - will be sent to the remote device and the function will just fail with - org.bluez.Error.NotAvailable. - - Possible Errors: - - :org.bluez.Error.NotAuthorized: - :org.bluez.Error.Failed: - :org.bluez.Error.NotAvailable: - -void Release() -`````````````` - - Releases file descriptor. - -Properties ----------- - -object Device [readonly] -```````````````````````` - - Device object which the transport is connected to. - -string UUID [readonly] -`````````````````````` - - UUID of the profile which the transport is for. - -byte Codec [readonly] -````````````````````` - - Assigned number of codec that the transport support. - The values should match the profile specification which is indicated by - the UUID. - -array{byte} Configuration [readonly] -```````````````````````````````````` - - Configuration blob, it is used as it is so the size and byte order must - match. - -string State [readonly] -``````````````````````` - - Indicates the state of the transport. Possible values are: - - :"idle": not streaming - :"pending": streaming but not acquired - :"active": streaming and acquired - -uint16 Delay [readwrite, optional] -`````````````````````````````````` - - Transport delay in 1/10 of millisecond, this property is only writeable - when the transport was acquired by the sender. - -uint16 Volume [readwrite, optional] -``````````````````````````````````` - - Indicates volume level of the transport, this property is only writeable - when the transport was acquired by the sender. - - Possible Values: 0-127 - -object Endpoint [readonly, optional, experimental] -`````````````````````````````````````````````````` - - Endpoint object which the transport is associated with. - -uint32 Location [readonly, ISO only, experimental] -`````````````````````````````````````````````````` - - Indicates transport Audio Location. - -array{byte} Metadata [readwrite, ISO Only, experimental] -```````````````````````````````````````````````````````` - - Indicates transport Metadata. - -array{object} Links [readonly, optional, ISO only, experimental] -```````````````````````````````````````````````````````````````` - - Linked transport objects which the transport is associated with. - -dict QoS [readonly, optional, ISO only, experimental] -````````````````````````````````````````````````````` - - Only present when QoS is configured. - - Possible values for Unicast: - - :byte CIG: - - Indicates configured CIG. - - Possible values: - - :0x00 - 0xef: - - Valid ID range. - - :0xff: - - Auto allocate. - - :byte CIS: - - Indicates configured CIS. - - Possible values: - - :0x00 - 0xef: - - Valid ID range. - - :0xff: - - Auto allocate. - - :byte Framing: - - Indicates configured framing. - - Possible values: - - :0x00: - - Unframed. - - :0x01: - - Framed. - - :uint32 PresentationDelay: - - Indicates configured transport presentation delay (us). - - :byte TargetLatency: - - Indicates the requested target latency. - - Possible values: - - :0x01: - - Low Latency. - - :0x02: - - Balanced Latency/Reliability. - - :0x03: - - High Reliability. - - Possible values for Broadcast: - - :byte BIG: - - Indicates configured QoS BIG. - - :byte BIS: - - Indicates configured BIS. - - :byte SyncFactor: - - Indicates configured broadcast sync factor. - - :byte Packing: - - Indicates configured packing. - - :byte Framing: - - Indicates configured framing. - - :byte Options: - - Indicates configured broadcast options. - - :uint16 Skip: - - Indicates configured broadcast skip. - - :byte SyncTimeout: - - Indicates configured broadcast sync timeout. - - :byte SyncType: - - Indicates configured broadcast sync CTE type. - - :byte MSE: - - Indicates configured broadcast MSE. - - :uint16 Timeout: - - Indicates configured broadcast timeout. - - Possible values for both Unicast and Broadcast: - - :uint32 Interval: - - Indicates configured ISO interval (us). - - :uint16 Latency: - - Indicates configured transport latency (ms). - - :uint16 SDU: - - Indicates configured maximum SDU. - - :byte PHY: - - Indicates configured PHY. - - Possible values: - - :bit 0: - - LE 1M - - :bit 1: - - LE 2M - - :bit 2: - - LE Coded - - :byte Retransmissions: - - Indicates configured retransmissions. diff --git a/doc/org.bluez.Media.rst b/doc/org.bluez.Media.rst new file mode 100644 index 000000000000..678e6090c6e1 --- /dev/null +++ b/doc/org.bluez.Media.rst @@ -0,0 +1,133 @@ +=============== +org.bluez.Media +=============== + +----------------------------------- +BlueZ D-Bus Media API documentation +----------------------------------- + +:Version: BlueZ +:Date: September 2023 +:Manual section: 5 +:Manual group: Linux System Administration + +Interface +========= + +:Service: org.bluez +:Interface: org.bluez.Media1 +:Object path: [variable prefix]/{hci0,hci1,...} + +Methods +------- + +void RegisterEndpoint(object endpoint, dict properties) +``````````````````````````````````````````````````````` + + Register a local end point to sender, the sender can register as many + end points as it likes. + + Note: If the sender disconnects the end points are automatically + unregistered. + + possible properties: + + :string UUID: + + UUID of the profile which the endpoint is for. + + UUID must be in the list of SupportedUUIDS. + + :byte Codec: + + Assigned number of codec that the endpoint implements. The + values should match the profile specification which is + indicated by the UUID. + + :uint32_t Vendor [Optional]: + + Vendor-specific Company ID, Codec ID tuple that the endpoint + implements. + + It shall be set to appropriate value when Vendor Specific Codec + (0xff) is used. + + :array{byte} Capabilities: + + Capabilities blob, it is used as it is so the size and byte + order must match. + + :array{byte} Metadata [Optional]: + + Metadata blob, it is used as it is so the size and byte order + must match. + + Possible Errors: + + :org.bluez.Error.InvalidArguments: + :org.bluez.Error.NotSupported: + + emitted when interface for the end-point is disabled + +void UnregisterEndpoint(object endpoint) +```````````````````````````````````````` + Unregister sender end point. + +void RegisterPlayer(object player, dict properties) +``````````````````````````````````````````````````` + + Register a media player object to sender, the sender can register as + many objects as it likes. + + Object must implement at least org.mpris.MediaPlayer2.Player as defined + in MPRIS 2.2 spec: + + http://specifications.freedesktop.org/mpris-spec/latest/ + + Note: If the sender disconnects its objects are automatically + unregistered. + + Possible Errors: + + :org.bluez.Error.InvalidArguments: + :org.bluez.Error.NotSupported: + +void UnregisterPlayer(object player) +```````````````````````````````````` + + Unregister sender media player. + +void RegisterApplication(object root, dict options) +``````````````````````````````````````````````````` + + Register endpoints an player objects within root object which must + implement ObjectManager. + + The application object path together with the D-Bus system bus + connection ID define the identification of the application. + + Possible errors: + + :org.bluez.Error.InvalidArguments: + :org.bluez.Error.AlreadyExists: + +void UnregisterApplication(object application) +`````````````````````````````````````````````` + + This unregisters the services that has been previously registered. The + object path parameter must match the same value that has been used on + registration. + + Possible errors: + + :org.bluez.Error.InvalidArguments: + :org.bluez.Error.DoesNotExist: + +Properties +---------- + +array{string} SupportedUUIDs [readonly] +``````````````````````````````````````` + + List of 128-bit UUIDs that represents the supported Endpoint + registration. diff --git a/doc/org.bluez.MediaControl.rst b/doc/org.bluez.MediaControl.rst new file mode 100644 index 000000000000..54e84e8c62eb --- /dev/null +++ b/doc/org.bluez.MediaControl.rst @@ -0,0 +1,80 @@ +====================== +org.bluez.MediaControl +====================== + +------------------------------------------ +BlueZ D-Bus MediaControl API documentation +------------------------------------------ + +:Version: BlueZ +:Date: September 2023 +:Manual section: 5 +:Manual group: Linux System Administration + +Interface +========= + +:Service: org.bluez +:Interface: org.bluez.MediaControl1 +:Object path: [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX + +Methods +------- + +void Play() [Deprecated] +```````````````````````` + + Resume playback. + +void Pause() [Deprecated] +````````````````````````` + + Pause playback. + +void Stop() [Deprecated] +```````````````````````` + + Stop playback. + +void Next() [Deprecated] +```````````````````````` + + Next item. + +void Previous() [Deprecated] +```````````````````````````` + + Previous item. + +void VolumeUp() [Deprecated] +```````````````````````````` + + Adjust remote volume one step up + +void VolumeDown() [Deprecated] +`````````````````````````````` + + Adjust remote volume one step down + +void FastForward() [Deprecated] +``````````````````````````````` + + Fast forward playback, this action is only stopped when another method + in this interface is called. + +void Rewind() [Deprecated] +`````````````````````````` + + Rewind playback, this action is only stopped when another method in + this interface is called. + +Properties +---------- + +boolean Connected [readonly] +```````````````````````````` + +object Player [readonly, optional] +`````````````````````````````````` + + Addressed Player object path. diff --git a/doc/org.bluez.MediaEndpoint.rst b/doc/org.bluez.MediaEndpoint.rst new file mode 100644 index 000000000000..cba8cb3edc6e --- /dev/null +++ b/doc/org.bluez.MediaEndpoint.rst @@ -0,0 +1,224 @@ +======================= +org.bluez.MediaEndpoint +======================= + +------------------------------------------- +BlueZ D-Bus MediaEndpoint API documentation +------------------------------------------- + +:Version: BlueZ +:Date: September 2023 +:Manual section: 5 +:Manual group: Linux System Administration + +Interface +========= + +:Service: unique name (Server role) + org.bluez (Client role) +:Interface: org.bluez.MediaEndpoint1 +:Object path: freely definable (Server role) + [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/sepX + (Client role) + +Methods +------- + +void SetConfiguration(object transport, dict properties) +```````````````````````````````````````````````````````` + + Set configuration for the transport. + + For client role transport must be set with a server endpoint oject which + will be configured and the properties must contain the following + properties: + + :array{byte} Capabilities [Mandatory]: + + See Capabilities property. + + :array{byte} Metadata [ISO only]: + + See Metadata property. + + :uint32 Location [ISO only]: + + See Location property. + + :byte Framing [ISO only]: + + See Framing property. + + :byte PHY [ISO only]: + + See PHY property. + + :uint16 MaximumLatency [ISO only]: + + See MaximumLatency property. + + :uint32 MinimumDelay [ISO only]: + + See MinimumDelay property. + + :uint32 MaximumDelay [ISO only]: + + See MaximumDelay property. + + :uint32 PreferredMinimumDelay [ISO only]: + + See PreferredMinimumDelay property. + + :uint32 PreferredMaximumDelay [ISO only]: + + See PreferredMaximumDelay property. + +array{byte} SelectConfiguration(array{byte} capabilities) +````````````````````````````````````````````````````````` + + Select preferable configuration from the supported capabilities. + + Returns a configuration which can be used to setup a transport. + + Note: There is no need to cache the selected configuration since on + success the configuration is send back as parameter of SetConfiguration. + +dict SelectProperties(dict properties) +`````````````````````````````````````` + + Select preferable properties from the supported properties: + + :object Endpoint [ISO only]: + :Refer to SetConfiguration for the list of other possible properties.: + + Returns propeties which can be used to setup a transport. + + Note: There is no need to cache the selected properties since on + success the configuration is send back as parameter of SetConfiguration. + +void ClearConfiguration(object transport) +````````````````````````````````````````` + + Clear transport configuration. + +void Release() +`````````````` + + This method gets called when the service daemon unregisters the + endpoint. An endpoint can use it to do cleanup tasks. There is no need + to unregister the endpoint, because when this method gets called it has + already been unregistered. + +MediaEndpoint Properties +------------------------ + +string UUID [readonly, optional] +```````````````````````````````` + + UUID of the profile which the endpoint is for. + +byte Codec [readonly, optional] +``````````````````````````````` + + Assigned number of codec that the endpoint implements. + The values should match the profile specification which is indicated by + the UUID. + +uint32_t Vendor [readonly, Optional] +```````````````````````````````````` + + Vendor-specific Company ID, Codec ID tuple that the endpoint implements. + + It shall be set to appropriate value when Vendor Specific Codec (0xff) + is used. + +array{byte} Capabilities [readonly, optional] +````````````````````````````````````````````` + + Capabilities blob, it is used as it is so the size and byte order must + match. + +array{byte} Metadata [readonly, Optional] +````````````````````````````````````````` + + Metadata blob, it is used as it is so the size and byte order must + match. + +object Device [readonly, optional] +`````````````````````````````````` + + Device object which the endpoint is belongs to. + +bool DelayReporting [readonly, optional] +```````````````````````````````````````` + + Indicates if endpoint supports Delay Reporting. + +byte Framing [ISO only] +``````````````````````` + + Indicates endpoint support framing. + +byte PHY [ISO only] +``````````````````` + + Indicates endpoint supported PHY. + + Possible values: + + :bit 0: + + LE 1M + + :bit 1: + + LE 2M + + :bit 2: + + LE Coded + +byte Retransmissions [ISO only] +``````````````````````````````` + + Indicates endpoint preferred number of retransmissions. + +uint16_t MaximumLatency [ISO only] +`````````````````````````````````` + + Indicates endpoint maximum latency. + +uint32_t MinimumDelay [ISO only] +```````````````````````````````` + + Indicates endpoint minimum presentation delay. + +uint32_t MaximumDelay [ISO only] +```````````````````````````````` + + Indicates endpoint maximum presentation delay. + +uint32_t PreferredMinimumDelay [ISO only] +````````````````````````````````````````` + + Indicates endpoint preferred minimum presentation delay. + +uint32_t PreferredMaximumDelay [ISO only] +````````````````````````````````````````` + + Indicates endpoint preferred maximum presentation delay. + +uint32 Location [ISO only] +`````````````````````````` + + Indicates endpoint supported locations. + +uint16 SupportedContext [ISO only] +`````````````````````````````````` + + Indicates endpoint supported audio context. + +uint16 Context [ISO only] +````````````````````````` + + Indicates endpoint available audio context. diff --git a/doc/org.bluez.MediaFolder.rst b/doc/org.bluez.MediaFolder.rst new file mode 100644 index 000000000000..dd56f06b41e4 --- /dev/null +++ b/doc/org.bluez.MediaFolder.rst @@ -0,0 +1,117 @@ +===================== +org.bluez.MediaFolder +===================== + +----------------------------------------- +BlueZ D-Bus MediaFolder API documentation +----------------------------------------- + +:Version: BlueZ +:Date: September 2023 +:Manual section: 5 +:Manual group: Linux System Administration + +Interface +========= + +:Service: unique name (Target role) + org.bluez (Controller role) +:Interface: org.bluez.MediaFolder1 +:Object path: freely definable (Target role) + [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/playerX + (Controller role) + +Methods +------- + +object Search(string value, dict filter) +```````````````````````````````````````` + + Return a folder object containing the search result. + + To list the items found use the folder object returned and pass to + ChangeFolder. + + Possible Errors: + + :org.bluez.Error.NotSupported: + :org.bluez.Error.Failed: + +array{objects, properties} ListItems(dict filter) +````````````````````````````````````````````````` + + Return a list of items found + + Possible Errors: + + :org.bluez.Error.InvalidArguments: + :org.bluez.Error.NotSupported: + :org.bluez.Error.Failed: + +void ChangeFolder(object folder) +```````````````````````````````` + + Change current folder. + + Note: By changing folder the items of previous folder might be destroyed + and have to be listed again, the exception is NowPlaying folder which + should be always present while the player is active. + + Possible Errors: + + :org.bluez.Error.InvalidArguments: + :org.bluez.Error.NotSupported: + :org.bluez.Error.Failed: + +Properties +---------- + +uint32 NumberOfItems [readonly] +``````````````````````````````` + + Number of items in the folder + +string Name [readonly] +`````````````````````` + + Folder name: + + Possible values: + + :"/Filesystem/...": + + Filesystem scope + + :"/NowPlaying/...": + + NowPlaying scope + + Note: /NowPlaying folder might not be listed if player is stopped, + folders created by Search are virtual so once another Search is perform + or the folder is changed using ChangeFolder it will no longer be listed. + +Filters +------- + +:uint32 Start: + + Offset of the first item. + + Default value: 0 + +:uint32 End: + + Offset of the last item. + + Default value: NumbeOfItems + +:array{string} Attributes: + + Item properties that should be included in the list. + + Possible Values: + + "title", "artist", "album", "genre", "number-of-tracks", + "number", "duration" + + Default Value: All diff --git a/doc/org.bluez.MediaItem.rst b/doc/org.bluez.MediaItem.rst new file mode 100644 index 000000000000..855e8a6395b7 --- /dev/null +++ b/doc/org.bluez.MediaItem.rst @@ -0,0 +1,131 @@ +=================== +org.bluez.MediaItem +=================== + +--------------------------------------- +BlueZ D-Bus MediaItem API documentation +--------------------------------------- + +:Version: BlueZ +:Date: September 2023 +:Manual section: 5 +:Manual group: Linux System Administration + +Interface +========= + +:Service: unique name (Target role) + org.bluez (Controller role) +:Interface: org.bluez.MediaItem1 +:Object path: freely definable (Target role) + [variable + prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/playerX/itemX + (Controller role) + +Methods +------- + +void Play() +``````````` + + Play item + + Possible Errors: + + :org.bluez.Error.NotSupported: + :org.bluez.Error.Failed: + +void AddtoNowPlaying() +`````````````````````` + + Add item to now playing list + + Possible Errors: + + :org.bluez.Error.NotSupported: + :org.bluez.Error.Failed: + +Properties +---------- + +object Player [readonly] +```````````````````````` + + Player object path the item belongs to + +string Name [readonly] +`````````````````````` + + Item displayable name + +string Type [readonly] +`````````````````````` + + Item type + + Possible values: "video", "audio", "folder" + +string FolderType [readonly, optional] +`````````````````````````````````````` + + Folder type. + + Possible values: "mixed", "titles", "albums", "artists" + + Available if property Type is "Folder" + +boolean Playable [readonly, optional] +````````````````````````````````````` + + Indicates if the item can be played + + Available if property Type is "folder" + +dict Metadata [readonly] +```````````````````````` + + Item metadata. + + Possible values: + + :string Title: + + Item title name + + Available if property Type is "audio" or "video" + + :string Artist: + + Item artist name + + Available if property Type is "audio" or "video" + + :string Album: + + Item album name + + Available if property Type is "audio" or "video" + + :string Genre: + + Item genre name + + Available if property Type is "audio" or "video" + + :uint32 NumberOfTracks: + + Item album number of tracks in total + + Available if property Type is "audio" or "video" + + :uint32 Number: + + Item album number + + Available if property Type is "audio" or "video" + + :uint32 Duration: + + Item duration in milliseconds + + Available if property Type is "audio" or "video" diff --git a/doc/org.bluez.MediaPlayer.rst b/doc/org.bluez.MediaPlayer.rst new file mode 100644 index 000000000000..60bd679bb7c0 --- /dev/null +++ b/doc/org.bluez.MediaPlayer.rst @@ -0,0 +1,315 @@ +===================== +org.bluez.MediaPlayer +===================== + +----------------------------------------- +BlueZ D-Bus MediaPlayer API documentation +----------------------------------------- + +:Version: BlueZ +:Date: September 2023 +:Manual section: 5 +:Manual group: Linux System Administration + +Interface +========= + +:Service: org.bluez (Controller role) +:Interface: org.bluez.MediaPlayer1 +:Object path: [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/playerX + +Methods +------- + +void Play() +``````````` + + Resume playback. + + Possible Errors: + + :org.bluez.Error.NotSupported: + :org.bluez.Error.Failed: + +void Pause() +```````````` + + Pause playback. + + Possible Errors: + + :org.bluez.Error.NotSupported: + :org.bluez.Error.Failed: + +void Stop() +``````````` + + Stop playback. + + Possible Errors: + + :org.bluez.Error.NotSupported: + :org.bluez.Error.Failed: + +void Next() +``````````` + + Next item. + + Possible Errors: + + :org.bluez.Error.NotSupported: + :org.bluez.Error.Failed: + +void Previous() +``````````````` + + Previous item. + + Possible Errors: + + :org.bluez.Error.NotSupported: + :org.bluez.Error.Failed: + +void FastForward() +`````````````````` + + Fast forward playback, this action is only stopped when another method + in this interface is called. + + Possible Errors: + + :org.bluez.Error.NotSupported: + :org.bluez.Error.Failed: + +void Rewind() +````````````` + + Rewind playback, this action is only stopped when another method in + this interface is called. + + Possible Errors: + + :org.bluez.Error.NotSupported: + :org.bluez.Error.Failed: + +void Press(byte avc_key) +```````````````````````` + + Press a specific key to send as passthrough command. The key will be + released automatically. Use Hold() instead if the intention is to hold + down the key. + + Possible Errors: + + :org.bluez.Error.InvalidArguments: + :org.bluez.Error.NotSupported: + :org.bluez.Error.Failed: + +void Hold(byte avc_key) +``````````````````````` + + Press and hold a specific key to send as passthrough command. It is + your responsibility to make sure that Release() is called after calling + this method. The held key will also be released when any other method + in this interface is called. + + Possible Errors: + + :org.bluez.Error.InvalidArguments: + :org.bluez.Error.NotSupported: + :org.bluez.Error.Failed: + +void Release() +`````````````` + + Release the previously held key invoked using Hold(). + + Possible Errors: + + :org.bluez.Error.NotSupported: + :org.bluez.Error.Failed: + +Properties +---------- + +string Equalizer [readwrite] +```````````````````````````` + + Indicates Player Equalizer setting. + + Possible values: + + :"off": + :"on": + +string Repeat [readwrite] +````````````````````````` + + Indicates Player Repeat setting. + + Possible values: + + :"off": + :"singletrack": + :"alltracks": + :"group": + +string Shuffle [readwrite] +`````````````````````````` + + Indicates Player Suffle setting. + + Possible values: + + :"off": + :"alltracks": + :"group": + +string Scan [readwrite] +``````````````````````` + + Indicates Player Scan setting. + + Possible values: + + :"off": + :"alltracks": + :"group": + +string Status [readonly] +```````````````````````` + + Indicates Player Status setting. + + Possible status: + + :"playing": + :"stopped": + :"paused": + :"forward-seek": + :"reverse-seek": + :"error": + +uint32 Position [readonly] +`````````````````````````` + + Playback position in milliseconds. Changing the position may generate + additional events that will be sent to the remote device. When position + is 0 it means the track is starting and when it's greater than or equal + to track's duration the track has ended. + + Note that even if duration is not available in metadata it's possible + to signal its end by setting position to the maximum uint32 value. + +dict Track [readonly] +````````````````````` + + Track metadata. + + Possible values: + + :string Title: + + Track title name + + :string Artist: + + Track artist name + + :string Album: + + Track album name + + :string Genre: + + Track genre name + + :uint32 NumberOfTracks: + + Number of tracks in total + + :uint32 TrackNumber: + + Track number + + :uint32 Duration: + + Track duration in milliseconds + +object Device [readonly] +```````````````````````` + + Device object path. + +string Name [readonly] +`````````````````````` + + Player name + +string Type [readonly] +`````````````````````` + + Player type + + Possible values: + + "Audio" + "Video" + "Audio Broadcasting" + "Video Broadcasting" + +string Subtype [readonly] +````````````````````````` + + Player subtype + + Possible values: + + "Audio Book" + "Podcast" + +boolean Browsable [readonly] +```````````````````````````` + + If present indicates the player can be browsed using MediaFolder + interface. + + Possible values: + + :True: + + Supported and active + + :False: + + Supported but inactive + + Note: If supported but inactive clients can enable it by using + MediaFolder interface but it might interfere in the playback of other + players. + +boolean Searchable [readonly] +````````````````````````````` + + If present indicates the player can be searched using MediaFolder + interface. + + Possible values: + + :True: + + Supported and active + + :False: + + Supported but inactive + + Note: If supported but inactive clients can enable it by using + MediaFolder interface but it might interfere in the playback of other + players. + +object Playlist +``````````````` + + Playlist object path. diff --git a/doc/org.bluez.MediaTransport.rst b/doc/org.bluez.MediaTransport.rst new file mode 100644 index 000000000000..6e95df8f2ee8 --- /dev/null +++ b/doc/org.bluez.MediaTransport.rst @@ -0,0 +1,274 @@ +======================== +org.bluez.MediaTransport +======================== + +-------------------------------------------- +BlueZ D-Bus MediaTransport API documentation +-------------------------------------------- + +:Version: BlueZ +:Date: September 2023 +:Manual section: 5 +:Manual group: Linux System Administration + +Interface +========= + +:Service: org.bluez +:Interface: org.bluez.MediaTransport1 +:Object path: [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/fdX + +Methods +------- + +fd, uint16, uint16 Acquire() +```````````````````````````` + + Acquire transport file descriptor and the MTU for read and write + respectively. + + Possible Errors: + + :org.bluez.Error.NotAuthorized: + :org.bluez.Error.Failed: + +fd, uint16, uint16 TryAcquire() +``````````````````````````````` + + Acquire transport file descriptor only if the transport is in "pending" + state at the time the message is received by BlueZ. Otherwise no request + will be sent to the remote device and the function will just fail with + org.bluez.Error.NotAvailable. + + Possible Errors: + + :org.bluez.Error.NotAuthorized: + :org.bluez.Error.Failed: + :org.bluez.Error.NotAvailable: + +void Release() +`````````````` + + Releases file descriptor. + +Properties +---------- + +object Device [readonly] +```````````````````````` + + Device object which the transport is connected to. + +string UUID [readonly] +`````````````````````` + + UUID of the profile which the transport is for. + +byte Codec [readonly] +````````````````````` + + Assigned number of codec that the transport support. + The values should match the profile specification which is indicated by + the UUID. + +array{byte} Configuration [readonly] +```````````````````````````````````` + + Configuration blob, it is used as it is so the size and byte order must + match. + +string State [readonly] +``````````````````````` + + Indicates the state of the transport. Possible values are: + + :"idle": not streaming + :"pending": streaming but not acquired + :"active": streaming and acquired + +uint16 Delay [readwrite, optional] +`````````````````````````````````` + + Transport delay in 1/10 of millisecond, this property is only writeable + when the transport was acquired by the sender. + +uint16 Volume [readwrite, optional] +``````````````````````````````````` + + Indicates volume level of the transport, this property is only writeable + when the transport was acquired by the sender. + + Possible Values: 0-127 + +object Endpoint [readonly, optional, experimental] +`````````````````````````````````````````````````` + + Endpoint object which the transport is associated with. + +uint32 Location [readonly, ISO only, experimental] +`````````````````````````````````````````````````` + + Indicates transport Audio Location. + +array{byte} Metadata [readwrite, ISO Only, experimental] +```````````````````````````````````````````````````````` + + Indicates transport Metadata. + +array{object} Links [readonly, optional, ISO only, experimental] +```````````````````````````````````````````````````````````````` + + Linked transport objects which the transport is associated with. + +dict QoS [readonly, optional, ISO only, experimental] +````````````````````````````````````````````````````` + + Only present when QoS is configured. + + Possible values for Unicast: + + :byte CIG: + + Indicates configured CIG. + + Possible values: + + :0x00 - 0xef: + + Valid ID range. + + :0xff: + + Auto allocate. + + :byte CIS: + + Indicates configured CIS. + + Possible values: + + :0x00 - 0xef: + + Valid ID range. + + :0xff: + + Auto allocate. + + :byte Framing: + + Indicates configured framing. + + Possible values: + + :0x00: + + Unframed. + + :0x01: + + Framed. + + :uint32 PresentationDelay: + + Indicates configured transport presentation delay (us). + + :byte TargetLatency: + + Indicates the requested target latency. + + Possible values: + + :0x01: + + Low Latency. + + :0x02: + + Balanced Latency/Reliability. + + :0x03: + + High Reliability. + + Possible values for Broadcast: + + :byte BIG: + + Indicates configured QoS BIG. + + :byte BIS: + + Indicates configured BIS. + + :byte SyncFactor: + + Indicates configured broadcast sync factor. + + :byte Packing: + + Indicates configured packing. + + :byte Framing: + + Indicates configured framing. + + :byte Options: + + Indicates configured broadcast options. + + :uint16 Skip: + + Indicates configured broadcast skip. + + :byte SyncTimeout: + + Indicates configured broadcast sync timeout. + + :byte SyncType: + + Indicates configured broadcast sync CTE type. + + :byte MSE: + + Indicates configured broadcast MSE. + + :uint16 Timeout: + + Indicates configured broadcast timeout. + + Possible values for both Unicast and Broadcast: + + :uint32 Interval: + + Indicates configured ISO interval (us). + + :uint16 Latency: + + Indicates configured transport latency (ms). + + :uint16 SDU: + + Indicates configured maximum SDU. + + :byte PHY: + + Indicates configured PHY. + + Possible values: + + :bit 0: + + LE 1M + + :bit 1: + + LE 2M + + :bit 2: + + LE Coded + + :byte Retransmissions: + + Indicates configured retransmissions. From patchwork Wed Sep 27 21:53:49 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 728234 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6D773E7109E for ; Wed, 27 Sep 2023 21:54:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229834AbjI0VyM (ORCPT ); Wed, 27 Sep 2023 17:54:12 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38064 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229511AbjI0VyL (ORCPT ); Wed, 27 Sep 2023 17:54:11 -0400 Received: from mail-io1-xd2d.google.com (mail-io1-xd2d.google.com [IPv6:2607:f8b0:4864:20::d2d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E1E2211F for ; Wed, 27 Sep 2023 14:54:08 -0700 (PDT) Received: by mail-io1-xd2d.google.com with SMTP id ca18e2360f4ac-79fb64b5265so317310439f.1 for ; Wed, 27 Sep 2023 14:54:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1695851647; x=1696456447; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=jwjHUPbdhZ0jdDmdOXswQrPccCOLqfWqLeXxUdDF1vI=; b=ZkHjZCKFw+XHeVxbpIkOwMZNSxvAF6nPRV6hiA5bVm4jgOsjuVXRTvExEla2s2+idU Je9DkRa470HvYVtgxZmiJ4Wa01kVY0tWYvOz1cbR8s7JKi0l7uFgIO6+DChl+4xTwmri /FtFMidJrw4O1/NodP4JRYFRPAovaV8XVzH5knCChFdYh0dyYK+6wntnl3dsGoqrANfe BCaYXBMFKwTE4EGdipRyoyRp11i7cPFrvm9iJ3HW1+GDcRD/jD6x+8SXe/xSFlE4nCqJ piMtEHO7WCwXEmpnnXpEbFim5KTM9/+5bTUrEmrhhEgyD38sBM9hwdLvb51fewEshuJd 8kwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695851647; x=1696456447; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=jwjHUPbdhZ0jdDmdOXswQrPccCOLqfWqLeXxUdDF1vI=; b=Z532YeZMQ0N0d0iwkt/ks3biSLRvuYWAhjD5BTiBrs6dvqzbVOO33pCmNYMM7eEcTI mHjmuTyPjYAv6nNatZbKdGiuCEoF0FJcKp0phWl5QNu1A+DaVRN9aj3jDiEnffn+CGau d+n1TTGJZHTuDKoL+43Xj6GhZbFgDDTLX1Lv0X1Ot9Vf9QM8ZfOkC8g2GhyXWcrGydew U7GmKROEYtf0CrYBR1S9NikXxTnrxUuIkxBmTsOyHtoXgj1RLdet1Irx5r4gH6pQ8BQd GXr+TfpTr6TDu7ze8xOcpz8nlvx76aQ/DGJZ9jCiF9abVkp+K9FlLL4+cGhkClx/SgRO Tqqg== X-Gm-Message-State: AOJu0YyRKjRsv/n1+KH/nSWOhS/ax6cgMiaFk/gcw4SlmoTf0zJxUfDV qI2V8FI6ya3TEHySW7FSh1loK/3nkzEctc9M X-Google-Smtp-Source: AGHT+IGiJnV+5DiGKlExSu2udJvZc821MhWqm7U6461Umm7zSqreNafrovAjE1AYqkixD1t1Jvk8tg== X-Received: by 2002:a6b:e015:0:b0:790:f866:d717 with SMTP id z21-20020a6be015000000b00790f866d717mr3822401iog.10.1695851647518; Wed, 27 Sep 2023 14:54:07 -0700 (PDT) Received: from lvondent-mobl4.. (c-98-232-221-87.hsd1.or.comcast.net. [98.232.221.87]) by smtp.gmail.com with ESMTPSA id g15-20020a02cd0f000000b0042bbfe3dc42sm4225331jaq.173.2023.09.27.14.54.06 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Sep 2023 14:54:06 -0700 (PDT) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH v4 07/12] shared/bap: Add support content and contexts to bt_bap_pac_qos Date: Wed, 27 Sep 2023 14:53:49 -0700 Message-ID: <20230927215354.1874835-7-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230927215354.1874835-1-luiz.dentz@gmail.com> References: <20230927215354.1874835-1-luiz.dentz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz This adds support for setting supported content and contexts on a per PAC record basis which then is carried over to their respective PACS attribute and notified properly when changed (added/removed). --- src/shared/bap.c | 168 ++++++++++++++++++++++++++++++++++++++++++++++- src/shared/bap.h | 3 + 2 files changed, 170 insertions(+), 1 deletion(-) diff --git a/src/shared/bap.c b/src/shared/bap.c index 1c43680c2457..6400d1d69221 100644 --- a/src/shared/bap.c +++ b/src/shared/bap.c @@ -2468,6 +2468,80 @@ static void bap_pac_free(void *data) free(pac); } +static void pacs_sink_location_changed(struct bt_pacs *pacs) +{ + uint32_t location = cpu_to_le32(pacs->sink_loc_value); + + gatt_db_attribute_notify(pacs->sink_loc, (void *)&location, + sizeof(location), NULL); +} + +static void pacs_add_sink_location(struct bt_pacs *pacs, uint32_t location) +{ + location |= pacs->sink_loc_value; + + /* Check if location value needs updating */ + if (location == pacs->sink_loc_value) + return; + + pacs->sink_loc_value = location; + + pacs_sink_location_changed(pacs); +} + +static void pacs_supported_context_changed(struct bt_pacs *pacs) +{ + struct bt_pacs_context ctx; + + memset(&ctx, 0, sizeof(ctx)); + + ctx.snk = cpu_to_le16(pacs->supported_sink_context_value); + ctx.src = cpu_to_le16(pacs->supported_source_context_value); + + gatt_db_attribute_notify(pacs->supported_context, (void *)&ctx, + sizeof(ctx), NULL); +} + +static void pacs_add_sink_supported_context(struct bt_pacs *pacs, + uint16_t context) +{ + context |= pacs->supported_sink_context_value; + + /* Check if context value needs updating */ + if (context == pacs->supported_sink_context_value) + return; + + pacs->supported_sink_context_value = context; + + pacs_supported_context_changed(pacs); +} + +static void pacs_context_changed(struct bt_pacs *pacs) +{ + struct bt_pacs_context ctx; + + memset(&ctx, 0, sizeof(ctx)); + + ctx.snk = cpu_to_le16(pacs->sink_context_value); + ctx.src = cpu_to_le16(pacs->source_context_value); + + gatt_db_attribute_notify(pacs->context, (void *)&ctx, sizeof(ctx), + NULL); +} + +static void pacs_add_sink_context(struct bt_pacs *pacs, uint16_t context) +{ + context |= pacs->supported_sink_context_value; + + /* Check if context value needs updating */ + if (context == pacs->sink_context_value) + return; + + pacs->sink_context_value = context; + + pacs_context_changed(pacs); +} + static void bap_add_sink(struct bt_bap_pac *pac) { struct iovec iov; @@ -2482,10 +2556,62 @@ static void bap_add_sink(struct bt_bap_pac *pac) queue_foreach(pac->bdb->sinks, pac_foreach, &iov); + pacs_add_sink_location(pac->bdb->pacs, pac->qos.location); + pacs_add_sink_supported_context(pac->bdb->pacs, + pac->qos.supported_context); + pacs_add_sink_context(pac->bdb->pacs, pac->qos.context); gatt_db_attribute_notify(pac->bdb->pacs->sink, iov.iov_base, iov.iov_len, NULL); } +static void pacs_source_location_changed(struct bt_pacs *pacs) +{ + uint32_t location = cpu_to_le32(pacs->source_loc_value); + + gatt_db_attribute_notify(pacs->source_loc, (void *)&location, + sizeof(location), NULL); +} + +static void pacs_add_source_location(struct bt_pacs *pacs, uint32_t location) +{ + location |= pacs->source_loc_value; + + /* Check if location value needs updating */ + if (location == pacs->source_loc_value) + return; + + pacs->source_loc_value = location; + + pacs_source_location_changed(pacs); +} + +static void pacs_add_source_supported_context(struct bt_pacs *pacs, + uint16_t context) +{ + context |= pacs->supported_source_context_value; + + /* Check if context value needs updating */ + if (context == pacs->supported_source_context_value) + return; + + pacs->supported_source_context_value = context; + + pacs_supported_context_changed(pacs); +} + +static void pacs_add_source_context(struct bt_pacs *pacs, uint16_t context) +{ + context |= pacs->supported_sink_context_value; + + /* Check if context value needs updating */ + if (context == pacs->sink_context_value) + return; + + pacs->sink_context_value = context; + + pacs_context_changed(pacs); +} + static void bap_add_source(struct bt_bap_pac *pac) { struct iovec iov; @@ -2500,6 +2626,11 @@ static void bap_add_source(struct bt_bap_pac *pac) queue_foreach(pac->bdb->sinks, pac_foreach, &iov); + pacs_add_source_location(pac->bdb->pacs, pac->qos.location); + pacs_add_source_supported_context(pac->bdb->pacs, + pac->qos.supported_context); + pacs_add_source_context(pac->bdb->pacs, pac->qos.context); + gatt_db_attribute_notify(pac->bdb->pacs->source, iov.iov_base, iov.iov_len, NULL); } @@ -2685,13 +2816,48 @@ static void remove_streams(void *data, void *user_data) bt_bap_stream_release(stream, NULL, NULL); } +static void bap_pac_sink_removed(void *data, void *user_data) +{ + struct bt_bap_pac *pac = data; + struct bt_bap_pac_qos *qos = user_data; + + qos->location |= pac->qos.location; + qos->supported_context |= pac->qos.supported_context; + qos->context |= pac->qos.context; +} + bool bt_bap_remove_pac(struct bt_bap_pac *pac) { if (!pac) return false; - if (queue_remove_if(pac->bdb->sinks, NULL, pac)) + if (queue_remove_if(pac->bdb->sinks, NULL, pac)) { + struct bt_pacs *pacs = pac->bdb->pacs; + struct bt_bap_pac_qos qos; + + memset(&qos, 0, sizeof(qos)); + queue_foreach(pac->bdb->sinks, bap_pac_sink_removed, &qos); + + if (pacs->sink_loc_value != qos.location) { + pacs->sink_loc_value = qos.location; + pacs_sink_location_changed(pacs); + } + + if (pacs->supported_sink_context_value != + qos.supported_context) { + pacs->supported_sink_context_value = + qos.supported_context; + pacs_supported_context_changed(pacs); + } + + if (pacs->sink_context_value != qos.context) { + pacs->sink_context_value = qos.context; + pacs_context_changed(pacs); + } + + goto found; + } if (queue_remove_if(pac->bdb->sources, NULL, pac)) goto found; diff --git a/src/shared/bap.h b/src/shared/bap.h index e4eae86502f3..72d6022a32ec 100644 --- a/src/shared/bap.h +++ b/src/shared/bap.h @@ -131,6 +131,9 @@ struct bt_bap_pac_qos { uint32_t pd_max; uint32_t ppd_min; uint32_t ppd_max; + uint32_t location; + uint16_t supported_context; + uint16_t context; }; struct bt_bap_pac *bt_bap_add_vendor_pac(struct gatt_db *db, From patchwork Wed Sep 27 21:53:50 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 726737 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D32D5E82CC0 for ; Wed, 27 Sep 2023 21:54:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229539AbjI0VyN (ORCPT ); Wed, 27 Sep 2023 17:54:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38126 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229825AbjI0VyM (ORCPT ); Wed, 27 Sep 2023 17:54:12 -0400 Received: from mail-il1-x135.google.com (mail-il1-x135.google.com [IPv6:2607:f8b0:4864:20::135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 63D43FC for ; Wed, 27 Sep 2023 14:54:11 -0700 (PDT) Received: by mail-il1-x135.google.com with SMTP id e9e14a558f8ab-352308c0799so3172215ab.2 for ; Wed, 27 Sep 2023 14:54:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1695851650; x=1696456450; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=kL7JlXE38q5GALyj8tUkwo5gHHH2hpnI7lnYRbb3EXA=; b=e3tkaCMrajVvjYtYkKY5KDriIuf7GP+Z4HUcuYE0nhplwaE5ySLMzpFNdypX95X158 SnhvCB5x+Ym2ghVnptchGN/RmqUUZ/1rfW48OfgpKLIURH9yyXtFZivZi2ye7Y5+ABEh wMveLl0neVAXQCxoTvtvUSn1yVQROY+EpYy4G6rGVr4tML+3S8FRXsRIT3hvN2ewUfb4 ElyC1CssjNdneYAuSRK5+sRNKBWPZ1Qi1sOPUgLpO68vwvDHnDT7cfMra7DvDp/9cfj9 uYUTYMqIK8Luo9itW5/mtzlwxKHAh41QzB+TDCU/DJxssfChEB1W0+lqA4gb3I7NmBNM fDsA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695851650; x=1696456450; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=kL7JlXE38q5GALyj8tUkwo5gHHH2hpnI7lnYRbb3EXA=; b=U6tuZvZl6+7WulBWuDafwhzxisgA8cnVutwxiNELqrx8nhtfz1dpJ+5KXNpYj1Mugv AtaCrdLkAloxuHF3+K1l99h6zDNytDI22mfBHPkCTZN6ot8yMvgHwYobtYgFGsJezA1D yf6Z51bjMy4tY3iLcx1W5rtgrZVVp4KNOk7J5/XycwgrVPjkNQNEbQangj/nByYDa4rU Zkmx/+A3YvjzyVnPnR4NHJdLNgsqT8gy5yzyxWfsR1zb7WQ2icicwjExRK/83wE+64NG vfzTElVgEARR5EUSO1wjgIPia2raRx5S7lMMemzhcXPwoa6V77ZlpEdqK1ORzxTaSFjt pLxQ== X-Gm-Message-State: AOJu0Yy1HzHpldHI7VlfsbPFWc485SOB1l3xn3e05Lt9i7Gt5I6GDbsT KZyYQd8G2Ed3vgr4dZsD4ztbNtxWQJFY/rEs X-Google-Smtp-Source: AGHT+IGd6uAfeJ8R40y7pojpzwDL3rkZ1gQ8yxhB56U350trejibN/S9rVYOYMdRmhqUgaUn9NBXMQ== X-Received: by 2002:a05:6e02:1b8e:b0:34d:ed17:8476 with SMTP id h14-20020a056e021b8e00b0034ded178476mr4439411ili.10.1695851650062; Wed, 27 Sep 2023 14:54:10 -0700 (PDT) Received: from lvondent-mobl4.. (c-98-232-221-87.hsd1.or.comcast.net. [98.232.221.87]) by smtp.gmail.com with ESMTPSA id g15-20020a02cd0f000000b0042bbfe3dc42sm4225331jaq.173.2023.09.27.14.54.07 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Sep 2023 14:54:08 -0700 (PDT) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH v4 08/12] doc/MediaEndpoint: Move QoS capabilities to its own dict property Date: Wed, 27 Sep 2023 14:53:50 -0700 Message-ID: <20230927215354.1874835-8-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230927215354.1874835-1-luiz.dentz@gmail.com> References: <20230927215354.1874835-1-luiz.dentz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz This moves QoS capabilities to its own dict property just as it was done for MediaTransport QoS configuration. --- doc/org.bluez.MediaEndpoint.rst | 172 ++++++++++++++------------------ 1 file changed, 77 insertions(+), 95 deletions(-) diff --git a/doc/org.bluez.MediaEndpoint.rst b/doc/org.bluez.MediaEndpoint.rst index cba8cb3edc6e..0e201ff9dc6a 100644 --- a/doc/org.bluez.MediaEndpoint.rst +++ b/doc/org.bluez.MediaEndpoint.rst @@ -41,57 +41,31 @@ void SetConfiguration(object transport, dict properties) See Metadata property. - :uint32 Location [ISO only]: + :dict QoS [ISO only]: - See Location property. - - :byte Framing [ISO only]: - - See Framing property. - - :byte PHY [ISO only]: - - See PHY property. - - :uint16 MaximumLatency [ISO only]: - - See MaximumLatency property. - - :uint32 MinimumDelay [ISO only]: - - See MinimumDelay property. - - :uint32 MaximumDelay [ISO only]: - - See MaximumDelay property. - - :uint32 PreferredMinimumDelay [ISO only]: - - See PreferredMinimumDelay property. - - :uint32 PreferredMaximumDelay [ISO only]: - - See PreferredMaximumDelay property. + See **org.bluez.MediaTransport(5)** QoS property. array{byte} SelectConfiguration(array{byte} capabilities) ````````````````````````````````````````````````````````` Select preferable configuration from the supported capabilities. - Returns a configuration which can be used to setup a transport. + Returns a configuration which can be used to setup a transport, see + **org.bluez.MediaTransport(5)** for possible values. Note: There is no need to cache the selected configuration since on success the configuration is send back as parameter of SetConfiguration. -dict SelectProperties(dict properties) -`````````````````````````````````````` +dict SelectProperties(dict capabilities) +```````````````````````````````````````` - Select preferable properties from the supported properties: + Select configuration from the supported capabilities: :object Endpoint [ISO only]: :Refer to SetConfiguration for the list of other possible properties.: - Returns propeties which can be used to setup a transport. + Returns a configuration which can be used to setup a transport, see + **org.bluez.MediaTransport(5)** for possible values. Note: There is no need to cache the selected properties since on success the configuration is send back as parameter of SetConfiguration. @@ -154,71 +128,79 @@ bool DelayReporting [readonly, optional] Indicates if endpoint supports Delay Reporting. -byte Framing [ISO only] -``````````````````````` - - Indicates endpoint support framing. - -byte PHY [ISO only] -``````````````````` - - Indicates endpoint supported PHY. - - Possible values: - - :bit 0: - - LE 1M - - :bit 1: - - LE 2M - - :bit 2: - - LE Coded - -byte Retransmissions [ISO only] -``````````````````````````````` - - Indicates endpoint preferred number of retransmissions. - -uint16_t MaximumLatency [ISO only] -`````````````````````````````````` - - Indicates endpoint maximum latency. - -uint32_t MinimumDelay [ISO only] -```````````````````````````````` - - Indicates endpoint minimum presentation delay. - -uint32_t MaximumDelay [ISO only] -```````````````````````````````` - - Indicates endpoint maximum presentation delay. - -uint32_t PreferredMinimumDelay [ISO only] -````````````````````````````````````````` - - Indicates endpoint preferred minimum presentation delay. - -uint32_t PreferredMaximumDelay [ISO only] -````````````````````````````````````````` - - Indicates endpoint preferred maximum presentation delay. - -uint32 Location [ISO only] -`````````````````````````` +uint32 Locations [readonly, optional, ISO only, experimental] +````````````````````````````````````````````````````````````` Indicates endpoint supported locations. -uint16 SupportedContext [ISO only] -`````````````````````````````````` +uint16 SupportedContext [readonly, optional, ISO only, experimental] +```````````````````````````````````````````````````````````````````` Indicates endpoint supported audio context. -uint16 Context [ISO only] -````````````````````````` +uint16 Context [readonly, optional, ISO only, experimental] +``````````````````````````````````````````````````````````` Indicates endpoint available audio context. + +dict QoS [readonly, optional, ISO only, experimental] +````````````````````````````````````````````````````` + + Indicates QoS capabilities. + + :byte Framing: + + Indicates endpoint support framing. + + + Possible Values: + + :0x00: + + Unframed PDUs supported. + + :0x01: + + Unframed PDUs not supported. + + :byte PHY: + + Indicates endpoint preferred PHY. + + Possible values: + + :bit 0: + + LE 1M preferred. + + :bit 1: + + LE 2M preferred. + + :bit 2: + + LE Coded preferred. + + :byte Retransmissions: + + Indicates endpoint preferred number of retransmissions. + + :uint16 MaximumLatency: + + Indicates endpoint maximum latency. + + :uint32 MinimumDelay: + + Indicates endpoint minimum presentation delay. + + :uint32 MaximumDelay: + + Indicates endpoint maximum presentation delay. + + :uint32 PreferredMinimumDelay: + + Indicates endpoint preferred minimum presentation delay. + + :uint32 PreferredMaximumDelay: + + Indicates endpoint preferred maximum presentation delay. From patchwork Wed Sep 27 21:53:51 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 728233 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D8585E82CC0 for ; Wed, 27 Sep 2023 21:54:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229717AbjI0VyR (ORCPT ); Wed, 27 Sep 2023 17:54:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38154 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229464AbjI0VyP (ORCPT ); Wed, 27 Sep 2023 17:54:15 -0400 Received: from mail-il1-x12f.google.com (mail-il1-x12f.google.com [IPv6:2607:f8b0:4864:20::12f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1EF45102 for ; Wed, 27 Sep 2023 14:54:13 -0700 (PDT) Received: by mail-il1-x12f.google.com with SMTP id e9e14a558f8ab-3512b425662so30401305ab.0 for ; Wed, 27 Sep 2023 14:54:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1695851651; x=1696456451; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=X07wSkLYOjKxHCw/p4ZSA9t+KzQYCv6DrtWZMUPxG3M=; b=ZDlD86O/aNfTsk9Ms9PYDlBctRI8f7k7F7byoMbiuMDNBSqTjDiRgKsGQG0rsW+5GJ pKMdMNAwXHPp/xsv8A0VTLDES+t4JrT6y0bczKITCXsLhqOB4mijSndvxs6SSqzajHnA 0RetFxbHcoZV39fhMxOhH3gDlDCKseZWwNXfm5u3mTWfp9m0NtDTdAMOb/F2BwCq9AjX tJDxV+WKjoyJACBo9m3zUYAMNlMItXdoPKCdQufjta0umUk79yK+VsC00Joy8Ux49C7X lY8QvekDMwgii2sFqP/ZzS62vtr7YYNrZ1zx5Ec/H9at+aFffOsZkG/726m04m4UP4Gl 2gQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695851651; x=1696456451; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=X07wSkLYOjKxHCw/p4ZSA9t+KzQYCv6DrtWZMUPxG3M=; b=OJ/z40RamzNY+GW89DyQPIQewJ/HMVbhc8Y+VH5vxM0NyFucOQYHA9oygvpZsHxeO9 cSN6ZSrU3JU/AmjzNXobGDbNUqmbJ3bJLMZsucwggWcERPOfuY2vU8kxO1Iq2fL0uWG4 e44iKp8Hlj+rLJUM8PzvGFA5j5Z5hhMZVVuywhJ+d6p5xxvx2gcDR1vs2Wr+l8g79H2b xjGplsLgAMjxHGHQ81Uh0jJTfOkh0Ld1uakxS2vKTJvjdZGTok7EGO0FbL1e4WuUnW1o yU3r2nlhPRt4J5EnCyFte9uYigVrcnpfccAzoK3pgaTLRp2PKQBI4SD1gr/FHEGOlSz5 81RQ== X-Gm-Message-State: AOJu0YwgykYPwZ5t8y1/cuvnOCHciMQorLnggBtqwhX6QpnIhEtcGL6Q Xn0jzxvjKkBr/Nfppm1VnOQFEeI1Cqn0VoXs X-Google-Smtp-Source: AGHT+IE8lHV9w/lmDWinlJPUqCdYiLPaSazAh9ukyphDijXKD6gCRTQjvR4wXO7WNXHFb0J0LQG2VQ== X-Received: by 2002:a05:6e02:1a88:b0:34f:203c:2432 with SMTP id k8-20020a056e021a8800b0034f203c2432mr4094729ilv.12.1695851651674; Wed, 27 Sep 2023 14:54:11 -0700 (PDT) Received: from lvondent-mobl4.. (c-98-232-221-87.hsd1.or.comcast.net. [98.232.221.87]) by smtp.gmail.com with ESMTPSA id g15-20020a02cd0f000000b0042bbfe3dc42sm4225331jaq.173.2023.09.27.14.54.10 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Sep 2023 14:54:10 -0700 (PDT) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH v4 09/12] shared/bap: Add support for location and contexts to bt_bap_pac_qos Date: Wed, 27 Sep 2023 14:53:51 -0700 Message-ID: <20230927215354.1874835-9-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230927215354.1874835-1-luiz.dentz@gmail.com> References: <20230927215354.1874835-1-luiz.dentz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz This adds support for location and contexts to bt_bap_pac_qos and function to read them. --- src/shared/bap.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++- src/shared/bap.h | 6 ++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/shared/bap.c b/src/shared/bap.c index 6400d1d69221..9e9ea1472029 100644 --- a/src/shared/bap.c +++ b/src/shared/bap.c @@ -2740,7 +2740,12 @@ uint8_t bt_bap_pac_get_type(struct bt_bap_pac *pac) uint32_t bt_bap_pac_get_locations(struct bt_bap_pac *pac) { - struct bt_pacs *pacs = pac->bdb->pacs; + struct bt_pacs *pacs; + + if (!pac) + return 0; + + pacs = pac->bdb->pacs; switch (pac->type) { case BT_BAP_SOURCE: @@ -2752,6 +2757,52 @@ uint32_t bt_bap_pac_get_locations(struct bt_bap_pac *pac) } } +uint16_t bt_bap_pac_get_supported_context(struct bt_bap_pac *pac) +{ + struct bt_pacs *pacs; + + if (!pac) + return 0; + + pacs = pac->bdb->pacs; + + switch (pac->type) { + case BT_BAP_SOURCE: + return pacs->supported_source_context_value; + case BT_BAP_SINK: + return pacs->supported_sink_context_value; + default: + return 0; + } +} + +uint16_t bt_bap_pac_get_context(struct bt_bap_pac *pac) +{ + struct bt_pacs *pacs; + + if (!pac) + return 0; + + pacs = pac->bdb->pacs; + + switch (pac->type) { + case BT_BAP_SOURCE: + return pacs->source_context_value; + case BT_BAP_SINK: + return pacs->sink_context_value; + default: + return 0; + } +} + +struct bt_bap_pac_qos *bt_bap_pac_get_qos(struct bt_bap_pac *pac) +{ + if (!pac || !pac->qos.phy) + return NULL; + + return &pac->qos; +} + uint8_t bt_bap_stream_get_type(struct bt_bap_stream *stream) { if (!stream) diff --git a/src/shared/bap.h b/src/shared/bap.h index 72d6022a32ec..ebe4dbf7d858 100644 --- a/src/shared/bap.h +++ b/src/shared/bap.h @@ -168,6 +168,12 @@ uint8_t bt_bap_pac_get_type(struct bt_bap_pac *pac); uint32_t bt_bap_pac_get_locations(struct bt_bap_pac *pac); +uint16_t bt_bap_pac_get_supported_context(struct bt_bap_pac *pac); + +uint16_t bt_bap_pac_get_context(struct bt_bap_pac *pac); + +struct bt_bap_pac_qos *bt_bap_pac_get_qos(struct bt_bap_pac *pac); + uint8_t bt_bap_stream_get_type(struct bt_bap_stream *stream); struct bt_bap_stream *bt_bap_pac_get_stream(struct bt_bap_pac *pac); From patchwork Wed Sep 27 21:53:52 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 726735 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B11B9E80ABC for ; Wed, 27 Sep 2023 21:54:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229862AbjI0VyT (ORCPT ); Wed, 27 Sep 2023 17:54:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41072 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229511AbjI0VyS (ORCPT ); Wed, 27 Sep 2023 17:54:18 -0400 Received: from mail-io1-xd30.google.com (mail-io1-xd30.google.com [IPv6:2607:f8b0:4864:20::d30]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E0556126 for ; Wed, 27 Sep 2023 14:54:14 -0700 (PDT) Received: by mail-io1-xd30.google.com with SMTP id ca18e2360f4ac-79fa7e33573so339879439f.0 for ; Wed, 27 Sep 2023 14:54:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1695851653; x=1696456453; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=YSqrbmz8Eq3eGURMTY5TQ64HOx9T7355kkPHfm/hu4M=; b=lZcEodLdvB/KiFuD+vUdwgrUf/lh+TzJvPwBbZKbjT8QReTtq2Sfr9SDl2kHfpbCFZ 8ULLsd1beHcXJQOz3Xf2hK3awQQIx+33fayEJOONFozVvXKfebaCosFHj/0NZGaRw9uX 3WMb7QqgRi21TFRuz2aqT9hrmVpKUFcbbjBZ80Tw0BOWbAHs0PvTOcJMShub7q7nJJkQ QA0xAvghvKNCH2MrlEDkeswtuPm3cvfcMmgV3TFbNoj16fHore89uu6SdXO+p5EpESTD QQo4vxuc3+e+Z3ZBHytHMiqRso+HQATMESdgThyA11LXTITV0LcWRSSrlk3+HC86lym2 1hNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695851653; x=1696456453; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=YSqrbmz8Eq3eGURMTY5TQ64HOx9T7355kkPHfm/hu4M=; b=d6/EEzCCs8EIVqfyfTHAAdFSCadmlv7PHeNuoNI68zsLCHjiWP4o5kQuXbtSXtJPqy DJewZx+uQOgxCW0Wl9CYeuXKAXiW5CkFVm7IlVDgG2jqhydSCd9dZro9zwdj1vZxC+cJ 2tCMJBqU+eYBzB2m5nGvwJ0n+NJ4m4bMf27vAOgcFQ9TxkWru70kj8qqD187IJ3v9EAB 2Wh352uqF+uyh8UgJnJlZrmPKympMhl0zBkeUHsM9RiZ0nA+PXBh+xRrXbpFThdUQoMw xdVCFkSi5A90vHDU0h8OnBNDDFHlkdjUVZ23uGB0pbIKj0mumzU9pHBqVHV570nhwyWK l1hg== X-Gm-Message-State: AOJu0YyOfzc1j0zZrGoQbbW7qWS4fuPBxTyni2Ah+/Iqw5k/QoEgwkYC oJXnZyNA2WbBFuW+oVlzGVnJiQWCPoSSeFqR X-Google-Smtp-Source: AGHT+IGchSgLeS36fQyrLISKfJbp4mlcFzHfVQL0a1kFkxFmObbAHgMeVOxBSiWk6pPeTkDZ1hmMOw== X-Received: by 2002:a05:6602:2187:b0:786:7100:72de with SMTP id b7-20020a056602218700b00786710072demr3261055iob.16.1695851653376; Wed, 27 Sep 2023 14:54:13 -0700 (PDT) Received: from lvondent-mobl4.. (c-98-232-221-87.hsd1.or.comcast.net. [98.232.221.87]) by smtp.gmail.com with ESMTPSA id g15-20020a02cd0f000000b0042bbfe3dc42sm4225331jaq.173.2023.09.27.14.54.11 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Sep 2023 14:54:12 -0700 (PDT) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH v4 10/12] bap: Add support for missing MediaEndpoint properties Date: Wed, 27 Sep 2023 14:53:52 -0700 Message-ID: <20230927215354.1874835-10-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230927215354.1874835-1-luiz.dentz@gmail.com> References: <20230927215354.1874835-1-luiz.dentz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz This adds support for Location, SupportedContext, Context and QoS properties. --- profiles/audio/bap.c | 409 ++++++++++++++++++++++++++++--------------- 1 file changed, 272 insertions(+), 137 deletions(-) diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c index ed02db40be8c..18872329d4ac 100644 --- a/profiles/audio/bap.c +++ b/profiles/audio/bap.c @@ -263,6 +263,88 @@ static gboolean get_device(const GDBusPropertyTable *property, return TRUE; } +static gboolean get_locations(const GDBusPropertyTable *property, + DBusMessageIter *iter, void *data) +{ + struct bap_ep *ep = data; + uint32_t locations = bt_bap_pac_get_locations(ep->rpac); + + dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &locations); + + return TRUE; +} + +static gboolean get_supported_context(const GDBusPropertyTable *property, + DBusMessageIter *iter, void *data) +{ + struct bap_ep *ep = data; + uint16_t context = bt_bap_pac_get_supported_context(ep->rpac); + + dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16, &context); + + return TRUE; +} + +static gboolean get_context(const GDBusPropertyTable *property, + DBusMessageIter *iter, void *data) +{ + struct bap_ep *ep = data; + uint16_t context = bt_bap_pac_get_context(ep->rpac); + + dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT16, &context); + + return TRUE; +} + +static gboolean qos_exists(const GDBusPropertyTable *property, void *data) +{ + struct bap_ep *ep = data; + struct bt_bap_pac_qos *qos; + + qos = bt_bap_pac_get_qos(ep->rpac); + if (!qos) + return FALSE; + + return TRUE; +} + +static gboolean get_qos(const GDBusPropertyTable *property, + DBusMessageIter *iter, void *data) +{ + struct bap_ep *ep = data; + struct bt_bap_pac_qos *qos; + DBusMessageIter dict; + + dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, + DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING + DBUS_TYPE_STRING_AS_STRING + DBUS_TYPE_VARIANT_AS_STRING + DBUS_DICT_ENTRY_END_CHAR_AS_STRING, + &dict); + + qos = bt_bap_pac_get_qos(ep->rpac); + if (!qos) + return FALSE; + + dict_append_entry(&dict, "Framing", DBUS_TYPE_BYTE, &qos->framing); + dict_append_entry(&dict, "PHY", DBUS_TYPE_BYTE, &qos->phy); + dict_append_entry(&dict, "Retransmissions", DBUS_TYPE_BYTE, &qos->rtn); + dict_append_entry(&dict, "MaximumLatency", DBUS_TYPE_UINT16, + &qos->latency); + dict_append_entry(&dict, "MimimumDelay", DBUS_TYPE_UINT32, + &qos->pd_min); + dict_append_entry(&dict, "MaximumDelay", DBUS_TYPE_UINT32, + &qos->pd_max); + dict_append_entry(&dict, "PreferredMimimumDelay", DBUS_TYPE_UINT32, + &qos->ppd_min); + dict_append_entry(&dict, "PreferredMaximumDelay", DBUS_TYPE_UINT32, + &qos->ppd_max); + + dbus_message_iter_close_container(iter, &dict); + + return TRUE; +} + static const GDBusPropertyTable ep_properties[] = { { "UUID", "s", get_uuid, NULL, NULL, G_DBUS_PROPERTY_FLAG_EXPERIMENTAL }, @@ -272,6 +354,14 @@ static const GDBusPropertyTable ep_properties[] = { G_DBUS_PROPERTY_FLAG_EXPERIMENTAL }, { "Device", "o", get_device, NULL, NULL, G_DBUS_PROPERTY_FLAG_EXPERIMENTAL }, + { "Locations", "u", get_locations, NULL, NULL, + G_DBUS_PROPERTY_FLAG_EXPERIMENTAL }, + { "SupportedContext", "q", get_supported_context, NULL, NULL, + G_DBUS_PROPERTY_FLAG_EXPERIMENTAL }, + { "Context", "q", get_context, NULL, NULL, + G_DBUS_PROPERTY_FLAG_EXPERIMENTAL }, + { "QoS", "a{sv}", get_qos, NULL, qos_exists, + G_DBUS_PROPERTY_FLAG_EXPERIMENTAL }, { } }; @@ -388,16 +478,182 @@ static bool parse_base(void *data, size_t len, util_debug_func_t func, return true; } -static int parse_properties(DBusMessageIter *props, struct iovec **caps, +static int parse_io_qos(const char *key, int var, DBusMessageIter *iter, + struct bt_bap_io_qos *qos) +{ + if (!strcasecmp(key, "Interval")) { + if (var != DBUS_TYPE_UINT32) + return -EINVAL; + + dbus_message_iter_get_basic(iter, &qos->interval); + } else if (!strcasecmp(key, "PHY")) { + if (var != DBUS_TYPE_BYTE) + return -EINVAL; + + dbus_message_iter_get_basic(iter, &qos->phy); + } else if (!strcasecmp(key, "SDU")) { + if (var != DBUS_TYPE_UINT16) + return -EINVAL; + + dbus_message_iter_get_basic(iter, &qos->sdu); + } else if (!strcasecmp(key, "Retransmissions")) { + if (var != DBUS_TYPE_BYTE) + return -EINVAL; + + dbus_message_iter_get_basic(iter, &qos->rtn); + } else if (!strcasecmp(key, "Latency")) { + if (var != DBUS_TYPE_UINT16) + return -EINVAL; + + dbus_message_iter_get_basic(iter, &qos->latency); + } + + return 0; +} + +static int parse_ucast_qos(const char *key, int var, DBusMessageIter *iter, + struct bt_bap_qos *qos) +{ + if (!strcasecmp(key, "CIG")) { + if (var != DBUS_TYPE_BYTE) + return -EINVAL; + + dbus_message_iter_get_basic(iter, &qos->ucast.cig_id); + } else if (!strcasecmp(key, "CIS")) { + if (var != DBUS_TYPE_BYTE) + return -EINVAL; + + dbus_message_iter_get_basic(iter, &qos->ucast.cis_id); + } else if (!strcasecmp(key, "Framing")) { + if (var != DBUS_TYPE_BYTE) + return -EINVAL; + + dbus_message_iter_get_basic(iter, &qos->ucast.framing); + } else if (!strcasecmp(key, "PresentationDelay")) { + if (var != DBUS_TYPE_UINT32) + return -EINVAL; + + dbus_message_iter_get_basic(iter, &qos->ucast.delay); + } else if (!strcasecmp(key, "TargetLatency")) { + if (var != DBUS_TYPE_BYTE) + return -EINVAL; + + dbus_message_iter_get_basic(iter, &qos->ucast.target_latency); + } else { + int err; + + err = parse_io_qos(key, var, iter, &qos->ucast.io_qos); + if (err) + return err; + } + + return 0; +} + +static int parse_bcast_qos(const char *key, int var, DBusMessageIter *iter, + struct bt_bap_qos *qos) +{ + if (!strcasecmp(key, "Encryption")) { + if (var != DBUS_TYPE_BYTE) + return -EINVAL; + + dbus_message_iter_get_basic(iter, &qos->bcast.encryption); + } else if (!strcasecmp(key, "Options")) { + if (var != DBUS_TYPE_BYTE) + return -EINVAL; + + dbus_message_iter_get_basic(iter, &qos->bcast.options); + } else if (!strcasecmp(key, "Skip")) { + if (var != DBUS_TYPE_UINT16) + return -EINVAL; + + dbus_message_iter_get_basic(iter, &qos->bcast.skip); + } else if (!strcasecmp(key, "SyncTimeout")) { + if (var != DBUS_TYPE_UINT16) + return -EINVAL; + + dbus_message_iter_get_basic(iter, &qos->bcast.sync_timeout); + } else if (!strcasecmp(key, "SyncType")) { + if (var != DBUS_TYPE_BYTE) + return -EINVAL; + + dbus_message_iter_get_basic(iter, &qos->bcast.sync_cte_type); + } else if (!strcasecmp(key, "SyncFactor")) { + if (var != DBUS_TYPE_BYTE) + return -EINVAL; + + dbus_message_iter_get_basic(iter, &qos->bcast.sync_factor); + } else if (!strcasecmp(key, "MSE")) { + if (var != DBUS_TYPE_BYTE) + return -EINVAL; + + dbus_message_iter_get_basic(iter, &qos->bcast.mse); + } else if (!strcasecmp(key, "Timeout")) { + if (var != DBUS_TYPE_UINT16) + return -EINVAL; + + dbus_message_iter_get_basic(iter, &qos->bcast.timeout); + } else if (!strcasecmp(key, "BCode")) { + if (var != DBUS_TYPE_ARRAY) + return -EINVAL; + + parse_array(iter, &qos->bcast.bcode); + } else { + int err; + + err = parse_io_qos(key, var, iter, &qos->bcast.io_qos); + if (err) + return err; + } + + return 0; +} + +static int parse_qos(DBusMessageIter *iter, struct bt_bap_qos *qos, + struct iovec **base) +{ + DBusMessageIter array; + const char *key; + int (*parser)(const char *key, int var, DBusMessageIter *iter, + struct bt_bap_qos *qos); + + if (*base) + parser = parse_bcast_qos; + else + parser = parse_ucast_qos; + + dbus_message_iter_recurse(iter, &array); + + while (dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_DICT_ENTRY) { + DBusMessageIter value, entry; + int var, err; + + dbus_message_iter_recurse(&array, &entry); + dbus_message_iter_get_basic(&entry, &key); + + dbus_message_iter_next(&entry); + dbus_message_iter_recurse(&entry, &value); + + var = dbus_message_iter_get_arg_type(&value); + + err = parser(key, var, &value, qos); + if (err) { + DBG("Failed parsing %s", key); + return err; + } + + dbus_message_iter_next(&array); + } + + return 0; +} + +static int parse_configuration(DBusMessageIter *props, struct iovec **caps, struct iovec **metadata, struct iovec **base, struct bt_bap_qos *qos) { const char *key; - struct bt_bap_io_qos io_qos; - uint8_t framing = 0; - bool broadcast = false; - memset(&io_qos, 0, sizeof(io_qos)); while (dbus_message_iter_get_arg_type(props) == DBUS_TYPE_DICT_ENTRY) { DBusMessageIter value, entry; int var; @@ -422,149 +678,26 @@ static int parse_properties(DBusMessageIter *props, struct iovec **caps, if (parse_array(&value, metadata)) goto fail; - } else if (!strcasecmp(key, "CIG")) { - if (var != DBUS_TYPE_BYTE) - goto fail; - - dbus_message_iter_get_basic(&value, &qos->ucast.cig_id); - } else if (!strcasecmp(key, "BIG")) { - if (var != DBUS_TYPE_BYTE) - goto fail; - - dbus_message_iter_get_basic(&value, &qos->bcast.big); - } else if (!strcasecmp(key, "CIS")) { - if (var != DBUS_TYPE_BYTE) - goto fail; - - dbus_message_iter_get_basic(&value, &qos->ucast.cis_id); - } else if (!strcasecmp(key, "BIS")) { - if (var != DBUS_TYPE_BYTE) - goto fail; - - dbus_message_iter_get_basic(&value, &qos->bcast.bis); - } else if (!strcasecmp(key, "Interval")) { - if (var != DBUS_TYPE_UINT32) - goto fail; - - dbus_message_iter_get_basic(&value, &io_qos.interval); - } else if (!strcasecmp(key, "Framing")) { - dbus_bool_t val; - - if (var != DBUS_TYPE_BOOLEAN) - goto fail; - - dbus_message_iter_get_basic(&value, &val); - - framing = val; - } else if (!strcasecmp(key, "PHY")) { - if (var != DBUS_TYPE_BYTE) - goto fail; - - dbus_message_iter_get_basic(&value, &io_qos.phy); - } else if (!strcasecmp(key, "SDU")) { - if (var != DBUS_TYPE_UINT16) - goto fail; - - dbus_message_iter_get_basic(&value, &io_qos.sdu); - } else if (!strcasecmp(key, "Retransmissions")) { - if (var != DBUS_TYPE_BYTE) - goto fail; - - dbus_message_iter_get_basic(&value, &io_qos.rtn); - } else if (!strcasecmp(key, "Latency")) { - if (var != DBUS_TYPE_UINT16) - goto fail; - - dbus_message_iter_get_basic(&value, &io_qos.latency); - } else if (!strcasecmp(key, "Delay")) { - if (var != DBUS_TYPE_UINT32) - goto fail; - - dbus_message_iter_get_basic(&value, &qos->ucast.delay); - } else if (!strcasecmp(key, "TargetLatency")) { - if (var != DBUS_TYPE_BYTE) - goto fail; - - dbus_message_iter_get_basic(&value, - &qos->ucast.target_latency); - } else if (!strcasecmp(key, "Encryption")) { - if (var != DBUS_TYPE_BYTE) - goto fail; - - dbus_message_iter_get_basic(&value, - &qos->bcast.encryption); - broadcast = true; - } else if (!strcasecmp(key, "Options")) { - if (var != DBUS_TYPE_BYTE) - goto fail; - - dbus_message_iter_get_basic(&value, - &qos->bcast.options); - } else if (!strcasecmp(key, "Skip")) { - if (var != DBUS_TYPE_UINT16) - goto fail; - - dbus_message_iter_get_basic(&value, - &qos->bcast.skip); - } else if (!strcasecmp(key, "SyncTimeout")) { - if (var != DBUS_TYPE_UINT16) - goto fail; - - dbus_message_iter_get_basic(&value, - &qos->bcast.sync_timeout); - } else if (!strcasecmp(key, "SyncCteType")) { - if (var != DBUS_TYPE_BYTE) - goto fail; - - dbus_message_iter_get_basic(&value, - &qos->bcast.sync_cte_type); - - } else if (!strcasecmp(key, "SyncInterval")) { - if (var != DBUS_TYPE_BYTE) - goto fail; - - dbus_message_iter_get_basic(&value, - &qos->bcast.sync_factor); - } else if (!strcasecmp(key, "MSE")) { - if (var != DBUS_TYPE_BYTE) - goto fail; - - dbus_message_iter_get_basic(&value, - &qos->bcast.mse); - } else if (!strcasecmp(key, "Timeout")) { - if (var != DBUS_TYPE_UINT16) - goto fail; - - dbus_message_iter_get_basic(&value, - &qos->bcast.timeout); - } else if (!strcasecmp(key, "BCode")) { + } else if (!strcasecmp(key, "QoS")) { if (var != DBUS_TYPE_ARRAY) goto fail; - parse_array(&value, &qos->bcast.bcode); + + if (parse_qos(&value, qos, base)) + goto fail; } dbus_message_iter_next(props); } - if (broadcast) { + if (*base) { uint32_t presDelay; uint8_t numSubgroups, numBis; struct bt_bap_codec codec; - memcpy(&qos->bcast.io_qos, &io_qos, sizeof(io_qos)); - qos->bcast.framing = framing; - - if (!base) - return 0; - if (!(*base)) - *base = new0(struct iovec, 1); util_iov_memcpy(*base, (*caps)->iov_base, (*caps)->iov_len); parse_base((*caps)->iov_base, (*caps)->iov_len, bap_debug, &presDelay, &numSubgroups, &numBis, &codec, caps, NULL); - } else { - memcpy(&qos->ucast.io_qos, &io_qos, sizeof(io_qos)); - qos->ucast.framing = framing; } return 0; @@ -686,9 +819,9 @@ static DBusMessage *set_configuration(DBusConnection *conn, DBusMessage *msg, ep->qos.ucast.cis_id = BT_ISO_QOS_CIS_UNSET; } - if (parse_properties(&props, &ep->caps, &ep->metadata, + if (parse_configuration(&props, &ep->caps, &ep->metadata, &ep->base, &ep->qos) < 0) { - DBG("Unable to parse properties"); + DBG("Unable to parse configuration"); return btd_error_invalid_args(msg); } @@ -855,7 +988,7 @@ static bool match_data_bap_data(const void *data, const void *match_data) static const GDBusMethodTable ep_methods[] = { { GDBUS_EXPERIMENTAL_ASYNC_METHOD("SetConfiguration", GDBUS_ARGS({ "endpoint", "o" }, - { "properties", "a{sv}" } ), + { "Configuration", "a{sv}" } ), NULL, set_configuration) }, { }, }; @@ -931,11 +1064,13 @@ static struct bap_ep *ep_register_bcast(struct bap_data *data, switch (bt_bap_pac_get_type(rpac)) { case BT_BAP_BCAST_SINK: err = asprintf(&ep->path, "%s/pac_%s%d", - adapter_get_path(adapter), suffix, i); + adapter_get_path(adapter), suffix, i); + ep->base = new0(struct iovec, 1); break; case BT_BAP_BCAST_SOURCE: err = asprintf(&ep->path, "%s/pac_%s%d", device_get_path(device), suffix, i); + ep->base = new0(struct iovec, 1); break; } From patchwork Wed Sep 27 21:53:53 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 728232 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4D699E7F14F for ; Wed, 27 Sep 2023 21:54:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229868AbjI0VyS (ORCPT ); Wed, 27 Sep 2023 17:54:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41060 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229825AbjI0VyR (ORCPT ); Wed, 27 Sep 2023 17:54:17 -0400 Received: from mail-io1-xd2c.google.com (mail-io1-xd2c.google.com [IPv6:2607:f8b0:4864:20::d2c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A1B82122 for ; Wed, 27 Sep 2023 14:54:16 -0700 (PDT) Received: by mail-io1-xd2c.google.com with SMTP id ca18e2360f4ac-79f96f83270so385563439f.1 for ; Wed, 27 Sep 2023 14:54:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1695851655; x=1696456455; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=KV4ZorwYJLjRQxEs+/Y5/kmw2P0hzFQxubwf3sPfIIU=; b=DL91ruhWgJynaLuvElgFms9K1KO+55ds4OuHecFVTRgBq+kts2/XwTChDYseKoWfAx FJ7DYb+QLfSY5UxrOC2n2iapLGI1ZMBkFXNBuhYUaQXipP+0O2HD94DJCcZiWDBFh8TU qGtZYCgzF5+zziueWfD1GzaLmcFX5OFUVKAI/p3mtMC13RgdEw8zeCF66ziRYnbeNbUb AbDcdmhTsov8w8D0k479gIQgaxs97Rglvhf6cbc/2LjBBbhbxNJxmj5USMI5bqDpYNIR i0ka/zWe64so8BrAm5YAyhe0NDTdj5jWpAVE3UXNNlBhFHgRo4MG8JrkynlyC3fDQWaL CAMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695851655; x=1696456455; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=KV4ZorwYJLjRQxEs+/Y5/kmw2P0hzFQxubwf3sPfIIU=; b=sui/JuLFiTy4cWWUrFs88gbt18muuc/L10cnRD7e32xaiFp5iVLD8JUeKRkAFwkqNM 9F/V8SXbyfTBumr6EBX1HHFGtu0SqCxY9kp/oATYR2qXjIrOhUafJsawTA8QRfBUHr6b X19tb+LiF9pcmwyGSQTluDhT+AR2R/dEErYyQyWcDdT/nU2JIdjK9dIVvAAV95pYt3SJ TmO2S3KxPgYxSXPdlFHukUoEzNax+0J5YqHBrHCeYFRSskBstaojPkksCoV+s5xILH0G tSaRYbDPEdVRjSvln13QUaykCyAMnuPELKEO0R5zbsFgLhU10l+Itxtyzc9XrqAoSFcU H+Jw== X-Gm-Message-State: AOJu0YxucrL5TrVgBnr8T5dzR7/QQmYKlshRXFP/OuHHH0zwXFT5cQW/ ARCaGFbPfN9lry7zs1ljXkZxVuEXrM3Xx430 X-Google-Smtp-Source: AGHT+IHoHgDu0OZU86v/X/y7eb8Rj7MD9+RheCk90krqYQ62cx/jRBuRHWjmMnt5ySpl0Qi1ENraWQ== X-Received: by 2002:a05:6e02:b4a:b0:34f:234d:4b5a with SMTP id f10-20020a056e020b4a00b0034f234d4b5amr4141721ilu.29.1695851655261; Wed, 27 Sep 2023 14:54:15 -0700 (PDT) Received: from lvondent-mobl4.. (c-98-232-221-87.hsd1.or.comcast.net. [98.232.221.87]) by smtp.gmail.com with ESMTPSA id g15-20020a02cd0f000000b0042bbfe3dc42sm4225331jaq.173.2023.09.27.14.54.13 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Sep 2023 14:54:14 -0700 (PDT) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH v4 11/12] client: Make endpoint.show print ISO specific capabilities Date: Wed, 27 Sep 2023 14:53:53 -0700 Message-ID: <20230927215354.1874835-11-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230927215354.1874835-1-luiz.dentz@gmail.com> References: <20230927215354.1874835-1-luiz.dentz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz This makes endpoint.show print Locations, SupportedContext, Context and Qos capabilities. --- client/player.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/player.c b/client/player.c index 6953eff28543..d1809f24fd27 100644 --- a/client/player.c +++ b/client/player.c @@ -2142,6 +2142,10 @@ static void cmd_show_endpoint(int argc, char *argv[]) print_property(proxy, "Capabilities"); print_property(proxy, "Device"); print_property(proxy, "DelayReporting"); + print_property(proxy, "Locations"); + print_property(proxy, "SupportedContext"); + print_property(proxy, "Context"); + print_property(proxy, "QoS"); return bt_shell_noninteractive_quit(EXIT_SUCCESS); } From patchwork Wed Sep 27 21:53:54 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luiz Augusto von Dentz X-Patchwork-Id: 728231 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5ED06E80A8A for ; Wed, 27 Sep 2023 21:54:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229926AbjI0VyV (ORCPT ); Wed, 27 Sep 2023 17:54:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41148 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229672AbjI0VyU (ORCPT ); Wed, 27 Sep 2023 17:54:20 -0400 Received: from mail-il1-x12b.google.com (mail-il1-x12b.google.com [IPv6:2607:f8b0:4864:20::12b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6A54AFB for ; Wed, 27 Sep 2023 14:54:18 -0700 (PDT) Received: by mail-il1-x12b.google.com with SMTP id e9e14a558f8ab-34fe6722847so36423875ab.1 for ; Wed, 27 Sep 2023 14:54:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1695851657; x=1696456457; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=UZDbId/Oq6bQoYjYM1BCQT82RB8NkOnAtSqUmB0Kd0w=; b=K3OoYXiezlxH0q5E/nc5PlxjUJzR/SDdme+slnHrTaSvADuxUi5bwVOOJ1dFpCOc0t +I8YDdX+1k5op5se8dGbHqLJcWOIlloT0eu39WNETu4ByPxSwN6M57oqJjnhA82DIOKk ph7mo+XT9axhBjPVnql0P56KprJ83X/djonI1r6N4h1DcNOi3V1cvk+qbxu//4D+8bTM OFNLGwLJ6nDp5fH2LA1oxpkwyWMz1gGtlPMO3vPBwqIWrlJlUDijD21/HiajUL9fb03n U86nU1Ks0rYLnnraTjSY4RJqkvlQNfpSizCtfmh9VxZwIhe8nPMVYnwacJLZ9QFf+qFW oy+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695851657; x=1696456457; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=UZDbId/Oq6bQoYjYM1BCQT82RB8NkOnAtSqUmB0Kd0w=; b=g6Xl/yBenatRN/EdzdVH5iarjCTGnDET9hIH8wIvWvhS/jdHSKDSGVLpEYv44kOJz8 d/uvHOcVZeSY2KDmSyLz34yVx1LiIO/hBdHDldSEWBW08EaLFEUAk8pTzK1mYtub9bBv 63UozhRxHXhswYAZ/gLwxxebQJ6X+UrZIpGiNEBDcgScVrCjMUBewBtMFnylwYpxtYfS nbVaYnXvvq8wI95JbFb7lvpp2Wfa/oMKuWFa28HWZnwBGJDx7z1wdfy7YAOvLxox2OJv iTOnXCsM3TrgQ/OWc8zAntM8xll8WWDfUoe45f0d40okfeL6N3Cqw9yn7QHGwwBLcav1 1IXg== X-Gm-Message-State: AOJu0Yx/DPFBpwKvqBpXckXSPCUgLoVNudNxPaXtO1uoQl9+4Z9zQBJL wkhW+0g3dkW5bcZlRK/YYuhNzWisdyPYG+H6 X-Google-Smtp-Source: AGHT+IEygfl+qJYPRQ/U4XbJfPBnTWPCDPZeOKGiUJ0W75EsN3CuSo3LlDR8UtqGjkCn1z6xWfCTkQ== X-Received: by 2002:a05:6e02:1c07:b0:34f:20d9:74a9 with SMTP id l7-20020a056e021c0700b0034f20d974a9mr7650964ilh.11.1695851656915; Wed, 27 Sep 2023 14:54:16 -0700 (PDT) Received: from lvondent-mobl4.. (c-98-232-221-87.hsd1.or.comcast.net. [98.232.221.87]) by smtp.gmail.com with ESMTPSA id g15-20020a02cd0f000000b0042bbfe3dc42sm4225331jaq.173.2023.09.27.14.54.15 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Sep 2023 14:54:15 -0700 (PDT) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH v4 12/12] bap: Fix freeing value of dbus_message_iter_get_fixed_array Date: Wed, 27 Sep 2023 14:53:54 -0700 Message-ID: <20230927215354.1874835-12-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230927215354.1874835-1-luiz.dentz@gmail.com> References: <20230927215354.1874835-1-luiz.dentz@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz The value returned by dbus_message_iter_get_fixed_array is a reference and shall not be freed: 'The returned value is by reference and should not be freed.' --- profiles/audio/bap.c | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c index 18872329d4ac..48a1a4f86f8d 100644 --- a/profiles/audio/bap.c +++ b/profiles/audio/bap.c @@ -365,19 +365,17 @@ static const GDBusPropertyTable ep_properties[] = { { } }; -static int parse_array(DBusMessageIter *iter, struct iovec **iov) +static int parse_array(DBusMessageIter *iter, struct iovec *iov) { DBusMessageIter array; if (!iov) return 0; - if (!(*iov)) - *iov = new0(struct iovec, 1); - dbus_message_iter_recurse(iter, &array); - dbus_message_iter_get_fixed_array(&array, &(*iov)->iov_base, - (int *)&(*iov)->iov_len); + dbus_message_iter_get_fixed_array(&array, &iov->iov_base, + (int *)&iov->iov_len); + return 0; } @@ -594,10 +592,15 @@ static int parse_bcast_qos(const char *key, int var, DBusMessageIter *iter, dbus_message_iter_get_basic(iter, &qos->bcast.timeout); } else if (!strcasecmp(key, "BCode")) { + struct iovec iov; + if (var != DBUS_TYPE_ARRAY) return -EINVAL; - parse_array(iter, &qos->bcast.bcode); + parse_array(iter, &iov); + + util_iov_free(qos->bcast.bcode, 1); + qos->bcast.bcode = util_iov_dup(&iov, 1); } else { int err; @@ -653,6 +656,9 @@ static int parse_configuration(DBusMessageIter *props, struct iovec **caps, struct bt_bap_qos *qos) { const char *key; + struct iovec iov; + + memset(&iov, 0, sizeof(iov)); while (dbus_message_iter_get_arg_type(props) == DBUS_TYPE_DICT_ENTRY) { DBusMessageIter value, entry; @@ -670,14 +676,20 @@ static int parse_configuration(DBusMessageIter *props, struct iovec **caps, if (var != DBUS_TYPE_ARRAY) goto fail; - if (parse_array(&value, caps)) + if (parse_array(&value, &iov)) goto fail; + + util_iov_free(*caps, 1); + *caps = util_iov_dup(&iov, 1); } else if (!strcasecmp(key, "Metadata")) { if (var != DBUS_TYPE_ARRAY) goto fail; - if (parse_array(&value, metadata)) + if (parse_array(&value, &iov)) goto fail; + + util_iov_free(*metadata, 1); + *metadata = util_iov_dup(&iov, 1); } else if (!strcasecmp(key, "QoS")) { if (var != DBUS_TYPE_ARRAY) goto fail; @@ -1202,6 +1214,7 @@ static void select_cb(struct bt_bap_pac *pac, int err, struct iovec *caps, goto done; } + util_iov_free(ep->caps, 1); ep->caps = util_iov_dup(caps, 1); if (metadata && metadata->iov_base && metadata->iov_len) {