aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2009-05-28 15:03:55 +0000
committermmichelson <mmichelson@f38db490-d61c-443f-a65b-d21fe96a405b>2009-05-28 15:03:55 +0000
commit5a15374cdf58709ce01443e622d2403171da7700 (patch)
treefeb82c4fbd1a53d0205a065303343e0501404749
parentb80f5969368fbc9b205fc5e205a4e65c9b3cffb6 (diff)
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 ........ ................ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@197544 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--apps/app_chanspy.c1
-rw-r--r--include/asterisk/audiohook.h4
-rw-r--r--main/audiohook.c12
3 files changed, 16 insertions, 1 deletions
diff --git a/apps/app_chanspy.c b/apps/app_chanspy.c
index d897f4b08..c5a26772d 100644
--- a/apps/app_chanspy.c
+++ b/apps/app_chanspy.c
@@ -237,6 +237,7 @@ static int start_spying(struct ast_channel *chan, const char *spychan_name, stru
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))) {
diff --git a/include/asterisk/audiohook.h b/include/asterisk/audiohook.h
index 231c8c2c5..ada4e0a9a 100644
--- a/include/asterisk/audiohook.h
+++ b/include/asterisk/audiohook.h
@@ -58,6 +58,10 @@ enum ast_audiohook_flags {
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 */
diff --git a/main/audiohook.c b/main/audiohook.c
index 13aacef2c..4df92e56d 100644
--- a/main/audiohook.c
+++ b/main/audiohook.c
@@ -123,6 +123,7 @@ int ast_audiohook_write_frame(struct ast_audiohook *audiohook, enum ast_audiohoo
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,7 +131,8 @@ int ast_audiohook_write_frame(struct ast_audiohook *audiohook, enum ast_audiohoo
/* 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;
@@ -141,6 +143,14 @@ int ast_audiohook_write_frame(struct ast_audiohook *audiohook, enum ast_audiohoo
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);
+ }
+
/* Write frame out to respective factory */
ast_slinfactory_feed(factory, frame);