[asterisk-commits] dvossel: branch dvossel/hd_confbridge r310586 - /team/dvossel/hd_confbridge/b...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Mar 14 09:31:24 CDT 2011


Author: dvossel
Date: Mon Mar 14 09:31:20 2011
New Revision: 310586

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=310586
Log:
Places the softmix silence detection outside of the mixing thread

Modified:
    team/dvossel/hd_confbridge/bridges/bridge_softmix.c

Modified: team/dvossel/hd_confbridge/bridges/bridge_softmix.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/hd_confbridge/bridges/bridge_softmix.c?view=diff&rev=310586&r1=310585&r2=310586
==============================================================================
--- team/dvossel/hd_confbridge/bridges/bridge_softmix.c (original)
+++ team/dvossel/hd_confbridge/bridges/bridge_softmix.c Mon Mar 14 09:31:20 2011
@@ -65,7 +65,7 @@
 
 /* This is the threshold in ms at which a channel's own audio will stop getting
  * mixed out its own write audio stream because it is not talking. */
-#define SILENCE_THRESHOLD 4000
+#define SILENCE_THRESHOLD 2500
 
 /*! \brief Structure which contains per-channel mixing information */
 struct softmix_channel {
@@ -79,8 +79,9 @@
 	struct ast_frame read_frame;
 	/*! DSP for detecting silence */
 	struct ast_dsp *dsp;
-	/*! The total amount of silence up until the last audio frame */
-	int totalsilence;
+	/*! Bit used to indicate if a channel is talking or not. This affects how
+	 * the channel's audio is mixed back to it. */
+	int talking:1;
 	/*! Bit used to indicate that the channel provided audio for this mixing interval */
 	int have_audio:1;
 	/*! Bit used to indicate that a frame is available to be written out to the channel */
@@ -195,17 +196,12 @@
  */
 static int16_t *softmix_process_read_audio(struct softmix_channel *sc, unsigned int num_samples)
 {
-	sc->have_audio = 0;
 	if ((ast_slinfactory_available(&sc->factory) >= num_samples) &&
 		ast_slinfactory_read(&sc->factory, sc->our_buf, num_samples)) {
-		sc->totalsilence = 0;
-		ast_dsp_silence(sc->dsp, &sc->read_frame, &sc->totalsilence);
-		if (sc->totalsilence < SILENCE_THRESHOLD) {
-			sc->have_audio = 1; /* tell the write process we have audio to be mixed out */
-		}
-		ast_mutex_unlock(&sc->lock);
+		sc->have_audio = 1;
 		return sc->our_buf;
 	}
+	sc->have_audio = 0;
 	return NULL;
 }
 
@@ -226,7 +222,7 @@
 
 	/* If we provided audio that was not determined to be silence,
 	 * then take it out while in slinear format. */
-	if (sc->have_audio) {
+	if (sc->have_audio && sc->talking) {
 		for (i = 0; i < sc->write_frame.samples; i++) {
 			ast_slinear_saturated_subtract(&sc->final_buf[i], &sc->our_buf[i]);
 		}
@@ -343,6 +339,8 @@
 
 	/* set up new DSP */
 	sc->dsp = ast_dsp_new_with_rate(rate);
+	/* we want to aggressively detect silence to avoid feedback */
+	ast_dsp_set_threshold(sc->dsp, 160);
 
 	ast_mutex_unlock(&sc->lock);
 }
@@ -399,6 +397,7 @@
 {
 	struct softmix_channel *sc = bridge_channel->bridge_pvt;
 	struct softmix_bridge_data *bridge_data = bridge->bridge_pvt;
+	int totalsilence = 0;
 
 	/* Only accept audio frames, all others are unsupported */
 	if (frame->frametype != AST_FRAME_VOICE) {
@@ -406,6 +405,12 @@
 	}
 
 	ast_mutex_lock(&sc->lock);
+
+	sc->talking = 0;
+	ast_dsp_silence(sc->dsp, frame, &totalsilence);
+	if (totalsilence < SILENCE_THRESHOLD) {
+		sc->talking = 1; /* tell the write process we have audio to be mixed out */
+	}
 
 	/* Before adding audio in, make sure we haven't fallen behind. If audio has fallen
 	 * behind 4 times the amount of samples mixed on every iteration of the mixer, Re-sync




More information about the asterisk-commits mailing list