summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaulK <contact@paulk.fr>2012-01-07 14:12:55 +0100
committerPaulK <contact@paulk.fr>2012-01-07 14:12:55 +0100
commit0716d0fad79861934d002fcab089c3a63c0a4dcd (patch)
tree283d8e94bbdde3bcde22c0c3cc8700378deefc7a
parent4952c8c059767a99adc3c950aa9f0a3d3954d7ee (diff)
downloadhardware_ril_samsung-ril-0716d0fad79861934d002fcab089c3a63c0a4dcd.zip
hardware_ril_samsung-ril-0716d0fad79861934d002fcab089c3a63c0a4dcd.tar.gz
hardware_ril_samsung-ril-0716d0fad79861934d002fcab089c3a63c0a4dcd.tar.bz2
Added Burst DTMF suppport
-rw-r--r--call.c58
-rw-r--r--samsung-ril.c7
-rw-r--r--samsung-ril.h2
3 files changed, 65 insertions, 2 deletions
diff --git a/call.c b/call.c
index 108e3a1..dc116d6 100644
--- a/call.c
+++ b/call.c
@@ -225,6 +225,60 @@ void ril_request_answer(RIL_Token t)
RIL_onUnsolicitedResponse(RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED, NULL, 0);
}
+/**
+ * In: IPC_CALL_BURST_DTMF
+ * Send DTMF burst. RILJ only sends 1 DTMF tone to send at a time.
+ *
+ * Out: IPC_CALL_BURST_DTMF
+ * It should be possible to send multiple DTMF tones at once in this message.
+ * First byte should be DTMF tones count.
+ */
+void ril_request_dtmf(RIL_Token t, void *data, int length)
+{
+ struct ipc_call_cont_dtmf cont_dtmf;
+
+ unsigned char *burst;
+ int burst_len;
+
+ unsigned char dtmf_count = 1;
+ int i;
+
+ burst_len = sizeof(struct ipc_call_cont_dtmf) * dtmf_count + 1;
+ burst = malloc(burst_len);
+ memset(burst, 0, burst_len);
+
+ burst[0] = dtmf_count;
+
+ for(i=0 ; i < dtmf_count ; i++) {
+ // Apparently, it's possible to set multiple DTMF tones on this message
+
+ cont_dtmf.state = IPC_CALL_DTMF_STATE_START;
+ cont_dtmf.tone = ((char *) data)[0];
+
+ memcpy(burst + 1 + sizeof(struct ipc_call_cont_dtmf) * i, &cont_dtmf, sizeof(cont_dtmf));
+ }
+
+ ipc_gen_phone_res_expect_to_abort(reqGetId(t), IPC_CALL_BURST_DTMF);
+
+ ipc_fmt_send(IPC_CALL_BURST_DTMF, IPC_TYPE_EXEC, (void *) burst, burst_len, reqGetId(t));
+
+ free(burst);
+}
+
+void ipc_call_burst_dtmf(struct ipc_message_info *info)
+{
+ unsigned char ret = *((unsigned char *) info->data);
+
+ // This apparently should return 1, or perhaps that is the DTMF tones count
+ if(ret == 0) {
+ LOGD("Apparently, something went wrong with DTMF burst");
+
+ RIL_onRequestComplete(reqGetToken(info->aseq), RIL_E_GENERIC_FAILURE, NULL, 0);
+ }
+
+ RIL_onRequestComplete(reqGetToken(info->aseq), RIL_E_SUCCESS, NULL, 0);
+}
+
void ril_request_dtmf_start(RIL_Token t, void *data, int length)
{
//TODO: Check if there is already a DTMF going on and cancel it if so
@@ -233,7 +287,7 @@ void ril_request_dtmf_start(RIL_Token t, void *data, int length)
cont_dtmf.state = IPC_CALL_DTMF_STATE_START;
cont_dtmf.tone = ((char *)data)[0];
- ipc_fmt_send(IPC_CALL_CONT_DTMF, IPC_TYPE_SET, (unsigned char*)&cont_dtmf, sizeof(cont_dtmf), reqGetId(t));
+ ipc_fmt_send(IPC_CALL_CONT_DTMF, IPC_TYPE_SET, (void *) &cont_dtmf, sizeof(cont_dtmf), reqGetId(t));
RIL_onRequestComplete(t, RIL_E_SUCCESS, NULL, 0);
}
@@ -244,7 +298,7 @@ void ril_request_dtmf_stop(RIL_Token t)
cont_dtmf.state = IPC_CALL_DTMF_STATE_STOP;
cont_dtmf.tone = 0;
- ipc_fmt_send(IPC_CALL_CONT_DTMF, IPC_TYPE_SET, (unsigned char*)&cont_dtmf, sizeof(cont_dtmf), reqGetId(t));
+ ipc_fmt_send(IPC_CALL_CONT_DTMF, IPC_TYPE_SET, (void *) &cont_dtmf, sizeof(cont_dtmf), reqGetId(t));
RIL_onRequestComplete(t, RIL_E_SUCCESS, NULL, 0);
}
diff --git a/samsung-ril.c b/samsung-ril.c
index 0a2f993..099e052 100644
--- a/samsung-ril.c
+++ b/samsung-ril.c
@@ -42,6 +42,7 @@
* - look at /sys nodes for data and airplane
* - fails at killall zygote? → airplane mode bug?
* - gen phone res queue → apply to max functions
+ * - DTMF queue (with burst or start type), with lock
*
* Call-related:
* - take care of SRS socket
@@ -261,6 +262,9 @@ void ipc_fmt_dispatch(struct ipc_message_info *info)
case IPC_CALL_STATUS:
ipc_call_status(info);
break;
+ case IPC_CALL_BURST_DTMF:
+ ipc_call_burst_dtmf(info);
+ break;
/* GPRS */
case IPC_GPRS_IP_CONFIGURATION:
ipc_gprs_ip_configuration(info);
@@ -418,6 +422,9 @@ void onRequest(int request, void *data, size_t datalen, RIL_Token t)
case RIL_REQUEST_ANSWER:
ril_request_answer(t);
break;
+ case RIL_REQUEST_DTMF:
+ ril_request_dtmf(t, data, datalen);
+ break;
case RIL_REQUEST_DTMF_START:
ril_request_dtmf_start(t, data, datalen);
break;
diff --git a/samsung-ril.h b/samsung-ril.h
index 3b6b2a1..fb195b1 100644
--- a/samsung-ril.h
+++ b/samsung-ril.h
@@ -306,6 +306,8 @@ void ril_request_get_current_calls(RIL_Token t);
void ipc_call_list(struct ipc_message_info *info);
void ril_request_hangup(RIL_Token t);
void ril_request_answer(RIL_Token t);
+void ril_request_dtmf(RIL_Token t, void *data, int length);
+void ipc_call_burst_dtmf(struct ipc_message_info *info);
void ril_request_dtmf_start(RIL_Token t, void *data, int length);
void ril_request_dtmf_stop(RIL_Token t);