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

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Apr 20 16:10:35 CDT 2011


Author: dvossel
Date: Wed Apr 20 16:10:32 2011
New Revision: 314512

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=314512
Log:
Force automerge to pull new jitterbuffer function from trunk

Added:
    team/dvossel/hd_confbridge/funcs/func_jitterbuffer.c
      - copied unchanged from r314509, trunk/funcs/func_jitterbuffer.c
Modified:
    team/dvossel/hd_confbridge/   (props changed)
    team/dvossel/hd_confbridge/CHANGES
    team/dvossel/hd_confbridge/codecs/codec_dahdi.c
    team/dvossel/hd_confbridge/codecs/codec_resample.c
    team/dvossel/hd_confbridge/include/asterisk/abstract_jb.h
    team/dvossel/hd_confbridge/include/asterisk/channel.h
    team/dvossel/hd_confbridge/include/asterisk/frame.h
    team/dvossel/hd_confbridge/main/abstract_jb.c
    team/dvossel/hd_confbridge/main/channel.c

Propchange: team/dvossel/hd_confbridge/
------------------------------------------------------------------------------
Binary property 'branch-1.8-merged' - no diff available.

Propchange: team/dvossel/hd_confbridge/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Wed Apr 20 16:10:32 2011
@@ -1,1 +1,1 @@
-/trunk:1-314405
+/trunk:1-314511

Modified: team/dvossel/hd_confbridge/CHANGES
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/hd_confbridge/CHANGES?view=diff&rev=314512&r1=314511&r2=314512
==============================================================================
--- team/dvossel/hd_confbridge/CHANGES (original)
+++ team/dvossel/hd_confbridge/CHANGES Wed Apr 20 16:10:32 2011
@@ -73,6 +73,10 @@
 
 Dialplan Functions
 ------------------
+ * Addition of the JITTERBUFFER dialplan function. This function allows
+   for jitterbuffering to occur on the read side of a channel.  By using
+   this function conference applications such as ConfBridge and MeetMe can
+   have the rx streams jitterbuffered before conference mixing occurs.
  * Added DB_KEYS, which lists the next set of keys in the Asterisk database
    hierarchy.
 

Modified: team/dvossel/hd_confbridge/codecs/codec_dahdi.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/hd_confbridge/codecs/codec_dahdi.c?view=diff&rev=314512&r1=314511&r2=314512
==============================================================================
--- team/dvossel/hd_confbridge/codecs/codec_dahdi.c (original)
+++ team/dvossel/hd_confbridge/codecs/codec_dahdi.c Wed Apr 20 16:10:32 2011
@@ -55,6 +55,20 @@
 
 #define G723_SAMPLES 240
 #define G729_SAMPLES 160
