diff --git a/channels/h323/ast_h323.cpp b/channels/h323/ast_h323.cpp index 84ea8f8bee9246848d752665403fdebbf4564db0..f59d086846f67cf56db34c9d517fcc981c681558 100755 --- a/channels/h323/ast_h323.cpp +++ b/channels/h323/ast_h323.cpp @@ -23,6 +23,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * + * Version Info: $Id$ */ #include "ast_h323.h" #include "h323t38.h" @@ -601,21 +602,29 @@ H323Channel * MyH323Connection::CreateRealTimeLogicalChannel(const H323Capabilit unsigned sessionID, const H245_H2250LogicalChannelParameters * /*param*/) { - WORD port; - - /* Establish the Local (A side) IP Address */ - GetControlChannel().GetLocalAddress().GetIpAndPort(externalIpAddress, port); + struct rtp_info *info; + WORD port; + + /* Determine the Local (A side) IP Address and port */ + info = on_create_connection(GetCallReference()); - /* Notify Asterisk of the request and get the port */ - externalPort = on_create_connection(GetCallReference()); +// if (bridging) { +// externalIpAddress = PIPSocket::Address(info->addr); +// } else { + GetControlChannel().GetLocalAddress().GetIpAndPort(externalIpAddress, port); +// } + +// externalIpAddress = PIPSocket::Address("192.168.1.50"); + externalPort = info->port; + if (h323debug) { cout << " =*= In CreateRealTimeLogicalChannel for call " << GetCallReference() << endl; cout << " -- externalIpAddress: " << externalIpAddress << endl; cout << " -- externalPort: " << externalPort << endl; + cout << " -- SessionID: " << sessionID << endl; cout << " -- Direction: " << dir << endl; } - return new H323_ExternalRTPChannel(*this, capability, dir, sessionID, externalIpAddress, externalPort); } @@ -1028,23 +1037,28 @@ int h323_show_codec(int fd, int argc, char *argv[]) /* alas, this doesn't work :( */ -void h323_native_bridge(const char *token, char *them, char *us) +void h323_native_bridge(const char *token, char *them, char *capability) { H323Channel *channel; - H323Connection *connection = endPoint->FindConnectionWithLock(token); - - - cout << "Native Bridge: them [" << them << "] us [" << us << "]" << endl; + MyH323Connection *connection = (MyH323Connection *)endPoint->FindConnectionWithLock(token); + PString mode(capability); + if (!mode) { + return; + } + if (!connection){ - cout << "ERROR: No connection active.\n"; + cout << "ERROR: No connection found, this is bad\n"; return; } - connection->Unlock(); - channel = connection->FindChannel(RTP_Session::DefaultAudioSessionID, TRUE); - H323_ExternalRTPChannel *external = (H323_ExternalRTPChannel *)channel; - external->SetExternalAddress(them, us); // data (RTP), control (Asterisk) + cout << "Native Bridge: them [" << them << "]" << endl; + + channel = connection->FindChannel(connection->sessionId, TRUE); + connection->bridging = TRUE; + connection->CloseLogicalChannelNumber(channel->GetNumber()); + connection->RequestModeChange(mode); + connection->Unlock(); return; } diff --git a/channels/h323/ast_h323.h b/channels/h323/ast_h323.h index 050bf61c6d5ca6e2be7e445cada5882ef28e7281..c713a842e609233d1ad0d32a94715eea6737ee3d 100755 --- a/channels/h323/ast_h323.h +++ b/channels/h323/ast_h323.h @@ -23,6 +23,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * + * Version Info: $Id$ */ @@ -153,8 +154,8 @@ class MyH323Connection : public H323Connection { PIPSocket::Address remoteIpAddress; // IP Address of remote endpoint WORD externalPort; // local media server Data port (control is dataPort+1) WORD remotePort; // remote endpoint Data port (control is dataPort+1) - - PSyncPoint bridgeFlag; + WORD sessionId; + BOOL bridging; // Used to help determine which IP to use }; diff --git a/channels/h323/chan_h323.h b/channels/h323/chan_h323.h index 926a2ea4abd4f5b7bdcee41f4fd4a374a3012848..190a8244fbd3585360dcd290e34cc98abfb921b6 100755 --- a/channels/h323/chan_h323.h +++ b/channels/h323/chan_h323.h @@ -23,6 +23,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * + * Version Info: $Id$ */ #include <arpa/inet.h> @@ -105,6 +106,11 @@ typedef struct call_details { const char *sourceIp; } call_details_t; +typedef struct rtp_info { + char *addr; + unsigned int port; +} rtp_info_t; + /* This is a callback prototype function, called pass DTMF down the RTP. */ typedef int (*send_digit_cb)(unsigned, char); @@ -112,7 +118,7 @@ send_digit_cb on_send_digit; /* This is a callback prototype function, called to collect the external RTP port from Asterisk. */ -typedef int (*on_connection_cb)(unsigned); +typedef rtp_info_t *(*on_connection_cb)(unsigned); on_connection_cb on_create_connection; /* This is a callback prototype function, called upon