summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVinicius Costa Gomes <vcgomes@gmail.com>2013-09-10 21:09:41 -0300
committerDenis Kenzior <denkenz@gmail.com>2013-09-12 13:17:40 -0500
commitff16aed8bd7505ff004e7a4d097c3aa7147a0b60 (patch)
tree021d5581859b49c4d31c944b82a9a779fca5f06c /src
parente574d44d00780f2c7010677a6c261ffba82ea83f (diff)
downloadofono-ff16aed8bd7505ff004e7a4d097c3aa7147a0b60.tar.bz2
handsfree-audio: Detect transparent SCO in kernel
Deferred SCO setup is not enough for HFP 1.6 wideband codec support. Wideband speech also requires Transparent SCO to be enabled in the kernel.
Diffstat (limited to 'src')
-rw-r--r--src/handsfree-audio.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/handsfree-audio.c b/src/handsfree-audio.c
index adb8f73d..96041910 100644
--- a/src/handsfree-audio.c
+++ b/src/handsfree-audio.c
@@ -67,6 +67,7 @@ static guint sco_watch = 0;
static GSList *drivers = 0;
static ofono_bool_t has_wideband = FALSE;
static int defer_setup = 1;
+static ofono_bool_t transparent_sco = FALSE;
static uint16_t codec2setting(uint8_t codec)
{
@@ -192,7 +193,9 @@ static int sco_init(void)
{
GIOChannel *sco_io;
struct sockaddr_sco saddr;
+ struct bt_voice voice;
int sk;
+ socklen_t len;
sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET | O_NONBLOCK | SOCK_CLOEXEC,
BTPROTO_SCO);
@@ -216,6 +219,13 @@ static int sco_init(void)
strerror(errno), errno);
}
+ memset(&voice, 0, sizeof(voice));
+ len = sizeof(voice);
+
+ if (defer_setup && getsockopt(sk, SOL_BLUETOOTH, BT_VOICE,
+ &voice, &len) == 0)
+ transparent_sco = TRUE;
+
if (listen(sk, 5) < 0) {
close(sk);
return -errno;
@@ -599,9 +609,9 @@ ofono_bool_t ofono_handsfree_audio_has_wideband(void)
return has_wideband;
}
-ofono_bool_t ofono_handsfree_audio_has_defer_setup(void)
+ofono_bool_t ofono_handsfree_audio_has_transparent_sco(void)
{
- return defer_setup == 1;
+ return transparent_sco;
}
static void agent_free(struct agent *agent)
@@ -721,12 +731,12 @@ static DBusMessage *am_agent_register(DBusConnection *conn,
DBG("Agent %s registered with the CODECs:%s%s", sender,
has_cvsd ? " CVSD" : "", has_msbc ? " mSBC" : "");
- if (has_msbc && defer_setup == 1)
+ if (has_msbc && transparent_sco)
has_wideband = TRUE;
else {
has_wideband = FALSE;
DBG("Wideband speech disabled: %s", has_msbc ?
- "no SCO defer setup support" : "no mSBC support");
+ "no Transparent SCO support" : "no mSBC support");
}
if (has_cvsd == FALSE) {