From: Andreas Eversberg Date: Sat, 8 Dec 2012 09:58:47 +0000 (+0100) Subject: Fix: 3PTY bridge must check, if other 3PTY member is mISDN or not X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=lcr.git;a=commitdiff_plain;h=fa1f601f49879958ac9fc698b044012c772ec7da;hp=84b78bea8c72333026c9eb6cef90471ca41588d7 Fix: 3PTY bridge must check, if other 3PTY member is mISDN or not To make decision for mISDN bridge or lcr bridge, it it is required to check both joins that share same 3PTY bridge. --- diff --git a/joinpbx.cpp b/joinpbx.cpp index c3e9e31..5d88fa2 100644 --- a/joinpbx.cpp +++ b/joinpbx.cpp @@ -300,6 +300,8 @@ void JoinPBX::bridge(void) struct port_list *portlist; class Port *port; unsigned int bridge_id; + class Join *join_3pty; + class JoinPBX *joinpbx_3pty; #ifdef DEBUG_COREBRIDGE int allmISDN = 0; // never set for debug purpose #else @@ -356,10 +358,65 @@ void JoinPBX::bridge(void) relation = relation->next; continue; } - + relation = relation->next; } + /* check if 3pty members have no mISDN, so bridging via mISDN/lcr will be selected correctly */ + join_3pty = find_join_id(j_3pty); + if (join_3pty && join_3pty->j_type == JOIN_TYPE_PBX) { + joinpbx_3pty = (class JoinPBX *)join_3pty; + relation = joinpbx_3pty->j_relation; + while(relation) { + +#if 0 +no need to count, because j_3pty is taken into account below when checking relations + /* count all relations */ + relations++; +#endif + + /* check for relation's objects */ + epoint = find_epoint_id(relation->epoint_id); + if (!epoint) { + PERROR("software error: relation without existing endpoints.\n"); + relation = relation->next; + continue; + } + portlist = epoint->ep_portlist; + if (!portlist) { + PDEBUG(DEBUG_JOIN, "other 3pty join %d: ignoring relation without port object.\n", joinpbx_3pty->j_serial); +//#warning testing: keep on hold until single audio stream available + relation->channel_state = 0; + relation = relation->next; + continue; + } + if (portlist->next) { + PDEBUG(DEBUG_JOIN, "other 3pty join %d: ignoring relation with ep%d due to port_list.\n", joinpbx_3pty->j_serial, epoint->ep_serial); +//#warning testing: keep on hold until single audio stream available + relation->channel_state = 0; + relation = relation->next; + continue; + } + port = find_port_id(portlist->port_id); + if (!port) { + PDEBUG(DEBUG_JOIN, "other 3pty join %d: ignoring relation without existing port object.\n", joinpbx_3pty->j_serial); + relation = relation->next; + continue; + } + if ((port->p_type&PORT_CLASS_MASK)!=PORT_CLASS_mISDN) { + PDEBUG(DEBUG_JOIN, "other 3pty join %d: ignoring relation ep%d because it's port is not mISDN.\n", joinpbx_3pty->j_serial, epoint->ep_serial); + if (allmISDN) { + PDEBUG(DEBUG_JOIN, "other 3pty join %d: not all endpoints are mISDN.\n", joinpbx_3pty->j_serial); + allmISDN = 0; + } + relation = relation->next; + continue; + } + + relation = relation->next; + } + } + PDEBUG(DEBUG_JOIN, "join%d members=%d %s\n", j_serial, relations, (allmISDN)?"(all are mISDN-members)":"(not all are mISDN-members)"); /* we notify all relations about rxdata. */ relation = j_relation;