summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell Bryant <russell@russellbryant.com>2007-10-09 15:10:14 +0000
committerRussell Bryant <russell@russellbryant.com>2007-10-09 15:10:14 +0000
commit46b9ca721bc15e3fa4618cff00c0f092cfcd11be (patch)
tree398e430f3c7ece34fd6d165b71c9811cab496e60
parentd9909a01519bc7734e96aa06dae84b6ed02e0fd1 (diff)
Add jitterbuffer support for chan_local. To enable it, you use the 'j' option
in the Dial command. The 'j' option _must_ be used in conjunction with the 'n' option. This feature will allow you to use the existing jitterbuffer implementation to put a jitterbuffer on incoming SIP calls connecting to Asterisk applications by putting a local channel in the middle. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@85097 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--channels/chan_local.c20
-rw-r--r--doc/tex/localchannel.tex2
2 files changed, 22 insertions, 0 deletions
diff --git a/channels/chan_local.c b/channels/chan_local.c
index 1ef13bc70..b33aa136b 100644
--- a/channels/chan_local.c
+++ b/channels/chan_local.c
@@ -66,6 +66,13 @@ static const char tdesc[] = "Local Proxy Channel Driver";
#define IS_OUTBOUND(a,b) (a == b->chan ? 1 : 0)
+static struct ast_jb_conf g_jb_conf = {
+ .flags = 0,
+ .max_size = -1,
+ .resync_threshold = -1,
+ .impl = "",
+};
+
static struct ast_channel *local_request(const char *type, int format, void *data, int *cause);
static int local_digit_begin(struct ast_channel *ast, char digit);
static int local_digit_end(struct ast_channel *ast, char digit, unsigned int duration);
@@ -108,6 +115,7 @@ struct local_pvt {
char context[AST_MAX_CONTEXT]; /* Context to call */
char exten[AST_MAX_EXTENSION]; /* Extension to call */
int reqformat; /* Requested format */
+ struct ast_jb_conf jb_conf; /*!< jitterbuffer configuration for this local channel */
struct ast_channel *owner; /* Master Channel */
struct ast_channel *chan; /* Outbound channel */
struct ast_module_user *u_owner; /*! reference to keep the module loaded while in use */
@@ -563,11 +571,21 @@ static struct local_pvt *local_alloc(const char *data, int format)
ast_mutex_init(&tmp->lock);
ast_copy_string(tmp->exten, data, sizeof(tmp->exten));
+ memcpy(&tmp->jb_conf, &g_jb_conf, sizeof(tmp->jb_conf));
+
/* Look for options */
if ((opts = strchr(tmp->exten, '/'))) {
*opts++ = '\0';
if (strchr(opts, 'n'))
ast_set_flag(tmp, LOCAL_NO_OPTIMIZATION);
+ if (strchr(opts, 'j')) {
+ if (ast_test_flag(tmp, LOCAL_NO_OPTIMIZATION))
+ ast_set_flag(&tmp->jb_conf, AST_JB_ENABLED);
+ else {
+ ast_log(LOG_ERROR, "You must use the 'n' option for chan_local "
+ "to use the 'j' option to enable the jitterbuffer\n");
+ }
+ }
}
/* Look for a context */
@@ -652,6 +670,8 @@ static struct ast_channel *local_new(struct local_pvt *p, int state)
tmp->priority = 1;
tmp2->priority = 1;
+ ast_jb_configure(tmp, &p->jb_conf);
+
return tmp;
}
diff --git a/doc/tex/localchannel.tex b/doc/tex/localchannel.tex
index 76cf44566..2a018e2ee 100644
--- a/doc/tex/localchannel.tex
+++ b/doc/tex/localchannel.tex
@@ -9,6 +9,8 @@ chan\_local is a pseudo-channel. Use of this channel simply loops calls back int
Adding "/n" at the end of the string will make the Local channel not do a native transfer (the "n" stands for "n"o release) upon the remote end answering the line. This is an esoteric, but important feature if you expect the Local channel to handle calls exactly like a normal channel. If you do not have the "no release" feature set, then as soon as the destination (inside of the Local channel) answers the line, the variables and dial plan will revert back to that of the original call, and the Local channel will become a zombie and be removed from the active channels list. This is desirable in some circumstances, but can result in unexpected dialplan behavior if you are doing fancy things with variables in your call handling.
+There is another option that can be used with local channels, which is the "j" option. The "j" option must be used with the "n" option to make sure that the local channel does not get optimized out of the call. This option will enable a jitterbuffer on the local channel. The jitterbuffer will be used to de-jitter audio that it receives from the channel that called the local channel. This is especially in the case of putting chan\_local in between an incoming SIP call and Asterisk applications, so that the incoming audio will be de-jittered.
+
\subsection{Purpose}
The Local channel construct can be used to establish dialing into any part of the dialplan.