[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