This patch changes the internal representation of the supported codecs.
Codecs are being declared in a sequentialily, represent the supported
codecs as bit-field helps to check for supported codecs and in some
cases it avoids dupplicated codec entries.
---
 src/handsfree-audio.c | 42 +++++++++++++++++++++++++++++-------------
 1 file changed, 29 insertions(+), 13 deletions(-)

diff --git a/src/handsfree-audio.c b/src/handsfree-audio.c
index 0eb5c70..c0e644c 100644
--- a/src/handsfree-audio.c
+++ b/src/handsfree-audio.c
@@ -44,9 +44,11 @@
 #define HFP_AUDIO_CARD_INTERFACE       OFONO_SERVICE ".HandsfreeAudioCard"
 
 /* Supported agent codecs */
+#define MAX_SUPPORTED_CODECS           2
 enum hfp_codec {
        HFP_CODEC_CVSD = 0x01,
        HFP_CODEC_MSBC = 0x02,
+       HFP_CODEC_LAST = HFP_CODEC_MSBC,
 };
 
 struct ofono_handsfree_card {
@@ -63,8 +65,7 @@ struct ofono_handsfree_card {
 struct agent {
        char *owner;
        char *path;
-       unsigned char *codecs;
-       int codecs_len;
+       uint32_t codecs_bitmask;
        guint watch;
 };
 
@@ -74,6 +75,16 @@ static GSList *card_list = 0;
 static guint sco_watch = 0;
 static GSList *g_drivers = NULL;
 
+static inline void set_bit(int nr, void *addr)
+{
+       *((uint32_t *) addr + (nr >> 5)) |= (1 << (nr & 31));
+}
+
+static inline int test_bit(int nr, void *addr)
+{
+       return *((uint32_t *) addr + (nr >> 5)) & (1 << (nr & 31));
+}
+
 static void send_new_connection(const char *card, int fd, uint8_t codec)
 {
        DBusMessage *msg;
@@ -476,15 +487,20 @@ int ofono_handsfree_card_select_codec(struct 
ofono_handsfree_card *card,
 
 int ofono_handsfree_get_codecs(unsigned char *buffer, int buffer_len)
 {
-       int len;
+       unsigned char codecs[MAX_SUPPORTED_CODECS];
+       int i, j, min;
 
        if (agent == NULL)
                return -EIO;
 
-       len = MIN(buffer_len, agent->codecs_len);
-       memcpy(buffer, agent->codecs, len);
+       for (i = 0, j = 0; i <= HFP_CODEC_LAST; i++)
+               if (test_bit(i, &agent->codecs_bitmask))
+                       codecs[j++] = i;
+
+       min = MIN(buffer_len, j);
+       memcpy(buffer, codecs, min);
 
-       return len;
+       return min;
 }
 
 static void agent_free(struct agent *agent)
@@ -494,7 +510,6 @@ static void agent_free(struct agent *agent)
 
        g_free(agent->owner);
        g_free(agent->path);
-       g_free(agent->codecs);
        g_free(agent);
 }
 
@@ -572,7 +587,7 @@ static DBusMessage *am_agent_register(DBusConnection *conn,
        unsigned char *codecs;
        DBusMessageIter iter, array;
        int length, i;
-       gboolean has_cvsd = FALSE;
+       uint32_t codecs_bitmask = 0;
 
        if (agent)
                return __ofono_error_in_use(msg);
@@ -593,12 +608,14 @@ static DBusMessage *am_agent_register(DBusConnection 
*conn,
 
        for (i = 0; i < length; i++) {
                if (codecs[i] == HFP_CODEC_CVSD)
-                       has_cvsd = TRUE;
-               else if (codecs[i] != HFP_CODEC_MSBC)
+                       set_bit(HFP_CODEC_CVSD, &codecs_bitmask);
+               else if (codecs[i] == HFP_CODEC_MSBC)
+                       set_bit(HFP_CODEC_MSBC, &codecs_bitmask);
+               else
                        return __ofono_error_invalid_args(msg);
        }
 
-       if (has_cvsd == FALSE) {
+       if (!test_bit(HFP_CODEC_CVSD, &codecs_bitmask)) {
                ofono_error("CVSD codec is mandatory");
                return __ofono_error_invalid_args(msg);
        }
@@ -606,8 +623,7 @@ static DBusMessage *am_agent_register(DBusConnection *conn,
        agent = g_new0(struct agent, 1);
        agent->owner = g_strdup(sender);
        agent->path = g_strdup(path);
-       agent->codecs = g_memdup(codecs, length);
-       agent->codecs_len = length;
+       agent->codecs_bitmask = codecs_bitmask;
        agent->watch = g_dbus_add_disconnect_watch(conn, sender,
                                                agent_disconnect, NULL, NULL);
 
-- 
1.7.11.7

_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono

Reply via email to