base-call: interpret DTMF character ',' as two-second pause
Do what other dialers do and interpret ',' as a short pause, which helps handle automated menus. Signed-off-by: Dan Williams <dan@ioncontrol.co>
This commit is contained in:
@@ -103,9 +103,10 @@
|
||||
|
||||
<!--
|
||||
SendDtmf:
|
||||
@dtmf: DTMF tone identifier [0-9A-D*#].
|
||||
@dtmf: DTMF tone identifier [0-9A-D*#] or pause character [,].
|
||||
|
||||
Send a DTMF tone (Dual Tone Multi-Frequency) (only on supported modems).
|
||||
Since 1.26 the comma [,] is interpreted as a two-second pause.
|
||||
|
||||
Applicable only if state is <link linkend="MM-CALL-STATE-ACTIVE:CAPS"><constant>MM_CALL_STATE_ACTIVE</constant></link>.
|
||||
|
||||
|
||||
+18
-9
@@ -870,10 +870,12 @@ send_dtmf_task_step_next (GTask *task)
|
||||
SendDtmfContext *ctx;
|
||||
gboolean need_stop;
|
||||
MMBaseCall *self;
|
||||
gboolean is_pause;
|
||||
|
||||
self = g_task_get_source_object (task);
|
||||
ctx = g_task_get_task_data (task);
|
||||
|
||||
is_pause = (ctx->dtmf[0] == MM_CALL_DTMF_PAUSE_CHAR);
|
||||
need_stop = MM_BASE_CALL_GET_CLASS (self)->stop_dtmf &&
|
||||
MM_BASE_CALL_GET_CLASS (self)->stop_dtmf_finish;
|
||||
|
||||
@@ -882,23 +884,30 @@ send_dtmf_task_step_next (GTask *task)
|
||||
ctx->step++;
|
||||
/* Fall through */
|
||||
case DTMF_STEP_START:
|
||||
MM_BASE_CALL_GET_CLASS (self)->send_dtmf (self,
|
||||
ctx->dtmf,
|
||||
(GAsyncReadyCallback)send_dtmf_ready,
|
||||
g_object_ref (task));
|
||||
break;
|
||||
if (!is_pause) {
|
||||
MM_BASE_CALL_GET_CLASS (self)->send_dtmf (self,
|
||||
ctx->dtmf,
|
||||
(GAsyncReadyCallback)send_dtmf_ready,
|
||||
g_object_ref (task));
|
||||
return;
|
||||
}
|
||||
/* Fall through */
|
||||
case DTMF_STEP_TIMEOUT:
|
||||
if (need_stop) {
|
||||
if (need_stop || is_pause) {
|
||||
guint duration;
|
||||
|
||||
duration = is_pause ? 2000 : mm_base_call_get_dtmf_tone_duration (self);
|
||||
|
||||
/* Disable DTMF press after DTMF tone duration elapses */
|
||||
ctx->timeout_id = g_timeout_add (mm_base_call_get_dtmf_tone_duration (self),
|
||||
ctx->timeout_id = g_timeout_add (duration,
|
||||
(GSourceFunc) dtmf_timeout,
|
||||
task);
|
||||
return;
|
||||
}
|
||||
/* Fall through */
|
||||
case DTMF_STEP_STOP:
|
||||
if (need_stop) {
|
||||
send_dtmf_context_clear_timeout (ctx);
|
||||
send_dtmf_context_clear_timeout (ctx);
|
||||
if (need_stop && !is_pause) {
|
||||
MM_BASE_CALL_GET_CLASS (self)->stop_dtmf (self,
|
||||
(GAsyncReadyCallback)stop_dtmf_ready,
|
||||
g_object_ref (task));
|
||||
|
||||
@@ -41,6 +41,8 @@ typedef struct _MMBaseCallPrivate MMBaseCallPrivate;
|
||||
#define MM_CALL_NUMBER "number"
|
||||
#define MM_CALL_DTMF_TONE_DURATION "dtmf-tone-duration"
|
||||
|
||||
#define MM_CALL_DTMF_PAUSE_CHAR ','
|
||||
|
||||
#define MM_BASE_CALL_PATH "call-path"
|
||||
#define MM_BASE_CALL_CONNECTION "call-connection"
|
||||
#define MM_BASE_CALL_IFACE_MODEM_VOICE "call-iface-modem-voice"
|
||||
|
||||
Reference in New Issue
Block a user