[asterisk-commits] dvossel: branch dvossel/hd_confbridge r310883 - in /team/dvossel/hd_confbridg...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Mar 16 08:38:12 CDT 2011


Author: dvossel
Date: Wed Mar 16 08:38:06 2011
New Revision: 310883

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=310883
Log:
Added ability for talker detection in the bridging technology to make its way up to the briding application.

Modified:
    team/dvossel/hd_confbridge/bridges/bridge_softmix.c
    team/dvossel/hd_confbridge/include/asterisk/bridging.h
    team/dvossel/hd_confbridge/include/asterisk/bridging_features.h
    team/dvossel/hd_confbridge/include/asterisk/bridging_technology.h
    team/dvossel/hd_confbridge/main/bridging.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=310883&r1=310882&r2=310883
==============================================================================
--- team/dvossel/hd_confbridge/bridges/bridge_softmix.c (original)
+++ team/dvossel/hd_confbridge/bridges/bridge_softmix.c Wed Mar 16 08:38:06 2011
@@ -398,6 +398,7 @@
 	struct softmix_channel *sc = bridge_channel->bridge_pvt;
 	struct softmix_bridge_data *bridge_data = bridge->bridge_pvt;
 	int totalsilence = 0;
+	int update_talking = -1;  /* if this is set to 0 or 1, tell the bridge that the channel has started or stopped talking. */
 
 	/* Only accept audio frames, all others are unsupported */
 	if (frame->frametype != AST_FRAME_VOICE) {
@@ -406,10 +407,17 @@
 
 	ast_mutex_lock(&sc->lock);
 
-	sc->talking = 0;
 	ast_dsp_silence(sc->dsp, frame, &totalsilence);
 	if (totalsilence < SILENCE_THRESHOLD) {
+		if (!sc->talking) {
+			update_talking = 1;
+		}
 		sc->talking = 1; /* tell the write process we have audio to be mixed out */
+	} else {
+		if (sc->talking) {
+			update_talking = 0;
+		}
+		sc->talking = 0;
 	}
 
 	/* Before adding audio in, make sure we haven't fallen behind. If audio has fallen
@@ -432,6 +440,10 @@
 
 	/* Alllll done */
 	ast_mutex_unlock(&sc->lock);
+
+	if (update_talking != -1) {
+		ast_bridge_notify_talking(bridge, bridge_channel, update_talking);
+	}
 
 	return AST_BRIDGE_WRITE_SUCCESS;
 }

Modified: team/dvossel/hd_confbridge/include/asterisk/bridging.h
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/hd_confbridge/include/asterisk/bridging.h?view=diff&rev=310883&r1=310882&r2=310883
==============================================================================
--- team/dvossel/hd_confbridge/include/asterisk/bridging.h (original)
+++ team/dvossel/hd_confbridge/include/asterisk/bridging.h Wed Mar 16 08:38:06 2011
@@ -97,6 +97,10 @@
 	AST_BRIDGE_CHANNEL_STATE_FEATURE,
 	/*! Bridged channel is sending a DTMF stream out */
 	AST_BRIDGE_CHANNEL_STATE_DTMF,
+	/*! Bridged channel began talking */
+	AST_BRIDGE_CHANNEL_STATE_START_TALKING,
+	/*! Bridged channel has stopped talking */
+	AST_BRIDGE_CHANNEL_STATE_STOP_TALKING,
 };
 
 /*! \brief Return values for bridge technology write function */

Modified: team/dvossel/hd_confbridge/include/asterisk/bridging_features.h
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/hd_confbridge/include/asterisk/bridging_features.h?view=diff&rev=310883&r1=310882&r2=310883
==============================================================================
--- team/dvossel/hd_confbridge/include/asterisk/bridging_features.h (original)
+++ team/dvossel/hd_confbridge/include/asterisk/bridging_features.h Wed Mar 16 08:38:06 2011
@@ -69,6 +69,21 @@
  * \param hook_pvt Private data passed in when the hook was create to destroy
  */
 typedef void (*ast_bridge_features_hook_pvt_destructor)(void *hook_pvt);
+
+/*!
+ * \brief Talking indicator callback
+ *
+ * \details This callback can be registered with the bridge in order
+ * to receive updates on when a bridge_channel has started and stopped
+ * talking
+ *
+ * \param bridge The bridge that the channel is part of
+ * \param bridge_channel Channel executing the feature
+ *
+ * \retval 0 success
+ * \retval -1 failure
+ */
+typedef int (*ast_bridge_talking_indicate_callback)(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel);
 
 /*!
  * \brief Maximum length of a DTMF feature string
@@ -97,12 +112,10 @@
 struct ast_bridge_features {
 	/*! Attached DTMF based feature hooks */
 	AST_LIST_HEAD_NOLOCK(, ast_bridge_features_hook) hooks;
+	/*! Callback to indicate when a bridge channel has started and stopped talking */
+	ast_bridge_talking_indicate_callback talker;
 	/*! Feature flags that are enabled */
 	struct ast_flags feature_flags;
