From: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
To: linux-bluetooth@vger.kernel.org
Subject: [PATCH v3 3/4] a2dp: Store Delay Reporting capability
Date: Tue, 19 May 2020 13:03:44 -0700 [thread overview]
Message-ID: <20200519200345.217345-3-luiz.dentz@gmail.com> (raw)
In-Reply-To: <20200519200345.217345-1-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This stores Delay Reporting capability so it is properly restored when
loading from cache.
---
profiles/audio/a2dp.c | 46 ++++++++++++++++++++++++++++++++----------
profiles/audio/avdtp.c | 13 ++++++++++--
profiles/audio/avdtp.h | 5 ++++-
3 files changed, 50 insertions(+), 14 deletions(-)
diff --git a/profiles/audio/a2dp.c b/profiles/audio/a2dp.c
index 15e211b95..0d877b132 100644
--- a/profiles/audio/a2dp.c
+++ b/profiles/audio/a2dp.c
@@ -1847,11 +1847,25 @@ static gboolean get_device(const GDBusPropertyTable *property,
return TRUE;
}
+static gboolean get_delay_reporting(const GDBusPropertyTable *property,
+ DBusMessageIter *iter, void *data)
+{
+ struct a2dp_remote_sep *sep = data;
+ dbus_bool_t delay_report;
+
+ delay_report = avdtp_get_delay_reporting(sep->sep);
+
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &delay_report);
+
+ return TRUE;
+}
+
static const GDBusPropertyTable sep_properties[] = {
{ "UUID", "s", get_uuid, NULL, NULL },
{ "Codec", "y", get_codec, NULL, NULL },
{ "Capabilities", "ay", get_capabilities, NULL, NULL },
{ "Device", "o", get_device, NULL, NULL },
+ { "DelayReporting", "b", get_delay_reporting, NULL, NULL },
{ }
};
@@ -1942,6 +1956,7 @@ static void load_remote_sep(struct a2dp_channel *chan, GKeyFile *key_file,
for (; *seids; seids++) {
uint8_t type;
uint8_t codec;
+ uint8_t delay_reporting;
GSList *l = NULL;
char caps[256];
uint8_t data[128];
@@ -1955,11 +1970,17 @@ static void load_remote_sep(struct a2dp_channel *chan, GKeyFile *key_file,
if (!value)
continue;
- if (sscanf(value, "%02hhx:%02hhx:%s", &type, &codec,
+ /* Try loading with delay_reporting first */
+ if (sscanf(value, "%02hhx:%02hhx:%02hhx:%s", &type, &codec,
+ &delay_reporting, caps) != 4) {
+ /* Try old format */
+ if (sscanf(value, "%02hhx:%02hhx:%s", &type, &codec,
caps) != 3) {
- warn("Unable to load Endpoint: seid %u", rseid);
- g_free(value);
- continue;
+ warn("Unable to load Endpoint: seid %u", rseid);
+ g_free(value);
+ continue;
+ }
+ delay_reporting = false;
}
for (i = 0, size = strlen(caps); i < size; i += 2) {
@@ -1979,7 +2000,8 @@ static void load_remote_sep(struct a2dp_channel *chan, GKeyFile *key_file,
caps_add_codec(&l, codec, data, size / 2);
- rsep = avdtp_register_remote_sep(chan->session, rseid, type, l);
+ rsep = avdtp_register_remote_sep(chan->session, rseid, type, l,
+ delay_reporting);
if (!rsep) {
warn("Unable to register Endpoint: seid %u", rseid);
continue;
@@ -2605,7 +2627,7 @@ static struct queue *a2dp_select_eps(struct avdtp *session, uint8_t type,
static void store_remote_sep(void *data, void *user_data)
{
struct a2dp_remote_sep *sep = data;
- GKeyFile *key_file = (void *) user_data;
+ GKeyFile *key_file = user_data;
char seid[4], value[256];
struct avdtp_service_capability *service = avdtp_get_codec(sep->sep);
struct avdtp_media_codec_capability *codec = (void *) service->data;
@@ -2614,13 +2636,13 @@ static void store_remote_sep(void *data, void *user_data)
sprintf(seid, "%02hhx", avdtp_get_seid(sep->sep));
- offset = sprintf(value, "%02hhx:%02hhx:", avdtp_get_type(sep->sep),
- codec->media_codec_type);
+ offset = sprintf(value, "%02hhx:%02hhx:%02hhx:",
+ avdtp_get_type(sep->sep), codec->media_codec_type,
+ avdtp_get_delay_reporting(sep->sep));
for (i = 0; i < service->length - sizeof(*codec); i++)
offset += sprintf(value + offset, "%02hhx", codec->data[i]);
-
g_key_file_set_string(key_file, "Endpoints", seid, value);
}
@@ -2644,7 +2666,8 @@ static void store_remote_seps(struct a2dp_channel *chan)
key_file = g_key_file_new();
g_key_file_load_from_file(key_file, filename, 0, NULL);
- data = g_key_file_get_string(key_file, "Endpoints", "LastUsed", NULL);
+ data = g_key_file_get_string(key_file, "Endpoints", "LastUsed",
+ NULL);
/* Remove current endpoints since it might have changed */
g_key_file_remove_group(key_file, "Endpoints", NULL);
@@ -2652,7 +2675,8 @@ static void store_remote_seps(struct a2dp_channel *chan)
queue_foreach(chan->seps, store_remote_sep, key_file);
if (data) {
- g_key_file_set_string(key_file, "Endpoints", "LastUsed", data);
+ g_key_file_set_string(key_file, "Endpoints", "LastUsed",
+ data);
g_free(data);
}
diff --git a/profiles/audio/avdtp.c b/profiles/audio/avdtp.c
index 1fd2be051..45727f01e 100644
--- a/profiles/audio/avdtp.c
+++ b/profiles/audio/avdtp.c
@@ -3210,6 +3210,11 @@ struct avdtp_service_capability *avdtp_get_codec(struct avdtp_remote_sep *sep)
return sep->codec;
}
+bool avdtp_get_delay_reporting(struct avdtp_remote_sep *sep)
+{
+ return sep->delay_reporting;
+}
+
struct avdtp_service_capability *avdtp_service_cap_new(uint8_t category,
void *data, int length)
{
@@ -3229,7 +3234,8 @@ struct avdtp_service_capability *avdtp_service_cap_new(uint8_t category,
struct avdtp_remote_sep *avdtp_register_remote_sep(struct avdtp *session,
uint8_t seid,
uint8_t type,
- GSList *caps)
+ GSList *caps,
+ bool delay_reporting)
{
struct avdtp_remote_sep *sep;
GSList *l;
@@ -3244,6 +3250,7 @@ struct avdtp_remote_sep *avdtp_register_remote_sep(struct avdtp *session,
sep->type = type;
sep->media_type = AVDTP_MEDIA_TYPE_AUDIO;
sep->caps = caps;
+ sep->delay_reporting = delay_reporting;
for (l = caps; l; l = g_slist_next(l)) {
struct avdtp_service_capability *cap = l->data;
@@ -3252,7 +3259,9 @@ struct avdtp_remote_sep *avdtp_register_remote_sep(struct avdtp *session,
sep->codec = cap;
}
- DBG("seid %d type %d media %d", sep->seid, sep->type, sep->media_type);
+ DBG("seid %d type %d media %d delay_reporting %s", sep->seid, sep->type,
+ sep->media_type,
+ sep->delay_reporting ? "true" : "false");
return sep;
}
diff --git a/profiles/audio/avdtp.h b/profiles/audio/avdtp.h
index f1e51d4e3..011fea89e 100644
--- a/profiles/audio/avdtp.h
+++ b/profiles/audio/avdtp.h
@@ -226,7 +226,8 @@ struct avdtp_service_capability *avdtp_service_cap_new(uint8_t category,
struct avdtp_remote_sep *avdtp_register_remote_sep(struct avdtp *session,
uint8_t seid,
uint8_t type,
- GSList *caps);
+ GSList *caps,
+ bool delay_reporting);
uint8_t avdtp_get_seid(struct avdtp_remote_sep *sep);
@@ -234,6 +235,8 @@ uint8_t avdtp_get_type(struct avdtp_remote_sep *sep);
struct avdtp_service_capability *avdtp_get_codec(struct avdtp_remote_sep *sep);
+bool avdtp_get_delay_reporting(struct avdtp_remote_sep *sep);
+
int avdtp_discover(struct avdtp *session, avdtp_discover_cb_t cb,
void *user_data);
--
2.25.3
next prev parent reply other threads:[~2020-05-19 20:03 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-19 20:03 [PATCH v3 1/4] a2dp: Fix caching endpoints for unknown version Luiz Augusto von Dentz
2020-05-19 20:03 ` [PATCH v3 2/4] doc/media-api: Add documentation for DelayReporting Luiz Augusto von Dentz
2020-05-19 20:03 ` Luiz Augusto von Dentz [this message]
2020-05-19 20:03 ` [PATCH v3 4/4] doc/settings-storage: Update documentation of Endpoints Luiz Augusto von Dentz
2020-05-19 20:39 ` [v3,1/4] a2dp: Fix caching endpoints for unknown version bluez.test.bot
2020-05-19 21:06 ` Luiz Augusto von Dentz
2020-05-19 21:43 ` An, Tedd
2020-05-21 16:22 ` [PATCH v3 1/4] " Luiz Augusto von Dentz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200519200345.217345-3-luiz.dentz@gmail.com \
--to=luiz.dentz@gmail.com \
--cc=linux-bluetooth@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).