diff --git a/channels/chan_vpb.c b/channels/chan_vpb.c index c93c03df39f430ccf2b59429654d6a79d27e2adc..d2e48d9b5764cb85873df187e9eb68f59dc15767 100755 --- a/channels/chan_vpb.c +++ b/channels/chan_vpb.c @@ -154,6 +154,9 @@ static int relaxdtmf=0; /* Use Asterisk DTMF play back or VPB */ static int use_ast_dtmf=0; +/* Break for DTMF on native bridge ? */ +static int break_for_dtmf=1; + /* Set EC suppression threshold */ static int ec_supp_threshold=-1; @@ -363,7 +366,7 @@ static int vpb_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, } ast_mutex_unlock(&bridge_lock); if (i == max_bridges) { - ast_log(LOG_WARNING, "vpb_bridge: Failed to bridge %s and %s!\n", c0->name, c1->name); + ast_log(LOG_WARNING, "%s: vpb_bridge: Failed to bridge %s and %s!\n", p0->dev, c0->name, c1->name); ast_mutex_unlock(&p0->lock); ast_mutex_unlock(&p1->lock); return -2; @@ -378,13 +381,13 @@ static int vpb_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, } ast_mutex_unlock(&p1->lock); if (option_verbose>1) - ast_verbose(VERBOSE_PREFIX_2 "vpb_bridge: Bridging call entered with [%s, %s]\n", c0->name, c1->name); + ast_verbose(VERBOSE_PREFIX_2 "%s: vpb_bridge: Bridging call entered with [%s, %s]\n",p0->dev, c0->name, c1->name); } #ifdef HALF_DUPLEX_BRIDGE if (option_verbose>1) - ast_verbose(VERBOSE_PREFIX_2 "vpb_bridge: Starting half-duplex bridge [%s, %s]\n", c0->name, c1->name); + ast_verbose(VERBOSE_PREFIX_2 "%s: vpb_bridge: Starting half-duplex bridge [%s, %s]\n",p0->dev, c0->name, c1->name); int dir = 0; @@ -417,7 +420,7 @@ static int vpb_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, vpb_play_buf_finish(p1->handle); if (option_verbose>1) - ast_verbose(VERBOSE_PREFIX_2 "vpb_bridge: Finished half-duplex bridge [%s, %s]\n", c0->name, c1->name); + ast_verbose(VERBOSE_PREFIX_2 "%s: vpb_bridge: Finished half-duplex bridge [%s, %s]\n",p0->dev, c0->name, c1->name); res = VPB_OK; @@ -430,7 +433,7 @@ static int vpb_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, /* Are we really ment to be doing nothing ?!?! */ who = ast_waitfor_n(cs, 2, &to); if (!who) { - ast_log(LOG_DEBUG, "vpb_bridge: Empty frame read...\n"); + ast_log(LOG_DEBUG, "%s: vpb_bridge: Empty frame read...\n",p0->dev); /* check for hangup / whentohangup */ if (ast_check_hangup(c0) || ast_check_hangup(c1)) break; @@ -442,7 +445,7 @@ static int vpb_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, ((who == c1) && (flags & AST_BRIDGE_DTMF_CHANNEL_1))))) { *fo = f; *rc = who; - ast_log(LOG_DEBUG, "vpb_bridge: Got a [%s]\n", f ? "digit" : "hangup"); + ast_log(LOG_DEBUG, "%s: vpb_bridge: Got a [%s]\n",p0->dev, f ? "digit" : "hangup"); /* if ((c0->pvt->pvt == pvt0) && (!c0->_softhangup)) { if (pr0->set_rtp_peer(c0, NULL, NULL, 0)) @@ -455,7 +458,13 @@ static int vpb_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, */ /* That's all we needed */ /*return 0; */ - break; + /* Check if we need to break */ + if (break_for_dtmf){ + break; + } + else if ((f->frametype == AST_FRAME_DTMF) && ((f->subclass == '#')||(f->subclass == '*'))){ + break; + } } else { if ((f->frametype == AST_FRAME_DTMF) || (f->frametype == AST_FRAME_VOICE) || @@ -1504,9 +1513,9 @@ static struct vpb_pvt *mkif(int board, int channel, int mode, int gains, float t if (use_ast_dtmfdet) { tmp->vad = ast_dsp_new(); ast_dsp_set_features(tmp->vad, DSP_FEATURE_DTMF_DETECT); - ast_dsp_digitmode(tmp->vad, DSP_DIGITMODE_DTMF ); + ast_dsp_digitmode(tmp->vad, DSP_DIGITMODE_DTMF); if (relaxdtmf) - ast_dsp_digitmode(tmp->vad, DSP_DIGITMODE_DTMF | DSP_DIGITMODE_RELAXDTMF); + ast_dsp_digitmode(tmp->vad, DSP_DIGITMODE_DTMF|DSP_DIGITMODE_RELAXDTMF); } else { tmp->vad = NULL; @@ -1636,7 +1645,7 @@ static int vpb_digit(struct ast_channel *ast, char digit) s[1] = '\0'; if (option_verbose > 3) - ast_verbose(VERBOSE_PREFIX_4 "%s: play digit[%s]\n", p->dev, s); + ast_verbose(VERBOSE_PREFIX_4 "%s: vpb_digit: asked to play digit[%s]\n", p->dev, s); ast_mutex_lock(&p->play_dtmf_lock); strncat(p->play_dtmf,s,sizeof(*p->play_dtmf)); @@ -2300,6 +2309,18 @@ static void *do_chanreads(void *pvt) fr = ast_dsp_process(p->owner,p->vad,fr); if (fr && (fr->frametype == AST_FRAME_DTMF)) ast_log(LOG_DEBUG, "%s: chanreads: Detected DTMF '%c'\n",p->dev, fr->subclass); + if (fr->subclass == 'm'){ + /* conf mute request */ + fr->frametype = AST_FRAME_NULL; + fr->subclass = 0; + } + else if (fr->subclass == 'u'){ + /* Unmute */ + fr->frametype = AST_FRAME_NULL; + fr->subclass = 0; + } + else if (fr->subclass == 'f'){ + } } /* Using trylock here to prevent deadlock when channel is hungup * (ast_hangup() immediately gets lock) @@ -2577,6 +2598,15 @@ int load_module() use_ast_ind = 1; ast_log(LOG_NOTICE,"VPB driver using Asterisk Indication functions!\n"); } + else if (strcasecmp(v->name, "break-for-dtmf") == 0) { + if (ast_true(v->value)){ + break_for_dtmf = 1; + } + else { + break_for_dtmf = 0; + ast_log(LOG_NOTICE,"VPB driver not stopping for DTMF's in native bridge\n"); + } + } else if (strcasecmp(v->name, "ast-dtmf") == 0) { use_ast_dtmf = 1; ast_log(LOG_NOTICE,"VPB driver using Asterisk DTMF play functions!\n"); diff --git a/configs/vpb.conf.sample b/configs/vpb.conf.sample index 80d3492697854e73c807e677adacc70e0ecc6556..8e61a7ae5ba00f961ff1efd7fbcf31e32ba0f04b 100755 --- a/configs/vpb.conf.sample +++ b/configs/vpb.conf.sample @@ -8,6 +8,7 @@ ; dtmfidd = 3000 (Inter Digit Delay timeout for when collecting DTMF tones for dialling from a Station port, in ms) ; ast-dtmf-det=1 ( To use Asterisk DTMF detection ) ; relaxdtmf=1 ( Used with ast-dtmf-det ) +; break-for-dtmf=no (When a native bridge occurs between 2 vpb channels, it will only break the connection for '#' and '*') ; ; For [interface] section ; board = board_number (1, 2, 3, ...)