From: Vinicius Costa Gomes <[email protected]>
As informing the AG of the supported codecs is part of the setup
of the SLC, it makes sense to have this information inside the SLC
establishment part.
Now the hfp_slc_info structure has dynamic information, and so the
hfp_slc_info_free() function is used.
---
drivers/hfpmodem/slc.c | 14 +++++++++++++-
drivers/hfpmodem/slc.h | 10 +++++++++-
plugins/hfp_hf_bluez4.c | 5 ++++-
plugins/phonesim.c | 12 +++++++-----
4 files changed, 33 insertions(+), 8 deletions(-)
diff --git a/drivers/hfpmodem/slc.c b/drivers/hfpmodem/slc.c
index 646befa..288afdd 100644
--- a/drivers/hfpmodem/slc.c
+++ b/drivers/hfpmodem/slc.c
@@ -52,7 +52,8 @@ struct slc_establish_data {
gpointer userdata;
};
-void hfp_slc_info_init(struct hfp_slc_info *info, guint16 version)
+void hfp_slc_info_init(struct hfp_slc_info *info, guint16 version,
+ unsigned char *codecs, int len)
{
info->ag_features = 0;
info->ag_mpty_features = 0;
@@ -72,11 +73,22 @@ void hfp_slc_info_init(struct hfp_slc_info *info, guint16
version)
info->hf_features |= HFP_HF_FEATURE_CODEC_NEGOTIATION;
+ info->codecs = g_memdup(codecs, len);
+ info->codecs_len = len;
+
done:
memset(info->cind_val, 0, sizeof(info->cind_val));
memset(info->cind_pos, 0, sizeof(info->cind_pos));
}
+void hfp_slc_info_free(struct hfp_slc_info *info)
+{
+ g_free(info->codecs);
+
+ g_at_chat_unref(info->chat);
+ info->chat = NULL;
+}
+
static void slc_establish_data_unref(gpointer userdata)
{
struct slc_establish_data *sed = userdata;
diff --git a/drivers/hfpmodem/slc.h b/drivers/hfpmodem/slc.h
index b71ffe9..d7c90a2 100644
--- a/drivers/hfpmodem/slc.h
+++ b/drivers/hfpmodem/slc.h
@@ -44,6 +44,11 @@ enum hfp_indicator {
HFP_INDICATOR_LAST
};
+enum hfp_codec {
+ HFP_CODEC_CVSD = 0x01,
+ HFP_CODEC_MSBC = 0x02,
+};
+
typedef void (*hfp_slc_cb_t)(void *userdata);
struct hfp_slc_info {
@@ -53,9 +58,12 @@ struct hfp_slc_info {
unsigned int hf_features;
unsigned char cind_pos[HFP_INDICATOR_LAST];
unsigned int cind_val[HFP_INDICATOR_LAST];
+ unsigned char *codecs;
+ int codecs_len;
};
-void hfp_slc_info_init(struct hfp_slc_info *info, guint16 version);
+void hfp_slc_info_init(struct hfp_slc_info *info, guint16 version,
+ unsigned char *codecs, int len);
void hfp_slc_info_free(struct hfp_slc_info *info);
void hfp_slc_establish(struct hfp_slc_info *info, hfp_slc_cb_t connect_cb,
diff --git a/plugins/hfp_hf_bluez4.c b/plugins/hfp_hf_bluez4.c
index 450c183..f27b0e1 100644
--- a/plugins/hfp_hf_bluez4.c
+++ b/plugins/hfp_hf_bluez4.c
@@ -165,12 +165,15 @@ static DBusMessage
*hfp_agent_new_connection(DBusConnection *conn,
struct ofono_modem *modem = data;
struct hfp_data *hfp_data = ofono_modem_get_data(modem);
guint16 version;
+ unsigned char codecs[1];
if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_UNIX_FD, &fd,
DBUS_TYPE_UINT16, &version, DBUS_TYPE_INVALID))
return __ofono_error_invalid_args(msg);
- hfp_slc_info_init(&hfp_data->info, version);
+ memset(&codecs, 0, sizeof(codecs));
+ codecs[0] = HFP_CODEC_CVSD;
+ hfp_slc_info_init(&hfp_data->info, version, codecs, 1);
err = service_level_connection(modem, fd);
if (err < 0 && err != -EINPROGRESS)
diff --git a/plugins/phonesim.c b/plugins/phonesim.c
index 26f96d0..63590a9 100644
--- a/plugins/phonesim.c
+++ b/plugins/phonesim.c
@@ -885,8 +885,7 @@ static void slc_failed(gpointer userdata)
ofono_modem_set_powered(modem, FALSE);
- g_at_chat_unref(info->chat);
- info->chat = NULL;
+ hfp_slc_info_free(info);
}
static int localhfp_enable(struct ofono_modem *modem)
@@ -896,6 +895,7 @@ static int localhfp_enable(struct ofono_modem *modem)
GAtSyntax *syntax;
GAtChat *chat;
const char *address;
+ unsigned char codecs[1];
int sk, port;
address = ofono_modem_get_string(modem, "Address");
@@ -929,7 +929,10 @@ static int localhfp_enable(struct ofono_modem *modem)
g_at_chat_set_disconnect_function(chat, slc_failed, modem);
- hfp_slc_info_init(info, HFP_VERSION_LATEST);
+ memset(codecs, 0, sizeof(codecs));
+ codecs[0] = HFP_CODEC_CVSD;
+
+ hfp_slc_info_init(info, HFP_VERSION_LATEST, codecs, 1);
info->chat = chat;
hfp_slc_establish(info, slc_established, slc_failed, modem);
@@ -940,8 +943,7 @@ static int localhfp_disable(struct ofono_modem *modem)
{
struct hfp_slc_info *info = ofono_modem_get_data(modem);
- g_at_chat_unref(info->chat);
- info->chat = NULL;
+ hfp_slc_info_free(info);
return 0;
}
--
1.7.11.7
_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono