[asterisk-commits] rmudgett: branch rmudgett/native_dahdi r394491 - /team/rmudgett/native_dahdi/...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Jul 16 15:02:53 CDT 2013
Author: rmudgett
Date: Tue Jul 16 15:02:52 2013
New Revision: 394491
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=394491
Log:
chan_dahdi: Remove old bridge routine.
Modified:
team/rmudgett/native_dahdi/channels/chan_dahdi.c
Modified: team/rmudgett/native_dahdi/channels/chan_dahdi.c
URL: http://svnview.digium.com/svn/asterisk/team/rmudgett/native_dahdi/channels/chan_dahdi.c?view=diff&rev=394491&r1=394490&r2=394491
==============================================================================
--- team/rmudgett/native_dahdi/channels/chan_dahdi.c (original)
+++ team/rmudgett/native_dahdi/channels/chan_dahdi.c Tue Jul 16 15:02:52 2013
@@ -548,8 +548,6 @@
static int restart_monitor(void);
-static enum ast_bridge_result dahdi_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int timeoutms);
-
static int dahdi_sendtext(struct ast_channel *c, const char *text);
static void mwi_event_cb(void *userdata, struct stasis_subscription *sub, struct stasis_topic *topic, struct stasis_message *msg)
@@ -988,7 +986,6 @@
.answer = dahdi_answer,
.read = dahdi_read,
.write = dahdi_write,
- .bridge = dahdi_bridge,
.exception = dahdi_exception,
.indicate = dahdi_indicate,
.fixup = dahdi_fixup,
@@ -6794,374 +6791,6 @@
slave->master = master;
ast_debug(1, "Making %d slave to master %d at %d\n", slave->channel, master->channel, x);
-}
-
-static enum ast_bridge_result dahdi_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int timeoutms)
-{
- struct ast_channel *who;
- struct dahdi_pvt *p0, *p1, *op0, *op1;
- struct dahdi_pvt *master = NULL, *slave = NULL;
- struct ast_frame *f;
- int inconf = 0;
- int nothingok = 1;
- int ofd0, ofd1;
- int oi0, oi1, i0 = -1, i1 = -1, t0, t1;
- int os0 = -1, os1 = -1;
- int priority = 0;
- struct ast_channel *oc0, *oc1;
- enum ast_bridge_result res;
- struct timeval start = ast_tvnow();
-#ifdef PRI_2BCT
- int triedtopribridge = 0;
- q931_call *q931c0;
- q931_call *q931c1;
-#endif
-
- /* For now, don't attempt to native bridge if either channel needs DTMF detection.
- There is code below to handle it properly until DTMF is actually seen,
- but due to currently unresolved issues it's ignored...
- */
-
- if (flags & (AST_BRIDGE_DTMF_CHANNEL_0 | AST_BRIDGE_DTMF_CHANNEL_1))
- return AST_BRIDGE_FAILED_NOWARN;
-
- ast_channel_lock_both(c0, c1);
-
- p0 = ast_channel_tech_pvt(c0);
- p1 = ast_channel_tech_pvt(c1);
- /* cant do pseudo-channels here */
- if (!p0 || (!p0->sig) || !p1 || (!p1->sig)) {
- ast_channel_unlock(c0);
- ast_channel_unlock(c1);
- return AST_BRIDGE_FAILED_NOWARN;
- }
-
- oi0 = dahdi_get_index(c0, p0, 0);
- oi1 = dahdi_get_index(c1, p1, 0);
- if ((oi0 < 0) || (oi1 < 0)) {
- ast_channel_unlock(c0);
- ast_channel_unlock(c1);
- return AST_BRIDGE_FAILED;
- }
-
- op0 = p0 = ast_channel_tech_pvt(c0);
- op1 = p1 = ast_channel_tech_pvt(c1);
- ofd0 = ast_channel_fd(c0, 0);
- ofd1 = ast_channel_fd(c1, 0);
- oc0 = p0->owner;
- oc1 = p1->owner;
-
- if (ast_mutex_trylock(&p0->lock)) {
- /* Don't block, due to potential for deadlock */
- ast_channel_unlock(c0);
- ast_channel_unlock(c1);
- ast_log(LOG_NOTICE, "Avoiding deadlock...\n");
- return AST_BRIDGE_RETRY;
- }
- if (ast_mutex_trylock(&p1->lock)) {
- /* Don't block, due to potential for deadlock */
- ast_mutex_unlock(&p0->lock);
- ast_channel_unlock(c0);
- ast_channel_unlock(c1);
- ast_log(LOG_NOTICE, "Avoiding deadlock...\n");
- return AST_BRIDGE_RETRY;
- }
-
- if ((p0->callwaiting && p0->callwaitingcallerid)
- || (p1->callwaiting && p1->callwaitingcallerid)) {
- /*
- * Call Waiting Caller ID requires DTMF detection to know if it
- * can send the CID spill.
- *
- * For now, don't attempt to native bridge if either channel
- * needs DTMF detection. There is code below to handle it
- * properly until DTMF is actually seen, but due to currently
- * unresolved issues it's ignored...
- */
- ast_mutex_unlock(&p0->lock);
- ast_mutex_unlock(&p1->lock);
- ast_channel_unlock(c0);
- ast_channel_unlock(c1);
- return AST_BRIDGE_FAILED_NOWARN;
- }
-
-#if defined(HAVE_PRI)
- if ((dahdi_sig_pri_lib_handles(p0->sig)
- && ((struct sig_pri_chan *) p0->sig_pvt)->no_b_channel)
- || (dahdi_sig_pri_lib_handles(p1->sig)
- && ((struct sig_pri_chan *) p1->sig_pvt)->no_b_channel)) {
- /*
- * PRI nobch channels (hold and call waiting) are equivalent to
- * pseudo channels and cannot be done here.
- */
- ast_mutex_unlock(&p0->lock);
- ast_mutex_unlock(&p1->lock);
- ast_channel_unlock(c0);
- ast_channel_unlock(c1);
- return AST_BRIDGE_FAILED_NOWARN;
- }
-#endif /* defined(HAVE_PRI) */
-
- if ((oi0 == SUB_REAL) && (oi1 == SUB_REAL)) {
- if (p0->owner && p1->owner) {
- /* If we don't have a call-wait in a 3-way, and we aren't in a 3-way, we can be master */
- if (!p0->subs[SUB_CALLWAIT].inthreeway && !p1->subs[SUB_REAL].inthreeway) {
- master = p0;
- slave = p1;
- inconf = 1;
- } else if (!p1->subs[SUB_CALLWAIT].inthreeway && !p0->subs[SUB_REAL].inthreeway) {
- master = p1;
- slave = p0;
- inconf = 1;
- } else {
- ast_log(LOG_WARNING, "Huh? Both calls are callwaits or 3-ways? That's clever...?\n");
- ast_log(LOG_WARNING, "p0: chan %d/%d/CW%d/3W%d, p1: chan %d/%d/CW%d/3W%d\n",
- p0->channel,
- oi0, (p0->subs[SUB_CALLWAIT].dfd > -1) ? 1 : 0,
- p0->subs[SUB_REAL].inthreeway, p0->channel,
- oi0, (p1->subs[SUB_CALLWAIT].dfd > -1) ? 1 : 0,
- p1->subs[SUB_REAL].inthreeway);
- }
- nothingok = 0;
- }
- } else if ((oi0 == SUB_REAL) && (oi1 == SUB_THREEWAY)) {
- if (p1->subs[SUB_THREEWAY].inthreeway) {
- master = p1;
- slave = p0;
- nothingok = 0;
- }
- } else if ((oi0 == SUB_THREEWAY) && (oi1 == SUB_REAL)) {
- if (p0->subs[SUB_THREEWAY].inthreeway) {
- master = p0;
- slave = p1;
- nothingok = 0;
- }
- } else if ((oi0 == SUB_REAL) && (oi1 == SUB_CALLWAIT)) {
- /* We have a real and a call wait. If we're in a three way call, put us in it, otherwise,
- don't put us in anything */
- if (p1->subs[SUB_CALLWAIT].inthreeway) {
- master = p1;
- slave = p0;
- nothingok = 0;
- }
- } else if ((oi0 == SUB_CALLWAIT) && (oi1 == SUB_REAL)) {
- /* Same as previous */
- if (p0->subs[SUB_CALLWAIT].inthreeway) {
- master = p0;
- slave = p1;
- nothingok = 0;
- }
- }
- ast_debug(1, "master: %d, slave: %d, nothingok: %d\n",
- master ? master->channel : 0, slave ? slave->channel : 0, nothingok);
- if (master && slave) {
- /* Stop any tones, or play ringtone as appropriate. If they're bridged
- in an active threeway call with a channel that is ringing, we should
- indicate ringing. */
- if ((oi1 == SUB_THREEWAY) &&
- p1->subs[SUB_THREEWAY].inthreeway &&
- p1->subs[SUB_REAL].owner &&
- p1->subs[SUB_REAL].inthreeway &&
- (ast_channel_state(p1->subs[SUB_REAL].owner) == AST_STATE_RINGING)) {
- ast_debug(1,
- "Playing ringback on %d/%d(%s) since %d/%d(%s) is in a ringing three-way\n",
- p0->channel, oi0, ast_channel_name(c0), p1->channel, oi1, ast_channel_name(c1));
- tone_zone_play_tone(p0->subs[oi0].dfd, DAHDI_TONE_RINGTONE);
- os1 = ast_channel_state(p1->subs[SUB_REAL].owner);
- } else {
- ast_debug(1, "Stopping tones on %d/%d(%s) talking to %d/%d(%s)\n",
- p0->channel, oi0, ast_channel_name(c0), p1->channel, oi1, ast_channel_name(c1));
- tone_zone_play_tone(p0->subs[oi0].dfd, -1);
- }
- if ((oi0 == SUB_THREEWAY) &&
- p0->subs[SUB_THREEWAY].inthreeway &&
- p0->subs[SUB_REAL].owner &&
- p0->subs[SUB_REAL].inthreeway &&
- (ast_channel_state(p0->subs[SUB_REAL].owner) == AST_STATE_RINGING)) {
- ast_debug(1,
- "Playing ringback on %d/%d(%s) since %d/%d(%s) is in a ringing three-way\n",
- p1->channel, oi1, ast_channel_name(c1), p0->channel, oi0, ast_channel_name(c0));
- tone_zone_play_tone(p1->subs[oi1].dfd, DAHDI_TONE_RINGTONE);
- os0 = ast_channel_state(p0->subs[SUB_REAL].owner);
- } else {
- ast_debug(1, "Stopping tones on %d/%d(%s) talking to %d/%d(%s)\n",
- p1->channel, oi1, ast_channel_name(c1), p0->channel, oi0, ast_channel_name(c0));
- tone_zone_play_tone(p1->subs[oi1].dfd, -1);
- }
- if ((oi0 == SUB_REAL) && (oi1 == SUB_REAL)) {
- if (!p0->echocanbridged || !p1->echocanbridged) {
- /* Disable echo cancellation if appropriate */
- dahdi_disable_ec(p0);
- dahdi_disable_ec(p1);
- }
- }
- dahdi_link(slave, master);
- master->inconference = inconf;
- } else if (!nothingok)
- ast_log(LOG_WARNING, "Can't link %d/%s with %d/%s\n", p0->channel, subnames[oi0], p1->channel, subnames[oi1]);
-
- update_conf(p0);
- update_conf(p1);
- t0 = p0->subs[SUB_REAL].inthreeway;
- t1 = p1->subs[SUB_REAL].inthreeway;
-
- ast_mutex_unlock(&p0->lock);
- ast_mutex_unlock(&p1->lock);
-
- ast_channel_unlock(c0);
- ast_channel_unlock(c1);
-
- /* Native bridge failed */
- if ((!master || !slave) && !nothingok) {
- dahdi_enable_ec(p0);
- dahdi_enable_ec(p1);
- return AST_BRIDGE_FAILED;
- }
-
- ast_verb(3, "Native bridging %s and %s\n", ast_channel_name(c0), ast_channel_name(c1));
-
- if (!(flags & AST_BRIDGE_DTMF_CHANNEL_0) && (oi0 == SUB_REAL))
- disable_dtmf_detect(op0);
-
- if (!(flags & AST_BRIDGE_DTMF_CHANNEL_1) && (oi1 == SUB_REAL))
- disable_dtmf_detect(op1);
-
- for (;;) {
- struct ast_channel *c0_priority[2] = {c0, c1};
- struct ast_channel *c1_priority[2] = {c1, c0};
- int ms;
-
- /* Here's our main loop... Start by locking things, looking for private parts,
- and then balking if anything is wrong */
-
- ast_channel_lock_both(c0, c1);
-
- p0 = ast_channel_tech_pvt(c0);
- p1 = ast_channel_tech_pvt(c1);
-
- if (op0 == p0)
- i0 = dahdi_get_index(c0, p0, 1);
- if (op1 == p1)
- i1 = dahdi_get_index(c1, p1, 1);
-
- ast_channel_unlock(c0);
- ast_channel_unlock(c1);
-
- ms = ast_remaining_ms(start, timeoutms);
- if (!ms ||/* Did we timeout? */
- (op0 != p0) ||/* Did c0 get masqueraded or PRI changed associated B channel? */
- (op1 != p1) ||/* Did c1 get masqueraded or PRI changed associated B channel? */
- (ofd0 != ast_channel_fd(c0, 0)) ||/* Did c0 file descriptor change? (This is a redundant test with masquerade and active owner change) */
- (ofd1 != ast_channel_fd(c1, 0)) ||/* Did c1 file descriptor change? (This is a redundant test with masquerade and active owner change) */
- (p0->subs[SUB_REAL].owner && (os0 > -1) && (os0 != ast_channel_state(p0->subs[SUB_REAL].owner))) ||/* Did c0 state change? i.e. Did it stop ringing? */
- (p1->subs[SUB_REAL].owner && (os1 > -1) && (os1 != ast_channel_state(p1->subs[SUB_REAL].owner))) ||/* Did c1 state chagne? i.e. Did it stop ringing? */
- (oc0 != p0->owner) ||/* Did the p0 active owner change? */
- (oc1 != p1->owner) ||/* Did the p1 active owner change? */
- (t0 != p0->subs[SUB_REAL].inthreeway) ||/* Did the p0 three way call status change? */
- (t1 != p1->subs[SUB_REAL].inthreeway) ||/* Did the p1 three way call status change? */
- (oi0 != i0) ||/* Did the owner index change? */
- (oi1 != i1)) {/* Did the owner index change? */
- ast_debug(1, "Something changed out on %d/%d to %d/%d, returning -3 to restart\n",
- op0->channel, oi0, op1->channel, oi1);
- res = AST_BRIDGE_RETRY;
- goto return_from_bridge;
- }
-
-#ifdef PRI_2BCT
- if (!triedtopribridge) {
- triedtopribridge = 1;
- if (p0->pri && p0->pri == p1->pri && p0->pri->transfer) {
- ast_mutex_lock(&p0->pri->lock);
- switch (p0->sig) {
- case SIG_PRI_LIB_HANDLE_CASES:
- q931c0 = ((struct sig_pri_chan *) (p0->sig_pvt))->call;
- break;
- default:
- q931c0 = NULL;
- break;
- }
- switch (p1->sig) {
- case SIG_PRI_LIB_HANDLE_CASES:
- q931c1 = ((struct sig_pri_chan *) (p1->sig_pvt))->call;
- break;
- default:
- q931c1 = NULL;
- break;
- }
- if (q931c0 && q931c1) {
- pri_channel_bridge(q931c0, q931c1);
- }
- ast_mutex_unlock(&p0->pri->lock);
- }
- }
-#endif
-
- who = ast_waitfor_n(priority ? c0_priority : c1_priority, 2, &ms);
- if (!who) {
- ast_debug(1, "Ooh, empty read...\n");
- continue;
- }
- f = ast_read(who);
- switch (f ? f->frametype : AST_FRAME_CONTROL) {
- case AST_FRAME_CONTROL:
- if (f && f->subclass.integer == AST_CONTROL_PVT_CAUSE_CODE) {
- ast_channel_hangupcause_hash_set((who == c0) ? c1 : c0, f->data.ptr, f->datalen);
- break;
- }
- *fo = f;
- *rc = who;
- res = AST_BRIDGE_COMPLETE;
- goto return_from_bridge;
- case AST_FRAME_DTMF_END:
- if ((who == c0) && p0->pulsedial) {
- ast_write(c1, f);
- } else if ((who == c1) && p1->pulsedial) {
- ast_write(c0, f);
- } else {
- *fo = f;
- *rc = who;
- res = AST_BRIDGE_COMPLETE;
- goto return_from_bridge;
- }
- break;
- case AST_FRAME_TEXT:
- if (who == c0) {
- ast_write(c1, f);
- } else {
- ast_write(c0, f);
- }
- break;
- case AST_FRAME_VOICE:
- /* Native bridge handles voice frames in hardware. */
- case AST_FRAME_NULL:
- break;
- default:
- ast_debug(1, "Chan '%s' is discarding frame of frametype:%d\n",
- ast_channel_name(who), f->frametype);
- break;
- }
- ast_frfree(f);
-
- /* Swap who gets priority */
- priority = !priority;
- }
-
-return_from_bridge:
- if (op0 == p0)
- dahdi_enable_ec(p0);
-
- if (op1 == p1)
- dahdi_enable_ec(p1);
-
- if (!(flags & AST_BRIDGE_DTMF_CHANNEL_0) && (oi0 == SUB_REAL))
- enable_dtmf_detect(op0);
-
- if (!(flags & AST_BRIDGE_DTMF_CHANNEL_1) && (oi1 == SUB_REAL))
- enable_dtmf_detect(op1);
-
- dahdi_unlink(slave, master, 1);
-
- return res;
}
static int dahdi_fixup(struct ast_channel *oldchan, struct ast_channel *newchan)
More information about the asterisk-commits
mailing list