[asterisk-commits] mmichelson: branch 1.6.0 r197544 - in /branches/1.6.0: ./ apps/ include/aster...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Thu May 28 10:04:03 CDT 2009


Author: mmichelson
Date: Thu May 28 10:03:55 2009
New Revision: 197544

URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=197544
Log:
Merged revisions 197543 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/trunk

................
  r197543 | mmichelson | 2009-05-28 09:58:06 -0500 (Thu, 28 May 2009) | 27 lines
  
  Merged revisions 197537 via svnmerge from 
  https://origsvn.digium.com/svn/asterisk/branches/1.4
  
  ........
    r197537 | mmichelson | 2009-05-28 09:49:13 -0500 (Thu, 28 May 2009) | 21 lines
    
    Add flags to chanspy audiohook so that audio stays in sync.
    
    There are two flags being added to the chanspy audiohook here. One
    is the pre-existing AST_AUDIOHOOK_TRIGGER_SYNC flag. With this set,
    we ensure that the read and write slinfactories on the audiohook do
    not skew beyond a certain tolerance.
    
    In addition, there is a new audiohook flag added here,
    AST_AUDIOHOOK_SMALL_QUEUE. With this flag set, we do not allow for
    a slinfactory to build up a substantial amount of audio before 
    flushing it. For this particular issue, this means that the person 
    spying on the call will hear the conversations in real time with very 
    little delay in the audio.
    
    (closes issue #13745)
    Reported by: geoffs
    Patches:
          13745.patch uploaded by mmichelson (license 60)
    Tested by: snblitz
  ........
................

Modified:
    branches/1.6.0/   (props changed)
    branches/1.6.0/apps/app_chanspy.c
    branches/1.6.0/include/asterisk/audiohook.h
    branches/1.6.0/main/audiohook.c

Propchange: branches/1.6.0/
------------------------------------------------------------------------------
Binary property 'trunk-merged' - no diff available.

Modified: branches/1.6.0/apps/app_chanspy.c
URL: http://svn.asterisk.org/svn-view/asterisk/branches/1.6.0/apps/app_chanspy.c?view=diff&rev=197544&r1=197543&r2=197544
==============================================================================
--- branches/1.6.0/apps/app_chanspy.c (original)
+++ branches/1.6.0/apps/app_chanspy.c Thu May 28 10:03:55 2009
@@ -237,6 +237,7 @@
 
 	ast_log(LOG_NOTICE, "Attaching %s to %s\n", spychan_name, chan->name);
 
+	ast_set_flag(audiohook, AST_AUDIOHOOK_TRIGGER_SYNC | AST_AUDIOHOOK_SMALL_QUEUE);
 	res = ast_audiohook_attach(chan, audiohook);
 
 	if (!res && ast_test_flag(chan, AST_FLAG_NBRIDGE) && (peer = ast_bridged_channel(chan))) { 

Modified: branches/1.6.0/include/asterisk/audiohook.h
URL: http://svn.asterisk.org/svn-view/asterisk/branches/1.6.0/include/asterisk/audiohook.h?view=diff&rev=197544&r1=197543&r2=197544
==============================================================================
--- branches/1.6.0/include/asterisk/audiohook.h (original)
+++ branches/1.6.0/include/asterisk/audiohook.h Thu May 28 10:03:55 2009
@@ -58,6 +58,10 @@
 	AST_AUDIOHOOK_TRIGGER_WRITE = (2 << 0), /*!< Audiohook wants to be triggered when writing audio out */
 	AST_AUDIOHOOK_WANTS_DTMF = (1 << 1),    /*!< Audiohook also wants to receive DTMF frames */
 	AST_AUDIOHOOK_TRIGGER_SYNC = (1 << 2),  /*!< Audiohook wants to be triggered when both sides have combined audio available */
+	/*! Audiohooks with this flag set will not allow for a large amount of samples to build up on its
+	 * slinfactories. We will flush the factories if they contain too many samples.
+	 */
+	AST_AUDIOHOOK_SMALL_QUEUE = (1 << 3),
 };
 
 #define AST_AUDIOHOOK_SYNC_TOLERANCE 100 /*< Tolerance in milliseconds for audiohooks synchronization */

Modified: branches/1.6.0/main/audiohook.c
URL: http://svn.asterisk.org/svn-view/asterisk/branches/1.6.0/main/audiohook.c?view=diff&rev=197544&r1=197543&r2=197544
==============================================================================
--- branches/1.6.0/main/audiohook.c (original)
+++ branches/1.6.0/main/audiohook.c Thu May 28 10:03:55 2009
@@ -123,6 +123,7 @@
 	struct ast_slinfactory *factory = (direction == AST_AUDIOHOOK_DIRECTION_READ ? &audiohook->read_factory : &audiohook->write_factory);
 	struct ast_slinfactory *other_factory = (direction == AST_AUDIOHOOK_DIRECTION_READ ? &audiohook->write_factory : &audiohook->read_factory);
 	struct timeval *time = (direction == AST_AUDIOHOOK_DIRECTION_READ ? &audiohook->read_time : &audiohook->write_time), previous_time = *time;
+	int our_factory_samples;
 	int our_factory_ms;
 	int other_factory_samples;
 	int other_factory_ms;
@@ -130,13 +131,22 @@
 	/* Update last feeding time to be current */
 	*time = ast_tvnow();
 
-	our_factory_ms = ast_tvdiff_ms(*time, previous_time) + (ast_slinfactory_available(factory) / 8);
+	our_factory_samples = ast_slinfactory_available(factory);
+	our_factory_ms = ast_tvdiff_ms(*time, previous_time) + (our_factory_samples / 8);
 	other_factory_samples = ast_slinfactory_available(other_factory);
 	other_factory_ms = other_factory_samples / 8;
 
 	if (ast_test_flag(audiohook, AST_AUDIOHOOK_TRIGGER_SYNC) && other_factory_samples && (our_factory_ms - other_factory_ms > AST_AUDIOHOOK_SYNC_TOLERANCE)) {
 		if (option_debug)
 			ast_log(LOG_DEBUG, "Flushing audiohook %p so it remains in sync\n", audiohook);
+		ast_slinfactory_flush(factory);
+		ast_slinfactory_flush(other_factory);
+	}
+
+	if (ast_test_flag(audiohook, AST_AUDIOHOOK_SMALL_QUEUE) && (our_factory_samples > 640 || other_factory_samples > 640)) {
+		if (option_debug) {
+			ast_log(LOG_DEBUG, "Audiohook %p has stale audio in its factories. Flushing them both\n", audiohook);
+		}
 		ast_slinfactory_flush(factory);
 		ast_slinfactory_flush(other_factory);
 	}




More information about the asterisk-commits mailing list