-	/*! The number of ms of silence before channel read audio is dropped as
-	 * silence from the bridge. When this varaible is 0, audio is never dropped
-	 * due to silence. */
-	unsigned int detect_silence;
 	/*! Bit to indicate that this structure is useful and should be considered when looking for features */
 	unsigned int usable:1;
 	/*! Bit to indicate whether the channel/bridge is muted or not */

Modified: team/dvossel/hd_confbridge/include/asterisk/bridging_technology.h
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/hd_confbridge/include/asterisk/bridging_technology.h?view=diff&rev=310883&r1=310882&r2=310883
==============================================================================
--- team/dvossel/hd_confbridge/include/asterisk/bridging_technology.h (original)
+++ team/dvossel/hd_confbridge/include/asterisk/bridging_technology.h Wed Mar 16 08:38:06 2011
@@ -143,6 +143,21 @@
  */
 void ast_bridge_handle_trip(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel, struct ast_channel *chan, int outfd);
 
+/*! \brief Lets the bridging indicate when a bridge channel has stopped or started talking.
+ *
+ * \note All DSP functionality on the bridge has been pushed down to the lowest possible
+ * layer, which in this case is the specific bridging technology being used. Since it
+ * is necessary for the knowledge of which channels are talking to make its way up to the
+ * application, this function has been created to allow the bridging technology to communicate
+ * that information with the bridging core.
+ *
+ * \param bridge The bridge that the channel is a part of.
+ * \param bridge_channel The bridge channel that has either started or stopped talking.
+ * \param started_talking, set to 1 when this indicates the channel has started talking, set to 0
+ * when this indicates the channel has stopped talking.
+ */
+void ast_bridge_notify_talking(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel, int started_talking);
+
 /*! \brief Suspend a bridge technology from consideration
  *
  * \param technology The bridge technology to suspend

Modified: team/dvossel/hd_confbridge/main/bridging.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/hd_confbridge/main/bridging.c?view=diff&rev=310883&r1=310882&r2=310883
==============================================================================
--- team/dvossel/hd_confbridge/main/bridging.c (original)
+++ team/dvossel/hd_confbridge/main/bridging.c Wed Mar 16 08:38:06 2011
@@ -273,6 +273,15 @@
 	}
 }
 
+void ast_bridge_notify_talking(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel, int started_talking)
+{
+	if (started_talking) {
+		ast_bridge_change_state(bridge_channel, AST_BRIDGE_CHANNEL_STATE_START_TALKING);
+	} else {
+		ast_bridge_change_state(bridge_channel, AST_BRIDGE_CHANNEL_STATE_STOP_TALKING);
+	}
+}
+
 void ast_bridge_handle_trip(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel, struct ast_channel *chan, int outfd)
 {
 	/* If no bridge channel has been provided and the actual channel has been provided find it */
@@ -853,6 +862,16 @@
 	return;
 }
 
+static void bridge_channel_talking(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel)
+{
+	struct ast_bridge_features *features = (bridge_channel->features ? bridge_channel->features : &bridge->features);
+
+	if (features && features->talker) {
+		features->talker(bridge, bridge_channel);
+	}
+	ast_bridge_change_state(bridge_channel, AST_BRIDGE_CHANNEL_STATE_WAIT);
+}
+
 /*! \brief Internal function that plays back DTMF on a bridge channel */
 static void bridge_channel_dtmf_stream(struct ast_bridge *bridge, struct ast_bridge_channel *bridge_channel)
 {
@@ -936,16 +955,25 @@
 		/* Execute the threading model */
 		state = (bridge_channel->bridge->technology->capabilities & AST_BRIDGE_CAPABILITY_MULTITHREADED ? bridge_channel_join_multithreaded(bridge_channel) : bridge_channel_join_singlethreaded(bridge_channel));
 		/* Depending on the above state see what we need to do */
-		if (state == AST_BRIDGE_CHANNEL_STATE_FEATURE) {
+		switch (state) {
+		case AST_BRIDGE_CHANNEL_STATE_FEATURE:
 			bridge_channel_suspend(bridge_channel->bridge, bridge_channel);
 			ao2_unlock(bridge_channel->bridge);
 			bridge_channel_feature(bridge_channel->bridge, bridge_channel);
 			ao2_lock(bridge_channel->bridge);
 			bridge_channel_unsuspend(bridge_channel->bridge, bridge_channel);
-		} else if (state == AST_BRIDGE_CHANNEL_STATE_DTMF) {
+			break;
+		case AST_BRIDGE_CHANNEL_STATE_DTMF:
 			bridge_channel_suspend(bridge_channel->bridge, bridge_channel);
 			bridge_channel_dtmf_stream(bridge_channel->bridge, bridge_channel);
 			bridge_channel_unsuspend(bridge_channel->bridge, bridge_channel);
+			break;
+		case AST_BRIDGE_CHANNEL_STATE_START_TALKING:
+		case AST_BRIDGE_CHANNEL_STATE_STOP_TALKING:
+			bridge_channel_talking(bridge_channel->bridge, bridge_channel);
+			break;
+		default:
+			break;
 		}
 	}
 




More information about the asterisk-commits mailing list