From c4ce28f4d0d79e30209984ab93729085c3c83755 Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Thu, 2 Oct 2008 15:13:56 +0300 Subject: Enable proper support for CME errors We shouldn't send +CME ERROR: unless we have received the AT+CMEE=1 command first from the handsfree device. --- audio/headset.c | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/audio/headset.c b/audio/headset.c index 2dc1dbe5..5f78cbc7 100644 --- a/audio/headset.c +++ b/audio/headset.c @@ -137,6 +137,7 @@ struct headset { gboolean hfp_active; gboolean search_hfp; gboolean cli_active; + gboolean cme_enabled; headset_state_t state; struct pending_connect *pending; @@ -549,8 +550,12 @@ static int telephony_generic_rsp(struct audio_device *device, cme_error_t err) { struct headset *hs = device->headset; - if (err != CME_ERROR_NONE) - return headset_send(hs, "\r\n+CME ERROR:%d\r\n", err); + if (err != CME_ERROR_NONE) { + if (hs->cme_enabled) + return headset_send(hs, "\r\n+CME ERROR:%d\r\n", err); + else + return headset_send(hs, "\r\nERROR\r\n"); + } return headset_send(hs, "\r\nOK\r\n"); } @@ -562,7 +567,7 @@ int telephony_event_reporting_rsp(void *telephony_device, cme_error_t err) int ret; if (err != CME_ERROR_NONE) - return headset_send(hs, "\r\n+CME ERROR:%d\r\n", err); + return telephony_generic_rsp(telephony_device, err); ret = headset_send(hs, "\r\nOK\r\n"); if (ret < 0) @@ -656,7 +661,7 @@ int telephony_answer_call_rsp(void *telephony_device, cme_error_t err) struct headset *hs = device->headset; if (err != CME_ERROR_NONE) - return headset_send(hs, "\r\n+CME ERROR:%d\r\n", err); + return telephony_generic_rsp(telephony_device, err); if (ag.ring_timer) { g_source_remove(ag.ring_timer); @@ -690,7 +695,7 @@ int telephony_terminate_call_rsp(void *telephony_device, struct headset *hs = device->headset; if (err != CME_ERROR_NONE) - return headset_send(hs, "\r\n+CME ERROR:%d\r\n", err); + return telephony_generic_rsp(telephony_device, err); g_dbus_emit_signal(device->conn, device->path, AUDIO_HEADSET_INTERFACE, "CallTerminated", @@ -860,6 +865,25 @@ static int list_current_calls(struct audio_device *device, const char *buf) return 0; } +static int extended_errors(struct audio_device *device, const char *buf) +{ + struct headset *hs = device->headset; + + if (strlen(buf) < 9) + return -EINVAL; + + if (buf[8] == '1') { + hs->cme_enabled = TRUE; + debug("CME errors enabled for headset %p", hs); + } else { + hs->cme_enabled = FALSE; + debug("CME errors disabled for headset %p", hs); + } + + return 0; +} + + static struct event event_callbacks[] = { { "ATA", answer_call }, { "ATD", dial_number }, @@ -876,6 +900,7 @@ static struct event event_callbacks[] = { { "AT+VTS", dtmf_tone }, { "AT+CNUM", subscriber_number }, { "AT+CLCC", list_current_calls }, + { "AT+CMEE", extended_errors }, { 0 } }; -- cgit