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