From: Richard Mudgett Date: Thu, 28 Jul 2011 17:04:24 +0000 (+0000) Subject: Merged revisions 330033 from X-Git-Tag: 1.8.6.0-rc1~29 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c4afd498c0f45cd774e3d8cea4917a925e5f4111;p=thirdparty%2Fasterisk.git Merged revisions 330033 from https://origsvn.digium.com/svn/asterisk/be/branches/C.3-bier .......... r330033 | rmudgett | 2011-07-28 11:26:38 -0500 (Thu, 28 Jul 2011) | 15 lines Datacalls with B410P fail. Incoming and outgoing call legs of a data call are using different formats: a-law, u-law. When the call is bridged, the media stream is run through translation to convert the media formats. The translation is bad for data calls. * Make incoming call that does not explicitly specify u-law or a-law use the DAHDI channel's default law. The outgoing call always uses the default law from the DAHDI channel. (closes issue ABE-2800) Patches: jira_abe_2800_companding.patch (license #5621) patch uploaded by rmudgett .......... git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@330050 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/sig_pri.c b/channels/sig_pri.c index 0aa613271d..1c8e1c6327 100644 --- a/channels/sig_pri.c +++ b/channels/sig_pri.c @@ -4483,6 +4483,7 @@ static void *pri_dchannel(void *vpri) int res; int chanpos = 0; int x; + int law; struct ast_channel *c; struct timeval tv, lowest, *next; int doidling=0; @@ -5112,7 +5113,20 @@ static void *pri_dchannel(void *vpri) /* Make sure extension exists (or in overlap dial mode, can exist) */ if (((pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING) && ast_canmatch_extension(NULL, pri->pvts[chanpos]->context, pri->pvts[chanpos]->exten, 1, pri->pvts[chanpos]->cid_num)) || ast_exists_extension(NULL, pri->pvts[chanpos]->context, pri->pvts[chanpos]->exten, 1, pri->pvts[chanpos]->cid_num)) { - /* Setup law */ + /* Select audio companding mode. */ + switch (e->ring.layer1) { + case PRI_LAYER_1_ALAW: + law = SIG_PRI_ALAW; + break; + case PRI_LAYER_1_ULAW: + law = SIG_PRI_ULAW; + break; + default: + /* This is a data call to us. */ + law = SIG_PRI_DEFLAW; + break; + } + if (e->ring.complete || !(pri->overlapdial & DAHDI_OVERLAPDIAL_INCOMING)) { /* Just announce proceeding */ pri->pvts[chanpos]->call_level = SIG_PRI_CALL_LEVEL_PROCEEDING; @@ -5138,10 +5152,8 @@ static void *pri_dchannel(void *vpri) sig_pri_unlock_private(pri->pvts[chanpos]); ast_mutex_unlock(&pri->lock); c = sig_pri_new_ast_channel(pri->pvts[chanpos], - AST_STATE_RESERVED, - (e->ring.layer1 == PRI_LAYER_1_ALAW) - ? SIG_PRI_ALAW : SIG_PRI_ULAW, - e->ring.ctype, pri->pvts[chanpos]->exten, NULL); + AST_STATE_RESERVED, law, e->ring.ctype, + pri->pvts[chanpos]->exten, NULL); ast_mutex_lock(&pri->lock); sig_pri_lock_private(pri->pvts[chanpos]); if (c) { @@ -5257,9 +5269,7 @@ static void *pri_dchannel(void *vpri) sig_pri_unlock_private(pri->pvts[chanpos]); ast_mutex_unlock(&pri->lock); c = sig_pri_new_ast_channel(pri->pvts[chanpos], - AST_STATE_RING, - (e->ring.layer1 == PRI_LAYER_1_ALAW) - ? SIG_PRI_ALAW : SIG_PRI_ULAW, e->ring.ctype, + AST_STATE_RING, law, e->ring.ctype, pri->pvts[chanpos]->exten, NULL); ast_mutex_lock(&pri->lock); sig_pri_lock_private(pri->pvts[chanpos]);