[svn-commits] oej: branch oej/rana-dtmf-rtp-duration-1.6.0 r305751 - /team/oej/rana-dtmf-rt...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Wed Feb 2 08:20:45 CST 2011


Author: oej
Date: Wed Feb  2 08:20:39 2011
New Revision: 305751

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=305751
Log:
Updates after testing with and without local channels

Found out that features.c did not support DTMF duration at all.

Modified:
    team/oej/rana-dtmf-rtp-duration-1.6.0/main/features.c
    team/oej/rana-dtmf-rtp-duration-1.6.0/main/rtp.c

Modified: team/oej/rana-dtmf-rtp-duration-1.6.0/main/features.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/rana-dtmf-rtp-duration-1.6.0/main/features.c?view=diff&rev=305751&r1=305750&r2=305751
==============================================================================
--- team/oej/rana-dtmf-rtp-duration-1.6.0/main/features.c (original)
+++ team/oej/rana-dtmf-rtp-duration-1.6.0/main/features.c Wed Feb  2 08:20:39 2011
@@ -2389,11 +2389,13 @@
 					   digits to come in for features. */
 					ast_debug(1, "Timed out for feature!\n");
 					if (!ast_strlen_zero(peer_featurecode)) {
-						ast_dtmf_stream(chan, peer, peer_featurecode, 0, 0);
+						ast_log(LOG_DEBUG, "--- Sending DTMF here\n");
+						ast_dtmf_stream(chan, peer, peer_featurecode, 0, f->len);
 						memset(peer_featurecode, 0, sizeof(peer_featurecode));
 					}
 					if (!ast_strlen_zero(chan_featurecode)) {
-						ast_dtmf_stream(peer, chan, chan_featurecode, 0, 0);
+						ast_log(LOG_DEBUG, "--- Sending DTMF here - 2\n");
+						ast_dtmf_stream(peer, chan, chan_featurecode, 0, f->len);
 						memset(chan_featurecode, 0, sizeof(chan_featurecode));
 					}
 					if (f)
@@ -2464,6 +2466,7 @@
 		} else if (f->frametype == AST_FRAME_DTMF) {
 			char *featurecode;
 			int sense;
+			unsigned int dtmfduration = f->len;
 
 			hadfeatures = hasfeatures;
 			/* This cannot overrun because the longest feature is one shorter than our buffer */
@@ -2486,7 +2489,8 @@
 			res = ast_feature_interpret(chan, peer, config, featurecode, sense);
 			switch(res) {
 			case FEATURE_RETURN_PASSDIGITS:
-				ast_dtmf_stream(other, who, featurecode, 0, 0);
+				ast_log(LOG_DEBUG, "--- Sending DTMF here - 3 Duration %d\n", dtmfduration);
+				ast_dtmf_stream(other, who, featurecode, 0, dtmfduration);
 				/* Fall through */
 			case FEATURE_RETURN_SUCCESS:
 				memset(featurecode, 0, sizeof(chan_featurecode));

Modified: team/oej/rana-dtmf-rtp-duration-1.6.0/main/rtp.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/rana-dtmf-rtp-duration-1.6.0/main/rtp.c?view=diff&rev=305751&r1=305750&r2=305751
==============================================================================
--- team/oej/rana-dtmf-rtp-duration-1.6.0/main/rtp.c (original)
+++ team/oej/rana-dtmf-rtp-duration-1.6.0/main/rtp.c Wed Feb  2 08:20:39 2011
@@ -144,6 +144,7 @@
 	unsigned int lastdigitts;
 	char sending_digit;	/*!< boolean - are we sending digits */
 	char send_digit;	/*!< digit we are sending */
+	char send_dtmf_frame;	/*!< Number of samples in a frame with the current packetization */
 	int send_payload;
 	int send_duration;
 	int send_endflag:1;	/*!< We have received END marker but are in waiting mode */
@@ -1015,7 +1016,7 @@
 				f = ast_frdup(create_dtmf_frame(rtp, AST_FRAME_DTMF_END));
 				f->len = ast_tvdiff_ms(ast_samp2tv(rtp->dtmf_duration, rtp_get_rate(f->subclass)), ast_tv(0, 0));
 				rtp->resp = 0;
-				ast_log(LOG_DEBUG, "--GOT DTMF END message. Duration samples %d\n", rtp->dtmf_duration);
+				ast_log(LOG_DEBUG, "--GOT DTMF END message. Duration samples %d (%ld ms)\n", rtp->dtmf_duration, f->len);
 				rtp->dtmf_duration = rtp->dtmf_timeout = 0;
 				AST_LIST_INSERT_TAIL(frames, f, frame_list);
 			}
@@ -2725,11 +2726,9 @@
 				    ntohs(rtp->them.sin_port), payload, rtp->seqno, rtp->lastdigitts, res - hdrlen);
 		/* Increment sequence number */
 		rtp->seqno++;
