a2dp: Store Delay Reporting capability 86/237186/1
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Mon, 18 May 2020 20:02:03 +0000 (13:02 -0700)
committerWootak Jung <wootak.jung@samsung.com>
Fri, 26 Jun 2020 01:03:35 +0000 (10:03 +0900)
This stores Delay Reporting capability so it is properly restored when
loading from cache.

Change-Id: Iaa25bb13efb2d64f719e7213e13211daabf5f981
Signed-off-by: Wootak Jung <wootak.jung@samsung.com>
profiles/audio/a2dp.c
profiles/audio/avdtp.c
profiles/audio/avdtp.h

index 08b63f4..31b523a 100644 (file)
@@ -1926,11 +1926,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 },
        { }
 };
 
@@ -2021,6 +2035,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];
@@ -2034,11 +2049,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) {
@@ -2058,7 +2079,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;
@@ -2761,7 +2783,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;
@@ -2770,13 +2792,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);
 }
 
@@ -2800,7 +2822,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);
@@ -2808,7 +2831,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);
        }
 
index 6238d7e..13ceeb7 100644 (file)
@@ -3702,6 +3702,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)
 {
@@ -3721,7 +3726,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;
@@ -3736,6 +3742,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;
@@ -3744,7 +3751,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;
 }
index e777178..9039051 100755 (executable)
@@ -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);