+
+#ifndef DAHDI_FORMAT_MAX_AUDIO
+#define DAHDI_FORMAT_G723_1    (1 << 0)
+#define DAHDI_FORMAT_GSM       (1 << 1)
+#define DAHDI_FORMAT_ULAW      (1 << 2)
+#define DAHDI_FORMAT_ALAW      (1 << 3)
+#define DAHDI_FORMAT_G726      (1 << 4)
+#define DAHDI_FORMAT_ADPCM     (1 << 5)
+#define DAHDI_FORMAT_SLINEAR   (1 << 6)
+#define DAHDI_FORMAT_LPC10     (1 << 7)
+#define DAHDI_FORMAT_G729A     (1 << 8)
+#define DAHDI_FORMAT_SPEEX     (1 << 9)
+#define DAHDI_FORMAT_ILBC      (1 << 10)
+#endif
 
 static struct channel_usage {
 	int total;
@@ -598,13 +612,13 @@
 		 * module. Also, do not allow direct ulaw/alaw to complex
 		 * codec translation, since that will prevent the generic PLC
 		 * functions from working. */
-		if (info.dstfmts & (AST_FORMAT_ULAW | AST_FORMAT_ALAW)) {
-			info.dstfmts |= AST_FORMAT_SLINEAR;
-			info.dstfmts &= ~(AST_FORMAT_ULAW | AST_FORMAT_ALAW);
-		}
-		if (info.srcfmts & (AST_FORMAT_ULAW | AST_FORMAT_ALAW)) {
-			info.srcfmts |= AST_FORMAT_SLINEAR;
-			info.srcfmts &= ~(AST_FORMAT_ULAW | AST_FORMAT_ALAW);
+		if (info.dstfmts & (DAHDI_FORMAT_ULAW | DAHDI_FORMAT_ALAW)) {
+			info.dstfmts |= DAHDI_FORMAT_SLINEAR;
+			info.dstfmts &= ~(DAHDI_FORMAT_ULAW | DAHDI_FORMAT_ALAW);
+		}
+		if (info.srcfmts & (DAHDI_FORMAT_ULAW | DAHDI_FORMAT_ALAW)) {
+			info.srcfmts |= DAHDI_FORMAT_SLINEAR;
+			info.srcfmts &= ~(DAHDI_FORMAT_ULAW | DAHDI_FORMAT_ALAW);
 		}
 
 		build_translators(&map, info.dstfmts, info.srcfmts);

Modified: team/dvossel/hd_confbridge/codecs/codec_resample.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/hd_confbridge/codecs/codec_resample.c?view=diff&rev=314512&r1=314511&r2=314512
==============================================================================
--- team/dvossel/hd_confbridge/codecs/codec_resample.c (original)
+++ team/dvossel/hd_confbridge/codecs/codec_resample.c Wed Apr 20 16:10:32 2011
@@ -71,7 +71,12 @@
 {
 	SpeexResamplerState *resamp_pvt = pvt->pvt;
 	unsigned int out_samples = (OUTBUF_SIZE / sizeof(int16_t)) - pvt->samples;
-	unsigned int in_samples = f->samples;
+	unsigned int in_samples;
+
+	if (!f->datalen) {
+		return -1;
+	}
+	in_samples = f->datalen / 2;
 
 	speex_resampler_process_int(resamp_pvt,
 		0,

Modified: team/dvossel/hd_confbridge/include/asterisk/abstract_jb.h
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/hd_confbridge/include/asterisk/abstract_jb.h?view=diff&rev=314512&r1=314511&r2=314512
==============================================================================
--- team/dvossel/hd_confbridge/include/asterisk/abstract_jb.h (original)
+++ team/dvossel/hd_confbridge/include/asterisk/abstract_jb.h Wed Apr 20 16:10:32 2011
@@ -45,6 +45,19 @@
 	AST_JB_ENABLED = (1 << 0),
 	AST_JB_FORCED =  (1 << 1),
 	AST_JB_LOG =     (1 << 2)
+};
+
+enum ast_jb_type {
+	AST_JB_FIXED,
+	AST_JB_ADAPTIVE,
+};
+
+/*! Abstract return codes */
+enum {
+	AST_JB_IMPL_OK,
+	AST_JB_IMPL_DROP,
+	AST_JB_IMPL_INTERP,
+	AST_JB_IMPL_NOFRAME
 };
 
 #define AST_JB_IMPL_NAME_SIZE 12
@@ -77,9 +90,44 @@
 #define AST_JB_CONF_IMPL "impl"
 #define AST_JB_CONF_LOG "log"
 
-
-struct ast_jb_impl;
-
+/* Hooks for the abstract jb implementation */
+/*! \brief Create */
+typedef void * (*jb_create_impl)(struct ast_jb_conf *general_config, long resynch_threshold);
+/*! \brief Destroy */
+typedef void (*jb_destroy_impl)(void *jb);
+/*! \brief Put first frame */
+typedef int (*jb_put_first_impl)(void *jb, struct ast_frame *fin, long now);
+/*! \brief Put frame */
+typedef int (*jb_put_impl)(void *jb, struct ast_frame *fin, long now);
+/*! \brief Get frame for now */
+typedef int (*jb_get_impl)(void *jb, struct ast_frame **fout, long now, long interpl);
+/*! \brief Get next */
+typedef long (*jb_next_impl)(void *jb);
+/*! \brief Remove first frame */
+typedef int (*jb_remove_impl)(void *jb, struct ast_frame **fout);
+/*! \brief Force resynch */
+typedef void (*jb_force_resynch_impl)(void *jb);
+/*! \brief Empty and reset jb */
+typedef void (*jb_empty_and_reset_impl)(void *jb);
+
+
+/*!
+ * \brief Jitterbuffer implementation struct.
+ */
+struct ast_jb_impl
+{
+	char name[AST_JB_IMPL_NAME_SIZE];
+	enum ast_jb_type type;
+	jb_create_impl create;
+	jb_destroy_impl destroy;
+	jb_put_first_impl put_first;
+	jb_put_impl put;
+	jb_get_impl get;
+	jb_next_impl next;
+	jb_remove_impl remove;
+	jb_force_resynch_impl force_resync;
+	jb_empty_and_reset_impl empty_and_reset;
+};
 
 /*!
  * \brief General jitterbuffer state.
@@ -224,6 +272,8 @@
  */
 void ast_jb_empty_and_reset(struct ast_channel *c0, struct ast_channel *c1);
 
+const struct ast_jb_impl *ast_jb_get_impl(enum ast_jb_type type);
+
 #if defined(__cplusplus) || defined(c_plusplus)
 }
 #endif

Modified: team/dvossel/hd_confbridge/include/asterisk/channel.h
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/hd_confbridge/include/asterisk/channel.h?view=diff&rev=314512&r1=314511&r2=314512
==============================================================================
--- team/dvossel/hd_confbridge/include/asterisk/channel.h (original)
+++ team/dvossel/hd_confbridge/include/asterisk/channel.h Wed Apr 20 16:10:32 2011
@@ -154,7 +154,7 @@
 
 #define DATASTORE_INHERIT_FOREVER	INT_MAX
 
-#define AST_MAX_FDS		10
+#define AST_MAX_FDS		11
 /*
  * We have AST_MAX_FDS file descriptors in a channel.
  * Some of them have a fixed use:
@@ -163,6 +163,7 @@
 #define AST_TIMING_FD	(AST_MAX_FDS-2)		/*!< used for timingfd */
 #define AST_AGENT_FD	(AST_MAX_FDS-3)		/*!< used by agents for pass through */
 #define AST_GENERATOR_FD	(AST_MAX_FDS-4)	/*!< used by generator */
+#define AST_JITTERBUFFER_FD	(AST_MAX_FDS-5)	/*!< used by generator */
 
 enum ast_bridge_result {
 	AST_BRIDGE_COMPLETE = 0,

Modified: team/dvossel/hd_confbridge/include/asterisk/frame.h
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/hd_confbridge/include/asterisk/frame.h?view=diff&rev=314512&r1=314511&r2=314512
==============================================================================
--- team/dvossel/hd_confbridge/include/asterisk/frame.h (original)
+++ team/dvossel/hd_confbridge/include/asterisk/frame.h Wed Apr 20 16:10:32 2011
@@ -234,34 +234,34 @@
 #define AST_HTML_LINKREJECT	20
 
 enum ast_control_frame_type {
-	AST_CONTROL_HANGUP = 1,		/*!< Other end has hungup */
-	AST_CONTROL_RING = 2,		/*!< Local ring */
-	AST_CONTROL_RINGING = 3,	/*!< Remote end is ringing */
-	AST_CONTROL_ANSWER = 4,		/*!< Remote end has answered */
-	AST_CONTROL_BUSY = 5,		/*!< Remote end is busy */
+	AST_CONTROL_HANGUP = 1,			/*!< Other end has hungup */
+	AST_CONTROL_RING = 2,			/*!< Local ring */
+	AST_CONTROL_RINGING = 3,		/*!< Remote end is ringing */
+	AST_CONTROL_ANSWER = 4,			/*!< Remote end has answered */
+	AST_CONTROL_BUSY = 5,			/*!< Remote end is busy */
 	AST_CONTROL_TAKEOFFHOOK = 6,	/*!< Make it go off hook */
-	AST_CONTROL_OFFHOOK = 7,	/*!< Line is off hook */
-	AST_CONTROL_CONGESTION = 8,	/*!< Congestion (circuits busy) */
-	AST_CONTROL_FLASH = 9,		/*!< Flash hook */
-	AST_CONTROL_WINK = 10,		/*!< Wink */
-	AST_CONTROL_OPTION = 11,	/*!< Set a low-level option */
-	AST_CONTROL_RADIO_KEY = 12,	/*!< Key Radio */
+	AST_CONTROL_OFFHOOK = 7,		/*!< Line is off hook */
+	AST_CONTROL_CONGESTION = 8,		/*!< Congestion (circuits busy) */
+	AST_CONTROL_FLASH = 9,			/*!< Flash hook */
+	AST_CONTROL_WINK = 10,			/*!< Wink */
+	AST_CONTROL_OPTION = 11,		/*!< Set a low-level option */
+	AST_CONTROL_RADIO_KEY = 12,		/*!< Key Radio */
 	AST_CONTROL_RADIO_UNKEY = 13,	/*!< Un-Key Radio */
-	AST_CONTROL_PROGRESS = 14,	/*!< Indicate PROGRESS */
+	AST_CONTROL_PROGRESS = 14,		/*!< Indicate PROGRESS */
 	AST_CONTROL_PROCEEDING = 15,	/*!< Indicate CALL PROCEEDING */
-	AST_CONTROL_HOLD = 16,		/*!< Indicate call is placed on hold */
-	AST_CONTROL_UNHOLD = 17,	/*!< Indicate call is left from hold */
-	AST_CONTROL_VIDUPDATE = 18,	/*!< Indicate video frame update */
-	_XXX_AST_CONTROL_T38 = 19,	/*!< T38 state change request/notification \deprecated This is no longer supported. Use AST_CONTROL_T38_PARAMETERS instead. */
-	AST_CONTROL_SRCUPDATE = 20,     /*!< Indicate source of media has changed */
-	AST_CONTROL_TRANSFER = 21,      /*!< Indicate status of a transfer request */
+	AST_CONTROL_HOLD = 16,			/*!< Indicate call is placed on hold */
+	AST_CONTROL_UNHOLD = 17,		/*!< Indicate call is left from hold */
+	AST_CONTROL_VIDUPDATE = 18,		/*!< Indicate video frame update */
+	_XXX_AST_CONTROL_T38 = 19,		/*!< T38 state change request/notification \deprecated This is no longer supported. Use AST_CONTROL_T38_PARAMETERS instead. */
+	AST_CONTROL_SRCUPDATE = 20,		/*!< Indicate source of media has changed */
+	AST_CONTROL_TRANSFER = 21,		/*!< Indicate status of a transfer request */
 	AST_CONTROL_CONNECTED_LINE = 22,/*!< Indicate connected line has changed */
-	AST_CONTROL_REDIRECTING = 23,    /*!< Indicate redirecting id has changed */
-	AST_CONTROL_T38_PARAMETERS = 24, /*! T38 state change request/notification with parameters */
-	AST_CONTROL_CC = 25, /*!< Indication that Call completion service is possible */
-	AST_CONTROL_SRCCHANGE = 26,  /*!< Media source has changed and requires a new RTP SSRC */
-	AST_CONTROL_READ_ACTION = 27, /*!< Tell ast_read to take a specific action */
-	AST_CONTROL_AOC = 28,           /*!< Advice of Charge with encoded generic AOC payload */
+	AST_CONTROL_REDIRECTING = 23,	/*!< Indicate redirecting id has changed */
+	AST_CONTROL_T38_PARAMETERS = 24,/*!< T38 state change request/notification with parameters */
+	AST_CONTROL_CC = 25,			/*!< Indication that Call completion service is possible */
+	AST_CONTROL_SRCCHANGE = 26,		/*!< Media source has changed and requires a new RTP SSRC */
+	AST_CONTROL_READ_ACTION = 27,	/*!< Tell ast_read to take a specific action */
+	AST_CONTROL_AOC = 28,			/*!< Advice of Charge with encoded generic AOC payload */
 	AST_CONTROL_END_OF_Q = 29,		/*!< Indicate that this position was the end of the channel queue for a softhangup. */
 	AST_CONTROL_MCID = 30,			/*!< Indicate that the caller is being malicious. */
 };

Modified: team/dvossel/hd_confbridge/main/abstract_jb.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/hd_confbridge/main/abstract_jb.c?view=diff&rev=314512&r1=314511&r2=314512
==============================================================================
--- team/dvossel/hd_confbridge/main/abstract_jb.c (original)
+++ team/dvossel/hd_confbridge/main/abstract_jb.c Wed Apr 20 16:10:32 2011
@@ -49,43 +49,6 @@
 	JB_CREATED =              (1 << 2)
 };
 
-/* Hooks for the abstract jb implementation */
-
-/*! \brief Create */
-typedef void * (*jb_create_impl)(struct ast_jb_conf *general_config, long resynch_threshold);
-/*! \brief Destroy */
-typedef void (*jb_destroy_impl)(void *jb);
-/*! \brief Put first frame */
-typedef int (*jb_put_first_impl)(void *jb, struct ast_frame *fin, long now);
-/*! \brief Put frame */
-typedef int (*jb_put_impl)(void *jb, struct ast_frame *fin, long now);
-/*! \brief Get frame for now */
-typedef int (*jb_get_impl)(void *jb, struct ast_frame **fout, long now, long interpl);
-/*! \brief Get next */
-typedef long (*jb_next_impl)(void *jb);
-/*! \brief Remove first frame */
-typedef int (*jb_remove_impl)(void *jb, struct ast_frame **fout);
-/*! \brief Force resynch */
-typedef void (*jb_force_resynch_impl)(void *jb);
-/*! \brief Empty and reset jb */
-typedef void (*jb_empty_and_reset_impl)(void *jb);
-
-/*!
- * \brief Jitterbuffer implementation private struct.
- */
-struct ast_jb_impl
-{
-	char name[AST_JB_IMPL_NAME_SIZE];
-	jb_create_impl create;
-	jb_destroy_impl destroy;
-	jb_put_first_impl put_first;
-	jb_put_impl put;
-	jb_get_impl get;
-	jb_next_impl next;
-	jb_remove_impl remove;
-	jb_force_resynch_impl force_resync;
-	jb_empty_and_reset_impl empty_and_reset;
-};
 
 /* Implementation functions */
 /* fixed */
@@ -113,6 +76,7 @@
 static const struct ast_jb_impl avail_impl[] = {
 	{
 		.name = "fixed",
+		.type = AST_JB_FIXED,
 		.create = jb_create_fixed,
 		.destroy = jb_destroy_fixed,
 		.put_first = jb_put_first_fixed,
@@ -125,6 +89,7 @@
 	},
 	{
 		.name = "adaptive",
+		.type = AST_JB_ADAPTIVE,
 		.create = jb_create_adaptive,
 		.destroy = jb_destroy_adaptive,
 		.put_first = jb_put_first_adaptive,
@@ -139,20 +104,11 @@
 
 static int default_impl = 0;
 
-
-/*! Abstract return codes */
-enum {
-	JB_IMPL_OK,
-	JB_IMPL_DROP,
-	JB_IMPL_INTERP,
-	JB_IMPL_NOFRAME
-};
-
 /* Translations between impl and abstract return codes */
 static const int fixed_to_abstract_code[] =
-	{JB_IMPL_OK, JB_IMPL_DROP, JB_IMPL_INTERP, JB_IMPL_NOFRAME};
+	{AST_JB_IMPL_OK, AST_JB_IMPL_DROP, AST_JB_IMPL_INTERP, AST_JB_IMPL_NOFRAME};
 static const int adaptive_to_abstract_code[] =
-	{JB_IMPL_OK, JB_IMPL_NOFRAME, JB_IMPL_NOFRAME, JB_IMPL_INTERP, JB_IMPL_DROP, JB_IMPL_OK};
+	{AST_JB_IMPL_OK, AST_JB_IMPL_NOFRAME, AST_JB_IMPL_NOFRAME, AST_JB_IMPL_INTERP, AST_JB_IMPL_DROP, AST_JB_IMPL_OK};
 
 /* JB_GET actions (used only for the frames log) */
 static const char * const jb_get_actions[] = {"Delivered", "Dropped", "Interpolated", "No"};
@@ -346,7 +302,7 @@
 		return 0;
 	} else {
 		now = get_now(jb, NULL);
-		if (jbimpl->put(jbobj, frr, now) != JB_IMPL_OK) {
+		if (jbimpl->put(jbobj, frr, now) != AST_JB_IMPL_OK) {
 			jb_framelog("JB_PUT {now=%ld}: Dropped frame with ts=%ld and len=%ld\n", now, frr->ts, frr->len);
 			ast_frfree(frr);
 			/*return -1;*/
@@ -403,16 +359,16 @@
 		res = jbimpl->get(jbobj, &f, now, interpolation_len);
 
 		switch (res) {
-		case JB_IMPL_OK:
+		case AST_JB_IMPL_OK:
 			/* deliver the frame */
 			ast_write(chan, f);
-		case JB_IMPL_DROP:
+		case AST_JB_IMPL_DROP:
 			jb_framelog("\tJB_GET {now=%ld}: %s frame with ts=%ld and len=%ld\n",
 				now, jb_get_actions[res], f->ts, f->len);
 			ast_format_copy(&jb->last_format, &f->subclass.format);
 			ast_frfree(f);
 			break;
-		case JB_IMPL_INTERP:
+		case AST_JB_IMPL_INTERP:
 			/* interpolate a frame */
 			f = &finterp;
 			ast_format_copy(&f->subclass.format, &jb->last_format);
@@ -424,9 +380,9 @@
 			ast_write(chan, f);
 			jb_framelog("\tJB_GET {now=%ld}: Interpolated frame with len=%d\n", now, interpolation_len);
 			break;
-		case JB_IMPL_NOFRAME:
+		case AST_JB_IMPL_NOFRAME:
 			ast_log(LOG_WARNING,
-				"JB_IMPL_NOFRAME is returned from the %s jb when now=%ld >= next=%ld, jbnext=%ld!\n",
+				"AST_JB_IMPL_NOFRAME is returned from the %s jb when now=%ld >= next=%ld, jbnext=%ld!\n",
 				jbimpl->name, now, jb->next, jbimpl->next(jbobj));
 			jb_framelog("\tJB_GET {now=%ld}: No frame for now!?\n", now);
 			return;
@@ -464,7 +420,7 @@
 
 	/* The result of putting the first frame should not differ from OK. However, its possible
 	   some implementations (i.e. adaptive's when resynch_threshold is specified) to drop it. */
-	if (res != JB_IMPL_OK) {
+	if (res != AST_JB_IMPL_OK) {
 		ast_log(LOG_WARNING, "Failed to put first frame in the jitterbuffer on channel '%s'\n", chan->name);
 		/*
 		jbimpl->destroy(jbobj);
@@ -508,7 +464,7 @@
 			}
 		}
 
-		if (res == JB_IMPL_OK) {
+		if (res == AST_JB_IMPL_OK) {
 			jb_framelog("JB_PUT_FIRST {now=%ld}: Queued frame with ts=%ld and len=%ld\n",
 				now, frr->ts, frr->len);
 		} else {
@@ -520,7 +476,7 @@
 	ast_verb(3, "%s jitterbuffer created on channel %s\n", jbimpl->name, chan->name);
 
 	/* Free the frame if it has not been queued in the jb */
-	if (res != JB_IMPL_OK) {
+	if (res != AST_JB_IMPL_OK) {
 		ast_frfree(frr);
 	}
 
@@ -542,7 +498,7 @@
 
 	if (ast_test_flag(jb, JB_CREATED)) {
 		/* Remove and free all frames still queued in jb */
-		while (jbimpl->remove(jbobj, &f) == JB_IMPL_OK) {
+		while (jbimpl->remove(jbobj, &f) == AST_JB_IMPL_OK) {
 			ast_frfree(f);
 		}
 
@@ -831,3 +787,14 @@
 
 	jb_reset(adaptivejb);
 }
+
+const struct ast_jb_impl *ast_jb_get_impl(enum ast_jb_type type)
+{
+	int i;
+	for (i = 0; i < ARRAY_LEN(avail_impl); i++) {
+		if (avail_impl[i].type == type) {
+			return &avail_impl[i];
+		}
+	}
+	return NULL;
+}

Modified: team/dvossel/hd_confbridge/main/channel.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/hd_confbridge/main/channel.c?view=diff&rev=314512&r1=314511&r2=314512
==============================================================================
--- team/dvossel/hd_confbridge/main/channel.c (original)
+++ team/dvossel/hd_confbridge/main/channel.c Wed Apr 20 16:10:32 2011
@@ -3887,15 +3887,15 @@
 			ast_log(LOG_WARNING, "No read routine on channel %s\n", chan->name);
 	}
 
+	/* Perform the framehook read event here. After the frame enters the framehook list
+	 * there is no telling what will happen, <insert mad scientist laugh here>!!! */
+	f = ast_framehook_list_read_event(chan->framehooks, f);
+
 	/*
 	 * Reset the recorded file descriptor that triggered this read so that we can
 	 * easily detect when ast_read() is called without properly using ast_waitfor().
 	 */
 	chan->fdno = -1;
-
-	/* Perform the framehook read event here. After the frame enters the framehook list
-	 * there is no telling what will happen, <insert mad scientist laugh here>!!! */
-	f = ast_framehook_list_read_event(chan->framehooks, f);
 
 	if (f) {
 		struct ast_frame *readq_tail = AST_LIST_LAST(&chan->readq);




More information about the asterisk-commits mailing list