diff -Naur asterisk-88863.orig/channels/chan_unistim.c asterisk-88863.patched-unistimjb/channels/chan_unistim.c --- asterisk-88863.orig/channels/chan_unistim.c 2007-11-06 10:15:38.000000000 +0600 +++ asterisk-88863.patched-unistimjb/channels/chan_unistim.c 2007-11-06 11:55:50.000000000 +0600 @@ -202,6 +202,17 @@ return; } +/*! \brief Global jitterbuffer configuration - by default, jb is disabled */ +static struct ast_jb_conf default_jbconf = +{ + .flags = 0, + .max_size = -1, + .resync_threshold = -1, + .impl = "" +}; +static struct ast_jb_conf global_jbconf; + + /* #define DUMP_PACKET 1 */ /* #define DEBUG_TIMER ast_verbose */ @@ -697,7 +708,7 @@ .type = type, .description = tdesc, .capabilities = CAPABILITY, - .properties = AST_CHAN_TP_WANTSJITTER, + .properties = AST_CHAN_TP_WANTSJITTER | AST_CHAN_TP_CREATESJITTER, .requester = unistim_request, .call = unistim_call, .hangup = unistim_hangup, @@ -4509,6 +4520,9 @@ tmp->fds[0] = ast_rtp_fd(sub->rtp); tmp->fds[1] = ast_rtcp_fd(sub->rtp); } + if (sub->rtp) + ast_jb_configure(tmp, &global_jbconf); + /* tmp->type = type; */ ast_setstate(tmp, state); if (state == AST_STATE_RING) @@ -5353,11 +5367,18 @@ ast_log(LOG_ERROR, "Unable to load config %s\n", config); return -1; } + + /* Copy the default jb config over global_jbconf */ + memcpy(&global_jbconf, &default_jbconf, sizeof(struct ast_jb_conf)); unistim_keepalive = 120; unistim_port = 0; v = ast_variable_browse(cfg, "general"); while (v) { + /* handle jb conf */ + if (!ast_jb_read_conf(&global_jbconf, v->name, v->value)) + continue; + if (!strcasecmp(v->name, "keepalive")) unistim_keepalive = atoi(v->value); else if (!strcasecmp(v->name, "port")) diff -Naur asterisk-88863.orig/configs/unistim.conf.sample asterisk-88863.patched-unistimjb/configs/unistim.conf.sample --- asterisk-88863.orig/configs/unistim.conf.sample 2007-11-06 10:15:43.000000000 +0600 +++ asterisk-88863.patched-unistimjb/configs/unistim.conf.sample 2007-11-06 10:57:47.000000000 +0600 @@ -8,6 +8,32 @@ ;public_ip= ; if asterisk is behind a nat, specify your public IP ;autoprovisioning=no ; Allow undeclared phones to register an extension. See README for important ; informations. no (default), yes, tn. +;------------------------------ JITTER BUFFER CONFIGURATION -------------------------- +; jbenable = yes ; Enables the use of a jitterbuffer on the receiving side of a + ; SIP channel. Defaults to "no". An enabled jitterbuffer will + ; be used only if the sending side can create and the receiving + ; side can not accept jitter. The SIP channel can accept jitter, + ; thus a jitterbuffer on the receive SIP side will be used only + ; if it is forced and enabled. + +; jbforce = no ; Forces the use of a jitterbuffer on the receive side of a SIP + ; channel. Defaults to "no". + +; jbmaxsize = 200 ; Max length of the jitterbuffer in milliseconds. + +; jbresyncthreshold = 1000 ; Jump in the frame timestamps over which the jitterbuffer is + ; resynchronized. Useful to improve the quality of the voice, with + ; big jumps in/broken timestamps, usually sent from exotic devices + ; and programs. Defaults to 1000. + +; jbimpl = fixed ; Jitterbuffer implementation, used on the receiving side of a SIP + ; channel. Two implementations are currently available - "fixed" + ; (with size always equals to jbmaxsize) and "adaptive" (with + ; variable size, actually the new jb of IAX2). Defaults to fixed. + +; jblog = no ; Enables jitterbuffer frame logging. Defaults to "no". +;----------------------------------------------------------------------------------- + ;[black] ; name of the device ;device=000ae4012345 ; mac address of the phone