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.
This commit is contained in:
Vinicius Costa Gomes 2013-09-10 21:09:41 -03:00 committed by Denis Kenzior
parent e574d44d00
commit ff16aed8bd
3 changed files with 16 additions and 6 deletions

View File

@ -53,7 +53,7 @@ ofono_bool_t ofono_handsfree_card_set_codec(struct ofono_handsfree_card *card,
ofono_bool_t ofono_handsfree_audio_has_wideband(void);
ofono_bool_t ofono_handsfree_audio_has_defer_setup(void);
ofono_bool_t ofono_handsfree_audio_has_transparent_sco(void);
void ofono_handsfree_card_set_data(struct ofono_handsfree_card *card,
void *data);

View File

@ -632,7 +632,7 @@ static void connect_handler(DBusConnection *conn, void *user_data)
* Assuming that if defer_setup is supported, then SCO transparent
* mode is also supported
*/
if (ofono_handsfree_audio_has_defer_setup())
if (ofono_handsfree_audio_has_transparent_sco())
features |= HFP_SDP_HF_FEATURE_WIDEBAND_SPEECH;
DBG("Registering External Profile handler ...");

View File

@ -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) {