diff options
-rw-r--r-- | call.c | 58 | ||||
-rw-r--r-- | samsung-ril.c | 7 | ||||
-rw-r--r-- | samsung-ril.h | 2 |
3 files changed, 65 insertions, 2 deletions
@@ -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); |