[Asterisk-code-review] app_dial.c: RINGTIME, PROGRESSTIME and ms resolution dial timings (...asterisk[13])
Antoni Goldstein
asteriskteam at digium.com
Fri Mar 29 09:39:42 CDT 2019
Antoni Goldstein has uploaded this change for review. ( https://gerrit.asterisk.org/c/asterisk/+/11207
Change subject: app_dial.c: RINGTIME, PROGRESSTIME and ms resolution dial timings
......................................................................
app_dial.c: RINGTIME, PROGRESSTIME and ms resolution dial timings
Added RINGTIME, RINGTIME_MS, PROGRESSTIME, PROGRESSTIME_MS variables filled
at the earliest received PROGRESS or RINGING.
Added millisecond versions of DIALEDTIME and ANSWEREDTIME.
Added millisecond versions of ast_channel_get_up_time and
ast_channel_get_duration in channel.c.
ASTERISK-28363
Change-Id: If95f1a7d8c4acbac740037de0c6e3109ff6620b1
---
M apps/app_dial.c
M include/asterisk/channel.h
M main/channel.c
3 files changed, 84 insertions(+), 7 deletions(-)
git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/07/11207/1
diff --git a/apps/app_dial.c b/apps/app_dial.c
index 714108b..f6359b9 100644
--- a/apps/app_dial.c
+++ b/apps/app_dial.c
@@ -1184,7 +1184,11 @@
int is_cc_recall;
int cc_frame_received = 0;
int num_ringing = 0;
- struct timeval start = ast_tvnow();
+ int sent_ring = 0;
+ int sent_progress = 0;
+ char buf[80];
+ struct timeval start = ast_tvnow(), now, then;
+ int64_t diff;
if (single) {
/* Turn off hold music, etc */
@@ -1466,6 +1470,23 @@
ast_indicate(in, AST_CONTROL_RINGING);
pa->sentringing++;
}
+ if (!sent_ring) {
+ ast_channel_lock(in);
+ ast_channel_stage_snapshot(in);
+
+ now = ast_tvnow();
+ then = ast_channel_creationtime(c);
+ diff = ast_tvzero(then) ? 0 : ast_tvdiff_ms(now, then);
+
+ snprintf(buf, sizeof(buf), "%d", diff / 1000);
+ pbx_builtin_setvar_helper(in, "RINGTIME", buf);
+ snprintf(buf, sizeof(buf), "%d.%03d", diff/1000, diff % 1000);
+ pbx_builtin_setvar_helper(in, "RINGTIME_MS", buf);
+
+ ast_channel_stage_snapshot_done(in);
+ ast_channel_unlock(in);
+ sent_ring = 1;
+ }
}
break;
case AST_CONTROL_PROGRESS:
@@ -1480,6 +1501,23 @@
ast_indicate(in, AST_CONTROL_PROGRESS);
}
}
+ if (!sent_progress) {
+ ast_channel_lock(in);
+ ast_channel_stage_snapshot(in);
+
+ now = ast_tvnow();
+ then = ast_channel_creationtime(c);
+ diff = ast_tvzero(then) ? 0 : ast_tvdiff_ms(now, then);
+
+ snprintf(buf, sizeof(buf), "%d", diff / 1000);
+ pbx_builtin_setvar_helper(in, "PROGRESSTIME", buf);
+ snprintf(buf, sizeof(buf), "%d.%03d", diff/1000, diff % 1000);
+ pbx_builtin_setvar_helper(in, "PROGRESSTIME_MS", buf);
+
+ ast_channel_stage_snapshot_done(in);
+ ast_channel_unlock(in);
+ sent_progress = 1;
+ }
if (!ast_strlen_zero(dtmf_progress)) {
ast_verb(3,
"Sending DTMF '%s' to the called party as result of receiving a PROGRESS message.\n",
@@ -2073,16 +2111,23 @@
{
char buf[80];
time_t end;
+ int64_t diff;
struct ast_channel *chan = data;
time(&end);
ast_channel_lock(chan);
ast_channel_stage_snapshot(chan);
- snprintf(buf, sizeof(buf), "%d", ast_channel_get_up_time(chan));
+ diff = ast_channel_get_up_time_ms(chan)
+ snprintf(buf, sizeof(buf), "%d", diff/1000);
pbx_builtin_setvar_helper(chan, "ANSWEREDTIME", buf);
- snprintf(buf, sizeof(buf), "%d", ast_channel_get_duration(chan));
+ snprintf(buf, sizeof(buf), "%d.%03d", diff/1000, diff%1000);
+ pbx_builtin_setvar_helper(chan, "ANSWEREDTIME_MS", buf);
+ diff = ast_channel_get_duration_ms(chan)
+ snprintf(buf, sizeof(buf), "%d", diff/1000);
pbx_builtin_setvar_helper(chan, "DIALEDTIME", buf);
+ snprintf(buf, sizeof(buf), "%d.%03d", diff/1000, diff%1000);
+ pbx_builtin_setvar_helper(chan, "DIALEDTIME_MS", buf);
ast_channel_stage_snapshot_done(chan);
ast_channel_unlock(chan);
}
diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h
index 0ab12e7..5d222c3 100644
--- a/include/asterisk/channel.h
+++ b/include/asterisk/channel.h
@@ -2339,6 +2339,17 @@
void ast_deactivate_generator(struct ast_channel *chan);
/*!
+ * \since 13
+ * \brief Obtain how long the channel since the channel was created in ms
+ *
+ * \param chan The channel object
+ *
+ * \retval 0 if the time value cannot be computed (or you called this really fast)
+ * \retval The number of milliseconds the channel has been up
+ */
+int64_t ast_channel_get_duration_ms(struct ast_channel *chan);
+
+/*!
* \since 12
* \brief Obtain how long the channel since the channel was created
*
@@ -2350,6 +2361,17 @@
int ast_channel_get_duration(struct ast_channel *chan);
/*!
+ * \since 13
+ * \brief Obtain how long it has been since the channel was answered in ms
+ *
+ * \param chan The channel object
+ *
+ * \retval 0 if the channel isn't answered (or you called this really fast)
+ * \retval The number of milliseconds the channel has been up
+ */
+int64_t ast_channel_get_up_time_ms(struct ast_channel *chan);
+
+/*!
* \since 12
* \brief Obtain how long it has been since the channel was answered
*
diff --git a/main/channel.c b/main/channel.c
index 07b1521..e95eac0 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -2941,24 +2941,34 @@
return ast_answer(chan);
}
-int ast_channel_get_duration(struct ast_channel *chan)
+int64_t ast_channel_get_duration_ms(struct ast_channel *chan)
{
ast_assert(NULL != chan);
if (ast_tvzero(ast_channel_creationtime(chan))) {
return 0;
}
- return (ast_tvdiff_ms(ast_tvnow(), ast_channel_creationtime(chan)) / 1000);
+ return ast_tvdiff_ms(ast_tvnow(), ast_channel_creationtime(chan));
}
-int ast_channel_get_up_time(struct ast_channel *chan)
+int ast_channel_get_duration(struct ast_channel *chan)
+{
+ return (ast_channel_get_duration_ms(chan) / 1000);
+}
+
+int64_t ast_channel_get_up_time_ms(struct ast_channel *chan)
{
ast_assert(NULL != chan);
if (ast_tvzero(ast_channel_answertime(chan))) {
return 0;
}
- return (ast_tvdiff_ms(ast_tvnow(), ast_channel_answertime(chan)) / 1000);
+ return ast_tvdiff_ms(ast_tvnow(), ast_channel_answertime(chan));
+}
+
+int ast_channel_get_up_time(struct ast_channel *chan)
+{
+ return (ast_channel_get_up_time_ms(chan) / 1000);
}
static void deactivate_generator_nolock(struct ast_channel *chan)
--
To view, visit https://gerrit.asterisk.org/c/asterisk/+/11207
To unsubscribe, or for help writing mail filters, visit https://gerrit.asterisk.org/settings
Gerrit-Project: asterisk
Gerrit-Branch: 13
Gerrit-Change-Id: If95f1a7d8c4acbac740037de0c6e3109ff6620b1
Gerrit-Change-Number: 11207
Gerrit-PatchSet: 1
Gerrit-Owner: Antoni Goldstein <action at gdevel.com>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-code-review/attachments/20190329/b9002756/attachment-0001.html>
More information about the asterisk-code-review
mailing list