-		/* Clear marker bit and set seqno */
-		rtpheader[0] = htonl((2 << 30) | (payload << 16) | (rtp->seqno));
-	}
-	/* Increment duration */
-	rtp->send_duration += 160;
+		/* Raise the seqno */
+		rtpheader[0] = htonl((2 << 30) | (1 << 23) | (payload << 16) | (rtp->seqno));
+	}
 
 	/* Since we received a begin, we can safely store the digit and disable any compensation */
 	rtp->sending_digit = 1;
@@ -2754,8 +2753,7 @@
 		   so we can't assume 20 ms (160 units in 8000 hz audio).
 		*/
 		// int dursamples =  duration * (rtp_get_rate(f->subclass) / 1000)
-		int dursamples =  duration * (8000 / 1000);	/* How do we get the sample rate for the primary media in this call? */
-		// f->len = ast_tvdiff_ms(ast_samp2tv(rtp->dtmf_duration, rtp_get_rate(f->subclass)), ast_tv(0, 0));
+		int dursamples =  duration * (rtp_get_rate(rtp->f.subclass) / 1000);	/* How do we get the sample rate for the primary media in this call? */
 
 		ast_log(LOG_DEBUG, "DTMF CONTINUE : %d ms %d samples\n", duration, dursamples);
 		rtp->received_duration = dursamples;
@@ -2777,11 +2775,11 @@
 		return 0;
 
 	ast_log(LOG_DEBUG, "---- Send duration %d Received duration %d Endflag %d Send-digit %d\n", rtp->send_duration, rtp->received_duration, rtp->send_endflag, rtp->send_digit);
-	if (rtp->send_duration + 160 < rtp->received_duration) {
+
+	if (rtp->received_duration == 0 || rtp->send_duration + 160 <= rtp->received_duration) {
 		rtp->send_duration += 160;
 	} else if (rtp->send_endflag) {
 		ast_log(LOG_DEBUG, "---- Send duration %d Received duration %d - sending END packet\n", rtp->send_duration, rtp->received_duration);
-		rtp->send_duration += 160;
 		/* We are done, ready to send end flag */
 		rtp->send_endflag = 0;
 		return ast_rtp_senddigit_end(rtp, 0, rtp->received_duration);
@@ -2819,6 +2817,7 @@
 	unsigned int *rtpheader;
 	int hdrlen = 12, res = 0, i = 0;
 	char data[256];
+
 	int dursamples =  duration * (8000 / 1000);	/* How do we get the sample rate for the primary media in this call? */
 	
 	/* If no address, then bail out */
@@ -2826,7 +2825,11 @@
 		return 0;
 
 
-	ast_log(LOG_DEBUG, "---- Send duration %d Received duration %d Endflag %d Digit %d Send-digit %d\n", rtp->send_duration, rtp->received_duration, rtp->send_endflag, digit, rtp->send_digit);
+	ast_log(LOG_DEBUG, "---- Send duration %d Received duration %d Duration %d Endflag %d Digit %d Send-digit %d\n", rtp->send_duration, rtp->received_duration, duration, rtp->send_endflag, digit, rtp->send_digit);
+
+	//if (dursamples > rtp->received_duration) {
+		//rtp->received_duration = dursamples;
+	//}
 
 	if (!rtp->send_endflag && rtp->send_duration + 160 < rtp->received_duration) {
 		/* We still have to send DTMF continuation, because otherwise we will end prematurely. Set end flag to indicate
@@ -2861,8 +2864,11 @@
 
 	rtp->dtmfmute = ast_tvadd(ast_tvnow(), ast_tv(0, 500000));
 
-	//rtp->send_duration = rtp->received_duration;	/* Compensate for the last CONT packet */
-	rtp->send_duration = dursamples;	/* Compensate for the last CONT packet */
+	rtp->send_duration += 160;
+
+	if (rtp->received_duration > rtp->send_duration) {
+		rtp->send_duration = rtp->received_duration;
+	}
 
 	rtpheader = (unsigned int *)data;
 	rtpheader[1] = htonl(rtp->lastdigitts);
@@ -2885,7 +2891,7 @@
 				    ast_inet_ntoa(rtp->them.sin_addr),
 				    ntohs(rtp->them.sin_port), rtp->send_payload, rtp->seqno, rtp->lastdigitts, res - hdrlen);
 	}
-	ast_log(LOG_DEBUG, "-- DTMF END: Duration samples %d ms %d\n", rtp->send_duration, duration);
+	ast_log(LOG_DEBUG, "-- DTMF END: Duration samples sent %d got %d ms (%d samples)\n", rtp->send_duration, duration, dursamples);
 	rtp->lastts += rtp->send_duration;
 	rtp->sending_digit = 0;
 	rtp->send_digit = 0;




More information about the svn-commits mailing list