diff options
author | Johan Hedberg <johan.hedberg@nokia.com> | 2008-10-17 16:59:40 +0300 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2008-10-17 16:59:40 +0300 |
commit | 7c9e18eb90954f7534dedb9cfaa55dd1180edc0a (patch) | |
tree | efa1e570c21a5290e2e1521d9a33de19ec1909c1 | |
parent | dba1d9703c58940f0ed9ba7615380c9feb7dbcdb (diff) |
Implement better support for AT+CHLD=<n>
-rw-r--r-- | audio/headset.c | 20 | ||||
-rw-r--r-- | audio/telephony-dummy.c | 10 | ||||
-rw-r--r-- | audio/telephony.h | 4 |
3 files changed, 30 insertions, 4 deletions
diff --git a/audio/headset.c b/audio/headset.c index cccc0846..77498d73 100644 --- a/audio/headset.c +++ b/audio/headset.c @@ -81,6 +81,7 @@ static struct { char *number; /* Incoming phone number */ int number_type; /* Incoming number type */ guint ring_timer; /* For incoming call indication */ + const char *chld; /* Response to AT+CHLD=? */ } ag = { .telephony_ready = FALSE, .features = 0, @@ -671,7 +672,15 @@ static int call_hold(struct audio_device *dev, const char *buf) struct headset *hs = dev->headset; int err; - err = headset_send(hs, "\r\n+CHLD:(0,1,1x,2,2x,3,4)\r\n"); + if (strlen(buf) < 9) + return -EINVAL; + + if (buf[8] != '?') { + telephony_call_hold_req(dev, &buf[8]); + return 0; + } + + err = headset_send(hs, "\r\n+CHLD:(%s)\r\n", ag.chld); if (err < 0) return err; @@ -975,6 +984,11 @@ int telephony_operator_selection_rsp(void *telephony_device, cme_error_t err) return telephony_generic_rsp(telephony_device, err); } +int telephony_call_hold_rsp(void *telephony_device, cme_error_t err) +{ + return telephony_generic_rsp(telephony_device, err); +} + int telephony_operator_selection_ind(int mode, const char *oper) { if (!active_devices) @@ -2432,12 +2446,14 @@ int telephony_calling_stopped_ind(void) } int telephony_ready_ind(uint32_t features, - const struct indicator *indicators, int rh) + const struct indicator *indicators, int rh, + const char *chld) { ag.telephony_ready = TRUE; ag.features = features; ag.indicators = indicators; ag.rh = rh; + ag.chld = g_strdup(chld); debug("Telephony plugin initialized"); diff --git a/audio/telephony-dummy.c b/audio/telephony-dummy.c index 8b3f105d..66873b65 100644 --- a/audio/telephony-dummy.c +++ b/audio/telephony-dummy.c @@ -36,6 +36,7 @@ #include "logging.h" #include "telephony.h" +static const char *chld_str = "0,1,1x,2,2x,3,4"; static char *subscriber_number = NULL; static char *active_call_number = NULL; static int active_call_status = 0; @@ -183,6 +184,12 @@ void telephony_operator_selection_req(void *telephony_device) telephony_operator_selection_rsp(telephony_device, CME_ERROR_NONE); } +void telephony_call_hold_req(void *telephony_device, const char *cmd) +{ + debug("telephony-dymmy: got call hold request %s", cmd); + telephony_call_hold_rsp(telephony_device, CME_ERROR_NONE); +} + /* D-Bus method handlers */ static DBusMessage *outgoing_call(DBusConnection *conn, DBusMessage *msg, void *data) @@ -376,7 +383,8 @@ int telephony_init(void) dummy_methods, NULL, NULL, NULL, NULL); - telephony_ready_ind(features, dummy_indicators, response_and_hold); + telephony_ready_ind(features, dummy_indicators, response_and_hold, + chld_str); return 0; } diff --git a/audio/telephony.h b/audio/telephony.h index 4e04e71c..5e972e74 100644 --- a/audio/telephony.h +++ b/audio/telephony.h @@ -145,6 +145,7 @@ void telephony_transmit_dtmf_req(void *telephony_device, char tone); void telephony_subscriber_number_req(void *telephony_device); void telephony_list_current_calls_req(void *telephony_device); void telephony_operator_selection_req(void *telephony_device); +void telephony_call_hold_req(void *telephony_device, const char *cmd); /* AG responses to HF requests. These are implemented by headset.c */ int telephony_event_reporting_rsp(void *telephony_device, cme_error_t err); @@ -157,6 +158,7 @@ int telephony_transmit_dtmf_rsp(void *telephony_device, cme_error_t err); int telephony_subscriber_number_rsp(void *telephony_device, cme_error_t err); int telephony_list_current_calls_rsp(void *telephony_device, cme_error_t err); int telephony_operator_selection_rsp(void *telephony_device, cme_error_t err); +int telephony_call_hold_rsp(void *telephony_device, cme_error_t err); /* Event indications by AG. These are implemented by headset.c */ int telephony_event_ind(int index); @@ -164,7 +166,7 @@ int telephony_response_and_hold_ind(int rh); int telephony_incoming_call_ind(const char *number, int type); int telephony_calling_stopped_ind(void); int telephony_ready_ind(uint32_t features, const struct indicator *indicators, - int rh); + int rh, const char *chld); int telephony_list_current_call_ind(int idx, int dir, int status, int mode, int mprty, const char *number, int type); |