summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVinicius Costa Gomes <vcgomes@gmail.com>2013-09-10 21:09:40 -0300
committerDenis Kenzior <denkenz@gmail.com>2013-09-12 13:17:40 -0500
commit0de0f496cb301757f636b839bbd6ecf2628522d4 (patch)
treec32dbdc657d5807885ae51547f90051656eb311d /src
parent62c2b81db78eb32de0be9c3a809ddbf27b6e1c32 (diff)
downloadofono-0de0f496cb301757f636b839bbd6ecf2628522d4.tar.bz2
handsfree-audio: Add setting SCO air mode
Diffstat (limited to 'src')
-rw-r--r--src/handsfree-audio.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/handsfree-audio.c b/src/handsfree-audio.c
index 0bdeb990..c311b04c 100644
--- a/src/handsfree-audio.c
+++ b/src/handsfree-audio.c
@@ -68,6 +68,33 @@ static GSList *drivers = 0;
static ofono_bool_t has_wideband = FALSE;
static int defer_setup = 1;
+static uint16_t codec2setting(uint8_t codec)
+{
+ switch (codec) {
+ case HFP_CODEC_CVSD:
+ return BT_VOICE_CVSD_16BIT;
+ default:
+ return BT_VOICE_TRANSPARENT;
+ }
+}
+
+static ofono_bool_t apply_settings_from_codec(int fd, uint8_t codec)
+{
+ struct bt_voice voice;
+
+ /* CVSD is the default, no need to set BT_VOICE. */
+ if (codec == HFP_CODEC_CVSD)
+ return TRUE;
+
+ memset(&voice, 0, sizeof(voice));
+ voice.setting = codec2setting(codec);
+
+ if (setsockopt(fd, SOL_BLUETOOTH, BT_VOICE, &voice, sizeof(voice)) < 0)
+ return FALSE;
+
+ return TRUE;
+}
+
static void send_new_connection(const char *card, int fd, uint8_t codec)
{
DBusMessage *msg;
@@ -150,6 +177,11 @@ static gboolean sco_accept(GIOChannel *io, GIOCondition cond,
return TRUE;
}
+ if (apply_settings_from_codec(nsk, card->selected_codec) == FALSE) {
+ close(nsk);
+ return TRUE;
+ }
+
send_new_connection(card->path, nsk, card->selected_codec);
close(nsk);