[svn-commits] dvossel: branch dvossel/hd_confbridge r314512 - in /team/dvossel/hd_confbridg...
SVN commits to the Digium repositories
svn-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 svn-commits
mailing list