connection.h

Go to the documentation of this file.
00001 /*
00002  * connection.h
00003  *
00004  * Telephony connection abstraction
00005  *
00006  * Open Phone Abstraction Library (OPAL)
00007  * Formally known as the Open H323 project.
00008  *
00009  * Copyright (c) 2001 Equivalence Pty. Ltd.
00010  *
00011  * The contents of this file are subject to the Mozilla Public License
00012  * Version 1.0 (the "License"); you may not use this file except in
00013  * compliance with the License. You may obtain a copy of the License at
00014  * http://www.mozilla.org/MPL/
00015  *
00016  * Software distributed under the License is distributed on an "AS IS"
00017  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00018  * the License for the specific language governing rights and limitations
00019  * under the License.
00020  *
00021  * The Original Code is Open Phone Abstraction Library.
00022  *
00023  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
00024  *
00025  * Contributor(s): ______________________________________.
00026  *
00027  * $Log: connection.h,v $
00028  * Revision 2.49.2.3  2006/10/28 16:41:58  dsandras
00029  * Backported patch from HEAD to fix SIP reinvite without breaking
00030  * H.323 calls.
00031  *
00032  * Revision 2.49.2.2  2006/03/20 10:48:34  csoutheren
00033  * Backport from CVS head
00034  *
00035  * Revision 2.49.2.1  2006/02/06 04:38:37  csoutheren
00036  * Backported RTP payload mapping fixes from CVS head
00037  * Revision 2.52  2006/03/20 10:37:47  csoutheren
00038  * Applied patch #1453753 - added locking on media stream manipulation
00039  * Thanks to Dinis Rosario
00040  *
00041  * Revision 2.50  2006/02/02 07:02:56  csoutheren
00042  * Added RTP payload map to transcoders and connections to allow remote SIP endpoints
00043  * to change the payload type used for outgoing RTP.
00044  *
00045  * Revision 2.49  2006/01/09 12:19:06  csoutheren
00046  * Added member variables to capture incoming destination addresses
00047  *
00048  * Revision 2.48  2005/12/06 21:32:24  dsandras
00049  * Applied patch from Frederic Heem <frederic.heem _Atttt_ telsey.it> to fix
00050  * assert in PSyncPoint when OnReleased is called twice from different threads.
00051  * Thanks! (Patch #1374240)
00052  *
00053  * Revision 2.47  2005/11/30 13:35:26  csoutheren
00054  * Changed tags for Doxygen
00055  *
00056  * Revision 2.46  2005/11/24 20:31:54  dsandras
00057  * Added support for echo cancelation using Speex.
00058  * Added possibility to add a filter to an OpalMediaPatch for all patches of a connection.
00059  *
00060  * Revision 2.45  2005/10/04 12:57:18  rjongbloed
00061  * Removed CanOpenSourceMediaStream/CanOpenSinkMediaStream functions and
00062  *   now use overides on OpenSourceMediaStream/OpenSinkMediaStream
00063  *
00064  * Revision 2.44  2005/09/15 17:02:40  dsandras
00065  * Added the possibility for a connection to prevent the opening of a sink/source media stream.
00066  *
00067  * Revision 2.43  2005/08/24 10:43:51  rjongbloed
00068  * Changed create video functions yet again so can return pointers that are not to be deleted.
00069  *
00070  * Revision 2.42  2005/08/23 12:45:09  rjongbloed
00071  * Fixed creation of video preview window and setting video grab/display initial frame size.
00072  *
00073  * Revision 2.41  2005/08/04 17:21:01  dsandras
00074  * Added functions to close/remove the media streams of a connection.
00075  *
00076  * Revision 2.40  2005/07/14 08:51:17  csoutheren
00077  * Removed CreateExternalRTPAddress - it's not needed because you can override GetMediaAddress
00078  * to do the same thing
00079  * Fixed problems with logic associated with media bypass
00080  *
00081  * Revision 2.39  2005/07/11 06:52:15  csoutheren
00082  * Added support for outgoing calls using external RTP
00083  *
00084  * Revision 2.38  2005/07/11 01:52:23  csoutheren
00085  * Extended AnsweringCall to work for SIP as well as H.323
00086  * Fixed problems with external RTP connection in H.323
00087  * Added call to OnClosedMediaStream
00088  *
00089  * Revision 2.37  2005/04/11 11:12:00  dsandras
00090  * Fixed previous commit.
00091  *
00092  * Revision 2.36  2005/04/11 10:42:35  dsandras
00093  * Fixed previous commit.
00094  *
00095  * Revision 2.35  2005/04/10 20:43:39  dsandras
00096  * Added support for function allowing to put the OpalMediaStreams on pause.
00097  *
00098  * Revision 2.34  2005/04/10 20:42:33  dsandras
00099  * Added support for a function that returns the "best guess" callback URL.
00100  *
00101  * Revision 2.33  2005/04/10 20:41:29  dsandras
00102  * Added support for call hold.
00103  *
00104  * Revision 2.32  2005/04/10 20:40:20  dsandras
00105  * Added support for Blind Transfert.
00106  *
00107  * Revision 2.31  2005/01/16 11:28:05  csoutheren
00108  * Added GetIdentifier virtual function to OpalConnection, and changed H323
00109  * and SIP descendants to use this function. This allows an application to
00110  * obtain a GUID for any connection regardless of the protocol used
00111  *
00112  * Revision 2.30  2004/12/12 12:29:02  dsandras
00113  * Moved GetRemoteApplication () to OpalConnection so that it is usable for all types of connection.
00114  *
00115  * Revision 2.29  2004/08/14 07:56:29  rjongbloed
00116  * Major revision to utilise the PSafeCollection classes for the connections and calls.
00117  *
00118  * Revision 2.28  2004/05/17 13:24:18  rjongbloed
00119  * Added silence suppression.
00120  *
00121  * Revision 2.27  2004/05/01 10:00:51  rjongbloed
00122  * Fixed ClearCallSynchronous so now is actually signalled when call is destroyed.
00123  *
00124  * Revision 2.26  2004/04/26 04:33:05  rjongbloed
00125  * Move various call progress times from H.323 specific to general conenction.
00126  *
00127  * Revision 2.25  2004/04/18 13:31:28  rjongbloed
00128  * Added new end call value from OpenH323.
00129  *
00130  * Revision 2.24  2004/03/13 06:25:50  rjongbloed
00131  * Slight rearrangement of local party name and alias list to beter match common
00132  *   behaviour in ancestor.
00133  * Abstracted local party name for endpoint into ancestor from H.,323.
00134  *
00135  * Revision 2.23  2004/03/11 06:54:27  csoutheren
00136  * Added ability to disable SIP or H.323 stacks
00137  *
00138  * Revision 2.22  2004/02/24 11:28:45  rjongbloed
00139  * Normalised RTP session management across protocols
00140  *
00141  * Revision 2.21  2003/03/17 10:26:59  robertj
00142  * Added video support.
00143  *
00144  * Revision 2.20  2003/03/06 03:57:47  robertj
00145  * IVR support (work in progress) requiring large changes everywhere.
00146  *
00147  * Revision 2.19  2003/01/07 04:39:53  robertj
00148  * Updated to OpenH323 v1.11.2
00149  *
00150  * Revision 2.18  2002/11/10 11:33:17  robertj
00151  * Updated to OpenH323 v1.10.3
00152  *
00153  * Revision 2.17  2002/09/16 02:52:35  robertj
00154  * Added #define so can select if #pragma interface/implementation is used on
00155  *   platform basis (eg MacOS) rather than compiler, thanks Robert Monaghan.
00156  *
00157  * Revision 2.16  2002/09/12 06:54:06  robertj
00158  * Added missing virtual to Release() function so can be overridden.
00159  *
00160  * Revision 2.15  2002/07/01 04:56:30  robertj
00161  * Updated to OpenH323 v1.9.1
00162  *
00163  * Revision 2.14  2002/04/10 03:08:42  robertj
00164  * Moved code for handling media bypass address resolution into ancestor as
00165  *   now done ths same way in both SIP and H.323.
00166  *
00167  * Revision 2.13  2002/04/09 00:16:46  robertj
00168  * Changed "callAnswered" to better description of "originating".
00169  *
00170  * Revision 2.12  2002/02/19 07:42:07  robertj
00171  * Added OpalRFC2833 as a OpalMediaFormat variable.
00172  * Restructured media bypass functions to fix problems with RFC2833.
00173  *
00174  * Revision 2.11  2002/02/11 09:32:12  robertj
00175  * Updated to openH323 v1.8.0
00176  *
00177  * Revision 2.10  2002/02/11 07:38:35  robertj
00178  * Added media bypass for streams between compatible protocols.
00179  *
00180  * Revision 2.9  2002/01/22 05:04:21  robertj
00181  * Revamp of user input API triggered by RFC2833 support
00182  *
00183  * Revision 2.8  2001/11/14 01:31:55  robertj
00184  * Corrected placement of adjusting media format list.
00185  *
00186  * Revision 2.7  2001/11/02 10:45:19  robertj
00187  * Updated to OpenH323 v1.7.3
00188  *
00189  * Revision 2.6  2001/10/15 04:29:14  robertj
00190  * Added delayed start of media patch threads.
00191  * Removed answerCall signal and replaced with state based functions.
00192  *
00193  * Revision 2.5  2001/10/03 05:56:15  robertj
00194  * Changes abndwidth management API.
00195  *
00196  * Revision 2.4  2001/08/22 10:20:09  robertj
00197  * Changed connection locking to use double mutex to guarantee that
00198  *   no threads can ever deadlock or access deleted connection.
00199  *
00200  * Revision 2.3  2001/08/17 08:22:23  robertj
00201  * Moved call end reasons enum from OpalConnection to global.
00202  *
00203  * Revision 2.2  2001/08/13 05:10:39  robertj
00204  * Updates from OpenH323 v1.6.0 release.
00205  *
00206  * Revision 2.1  2001/08/01 05:26:35  robertj
00207  * Moved media formats list from endpoint to connection.
00208  *
00209  * Revision 2.0  2001/07/27 15:48:24  robertj
00210  * Conversion of OpenH323 to Open Phone Abstraction Library (OPAL)
00211  *
00212  */
00213 
00214 #ifndef __OPAL_CONNECTION_H
00215 #define __OPAL_CONNECTION_H
00216 
00217 #ifdef P_USE_PRAGMA
00218 #pragma interface
00219 #endif
00220 
00221 #include <opal/buildopts.h>
00222 
00223 #include <opal/mediafmt.h>
00224 #include <opal/mediastrm.h>
00225 #include <opal/guid.h>
00226 #include <opal/transports.h>
00227 #include <ptclib/dtmf.h>
00228 #include <ptlib/safecoll.h>
00229 #include <rtp/rtp.h>
00230 
00231 class OpalEndPoint;
00232 class OpalCall;
00233 class OpalSilenceDetector;
00234 class OpalEchoCanceler;
00235 class OpalRFC2833Proto;
00236 class OpalRFC2833Info;
00237 class OpalT120Protocol;
00238 class OpalT38Protocol;
00239 
00240 
00258 class OpalConnection : public PSafeObject
00259 {
00260     PCLASSINFO(OpalConnection, PSafeObject);
00261   public:
00266     enum CallEndReason {
00267       EndedByLocalUser,         
00268       EndedByNoAccept,          
00269       EndedByAnswerDenied,      
00270       EndedByRemoteUser,        
00271       EndedByRefusal,           
00272       EndedByNoAnswer,          
00273       EndedByCallerAbort,       
00274       EndedByTransportFail,     
00275       EndedByConnectFail,       
00276       EndedByGatekeeper,        
00277       EndedByNoUser,            
00278       EndedByNoBandwidth,       
00279       EndedByCapabilityExchange,
00280       EndedByCallForwarded,     
00281       EndedBySecurityDenial,    
00282       EndedByLocalBusy,         
00283       EndedByLocalCongestion,   
00284       EndedByRemoteBusy,        
00285       EndedByRemoteCongestion,  
00286       EndedByUnreachable,       
00287       EndedByNoEndPoint,        
00288       EndedByHostOffline,       
00289       EndedByTemporaryFailure,  
00290       EndedByQ931Cause,         
00291       EndedByDurationLimit,     
00292       EndedByInvalidConferenceID, 
00293       NumCallEndReasons
00294     };
00295 
00296 #if PTRACING
00297     friend ostream & operator<<(ostream & o, CallEndReason reason);
00298 #endif
00299 
00300     enum AnswerCallResponse {
00301       AnswerCallNow,               
00302       AnswerCallDenied,            
00303       AnswerCallPending,           
00304       AnswerCallDeferred,          
00305       AnswerCallAlertWithMedia,    
00306       AnswerCallDeferredWithMedia, 
00307       NumAnswerCallResponses
00308     };
00309 #if PTRACING
00310     friend ostream & operator<<(ostream & o, AnswerCallResponse s);
00311 #endif
00312 
00313 
00318     OpalConnection(
00319       OpalCall & call,          
00320       OpalEndPoint & endpoint,  
00321       const PString & token     
00322     );
00323 
00326     ~OpalConnection();
00328 
00335     void PrintOn(
00336       ostream & strm    
00337     ) const;
00339 
00342     enum Phases {
00343       UninitialisedPhase,
00344       SetUpPhase,
00345       AlertingPhase,
00346       ConnectedPhase,
00347       EstablishedPhase,
00348       ReleasingPhase, // Note these must be the last two phases.
00349       ReleasedPhase,
00350       NumPhases
00351     };
00352 
00357     inline Phases GetPhase() const { return phase; }
00358 
00367     CallEndReason GetCallEndReason() const { return callEndReason; }
00368 
00373     virtual void SetCallEndReason(
00374       CallEndReason reason        
00375     );
00376 
00384     void ClearCall(
00385       CallEndReason reason = EndedByLocalUser 
00386     );
00387 
00390     virtual void ClearCallSynchronous(
00391       PSyncPoint * sync,
00392       CallEndReason reason = EndedByLocalUser  
00393     );
00394 
00398     virtual void TransferConnection(
00399       const PString & remoteParty,   
00400       const PString & callIdentity = PString::Empty()
00402     );
00403     
00406     virtual void HoldConnection();
00407 
00411     virtual void RetrieveConnection();
00412 
00415     virtual BOOL IsConnectionOnHold();
00417 
00441     virtual BOOL OnIncomingConnection();
00442 
00449     virtual BOOL SetUpConnection() = 0;
00450 
00466     virtual void OnAlerting();
00467 
00478     virtual BOOL SetAlerting(
00479       const PString & calleeName,   
00480       BOOL withMedia                
00481     ) = 0;
00482 
00499     virtual AnswerCallResponse OnAnswerCall(
00500       const PString & callerName        
00501     );
00502 
00513     virtual void AnsweringCall(
00514       AnswerCallResponse response 
00515     );
00516 
00527     virtual void OnConnected();
00528 
00533     virtual BOOL SetConnected() = 0;
00534 
00545     virtual void OnEstablished();
00546 
00555     virtual void Release(
00556       CallEndReason reason = EndedByLocalUser 
00557     );
00558 
00576     virtual void OnReleased();
00578 
00588     virtual PString GetDestinationAddress();
00589 
00599     virtual BOOL ForwardCall(
00600       const PString & forwardParty   
00601     );
00603 
00612     virtual OpalMediaFormatList GetMediaFormats() const = 0;
00613 
00622     virtual void AdjustMediaFormats(
00623       OpalMediaFormatList & mediaFormats  
00624     ) const;
00625     
00628     virtual BOOL OpenSourceMediaStream(
00629       const OpalMediaFormatList & mediaFormats, 
00630       unsigned sessionID                   
00631     );
00632 
00635     virtual OpalMediaStream * OpenSinkMediaStream(
00636       OpalMediaStream & source    
00637     );
00638 
00641     virtual void StartMediaStreams();
00642     
00645     virtual void CloseMediaStreams();
00646     
00649     virtual void RemoveMediaStreams();
00650     
00653     virtual void PauseMediaStreams(BOOL paused);
00654 
00669     virtual OpalMediaStream * CreateMediaStream(
00670       const OpalMediaFormat & mediaFormat, 
00671       unsigned sessionID,                  
00672       BOOL isSource                        
00673     );
00674 
00686     virtual BOOL OnOpenMediaStream(
00687       OpalMediaStream & stream    
00688     );
00689 
00694     virtual void OnClosedMediaStream(
00695       const OpalMediaStream & stream     
00696     );
00697     
00702     virtual void OnPatchMediaStream(
00703       BOOL isSource,
00704       OpalMediaPatch & patch    
00705     );
00706 
00712     OpalMediaStream * GetMediaStream(
00713       unsigned sessionId,  
00714       BOOL source          
00715     ) const;
00716 
00722     virtual BOOL IsMediaBypassPossible(
00723       unsigned sessionID                  
00724     ) const;
00725 
00728     struct MediaInformation {
00729       MediaInformation() { rfc2833 = RTP_DataFrame::IllegalPayloadType; }
00730 
00731       OpalTransportAddress data;           
00732       OpalTransportAddress control;        
00733       RTP_DataFrame::PayloadTypes rfc2833; 
00734     };
00735 
00744     virtual BOOL GetMediaInformation(
00745       unsigned sessionID,     
00746       MediaInformation & info 
00747     ) const;
00748 
00753     virtual void AddVideoMediaFormats(
00754       OpalMediaFormatList & mediaFormats  
00755     ) const;
00756 
00759     virtual BOOL CreateVideoInputDevice(
00760       const OpalMediaFormat & mediaFormat,  
00761       PVideoInputDevice * & device,         
00762       BOOL & autoDelete                     
00763     );
00764 
00768     virtual BOOL CreateVideoOutputDevice(
00769       const OpalMediaFormat & mediaFormat,  
00770       BOOL preview,                         
00771       PVideoOutputDevice * & device,        
00772       BOOL & autoDelete                     
00773     );
00775 
00781     virtual RTP_Session * GetSession(
00782       unsigned sessionID    
00783     ) const;
00784 
00799     virtual RTP_Session * UseSession(
00800       const OpalTransport & transport,  
00801       unsigned sessionID,               
00802       RTP_QOS * rtpqos = NULL           
00803     );
00804 
00809     virtual void ReleaseSession(
00810       unsigned sessionID,    
00811       BOOL clearAll = FALSE  
00812     );
00813 
00818     virtual RTP_Session * CreateSession(
00819       const OpalTransport & transport,
00820       unsigned sessionID,
00821       RTP_QOS * rtpqos
00822     );
00824 
00829     unsigned GetBandwidthAvailable() const { return bandwidthAvailable; }
00830 
00835     virtual BOOL SetBandwidthAvailable(
00836       unsigned newBandwidth,    
00837       BOOL force = FALSE        
00838     );
00839 
00844     virtual unsigned GetBandwidthUsed() const;
00845 
00854     virtual BOOL SetBandwidthUsed(
00855       unsigned releasedBandwidth,   
00856       unsigned requiredBandwidth    
00857     );
00859 
00868     virtual BOOL SendUserInputString(
00869       const PString & value                   
00870     );
00871 
00888     virtual BOOL SendUserInputTone(
00889       char tone,        
00890       unsigned duration = 0  
00891     );
00892 
00899     virtual void OnUserInputString(
00900       const PString & value   
00901     );
00902 
00909     virtual void OnUserInputTone(
00910       char tone,
00911       unsigned duration
00912     );
00913 
00917     void SendUserInputHookFlash(
00918       unsigned duration = 500  
00919     ) { SendUserInputTone('!', duration); }
00920 
00923     virtual PString GetUserInput(
00924       unsigned timeout = 30   
00925     );
00926 
00931     virtual void SetUserInput(
00932       const PString & input     
00933     );
00934 
00937     virtual PString ReadUserInput(
00938       const char * terminators = "#\r\n", 
00939       unsigned lastDigitTimeout = 4,      
00940       unsigned firstDigitTimeout = 30     
00941     );
00942 
00949     virtual BOOL PromptUserInput(
00950       BOOL play   
00951     );
00953 
00968     virtual OpalT120Protocol * CreateT120ProtocolHandler();
00969 
00982     virtual OpalT38Protocol * CreateT38ProtocolHandler();
00983 
00985 
00990     OpalEndPoint & GetEndPoint() const { return endpoint; }
00991     
00994     OpalCall & GetCall() const { return ownerCall; }
00995 
00998     const PString & GetToken() const { return callToken; }
00999 
01002     BOOL IsOriginating() const { return originating; }
01003 
01006     PTime GetSetupUpTime() const { return setupTime; }
01007 
01010     PTime GetAlertingTime() const { return alertingTime; }
01011 
01014     PTime GetConnectionStartTime() const { return connectedTime; }
01015 
01018     PTime GetConnectionEndTime() const { return callEndTime; }
01019 
01022     const PString & GetLocalPartyName() const { return localPartyName; }
01023 
01026     virtual void SetLocalPartyName(const PString & name);
01027 
01030     const PString & GetDisplayName() const { return displayName; }
01031 
01034     void SetDisplayName(const PString & name) { displayName = name; }
01035 
01038     const PString & GetRemotePartyName() const { return remotePartyName; }
01039 
01042     const PString & GetRemoteApplication() const { return remoteApplication; }
01043     
01048     const PString & GetRemotePartyNumber() const { return remotePartyNumber; }
01049 
01052     const PString & GetRemotePartyAddress() const { return remotePartyAddress; }
01053 
01058     virtual const PString GetRemotePartyCallbackURL() const { return remotePartyAddress; }
01059 
01060 
01064     virtual const PString & GetCalledDestinationNumber() const { return calledDestinationNumber; }
01065 
01069     virtual const PString & GetCalledDestinationName() const { return calledDestinationName; }
01070 
01074     unsigned GetMinAudioJitterDelay() const { return minAudioJitterDelay; }
01075 
01079     unsigned GetMaxAudioJitterDelay() const { return maxAudioJitterDelay; }
01080 
01083     void SetAudioJitterDelay(
01084       unsigned minDelay,   
01085       unsigned maxDelay    
01086     );
01087 
01090     OpalSilenceDetector * GetSilenceDetector() const { return silenceDetector; }
01091     
01094     OpalEchoCanceler * GetEchoCanceler() const { return echoCanceler; }
01095 
01098     virtual const OpalGloballyUniqueID & GetIdentifier() const
01099     { return callIdentifier; }
01100 
01101     virtual OpalTransport & GetTransport() const
01102     { return *(OpalTransport *)NULL; }
01103 
01104     PDICTIONARY(MediaAddressesDict, POrdinalKey, OpalTransportAddress);
01105     MediaAddressesDict & GetMediaTransportAddresses()
01106     { return mediaTransportAddresses; }
01107 
01109 
01110     const RTP_DataFrame::PayloadMapType & GetRTPPayloadMap() const
01111     { return rtpPayloadMap; }
01112 
01113     PMutex & GetMediaStreamMutex() { return mediaStreamMutex; }
01114 
01115   protected:
01116     PDECLARE_NOTIFIER(OpalRFC2833Info, OpalConnection, OnUserInputInlineRFC2833);
01117     PDECLARE_NOTIFIER(RTP_DataFrame, OpalConnection, OnUserInputInBandDTMF);
01118     PDECLARE_NOTIFIER(PThread, OpalConnection, OnReleaseThreadMain);
01119 
01120   // Member variables
01121     OpalCall             & ownerCall;
01122     OpalEndPoint         & endpoint;
01123 
01124     Phases               phase;
01125     PString              callToken;
01126     OpalGloballyUniqueID callIdentifier;
01127     BOOL                 originating;
01128     PTime                setupTime;
01129     PTime                alertingTime;
01130     PTime                connectedTime;
01131     PTime                callEndTime;
01132     PString              localPartyName;
01133     PString              displayName;
01134     PString              remotePartyName;
01135     PString              remoteApplication;
01136     PString              remotePartyNumber;
01137     PString              remotePartyAddress;
01138     CallEndReason        callEndReason;
01139     PString              calledDestinationNumber;
01140     PString              calledDestinationName;
01141 
01142     PString               userInputString;
01143     PMutex                userInputMutex;
01144     PSyncPoint            userInputAvailable;
01145     BOOL                  detectInBandDTMF;
01146     OpalSilenceDetector * silenceDetector;
01147     OpalEchoCanceler  * echoCanceler;
01148     OpalRFC2833Proto    * rfc2833Handler;
01149     OpalT120Protocol    * t120handler;
01150     OpalT38Protocol     * t38handler;
01151 
01152 
01153     MediaAddressesDict  mediaTransportAddresses;
01154     PMutex              mediaStreamMutex;
01155     OpalMediaStreamList mediaStreams;
01156     RTP_SessionManager  rtpSessions;
01157     unsigned            minAudioJitterDelay;
01158     unsigned            maxAudioJitterDelay;
01159     unsigned            bandwidthAvailable;
01160 
01161     RTP_DataFrame::PayloadMapType rtpPayloadMap;
01162 
01163     // The In-Band DTMF detector. This is used inside an audio filter which is
01164     // added to the audio channel.
01165     PDTMFDecoder        dtmfDecoder;
01166 
01170     void SetPhase(Phases phaseToSet);
01171 
01172 #if PTRACING
01173     friend ostream & operator<<(ostream & o, Phases p);
01174 #endif
01175 };
01176 
01177 
01178 #endif // __OPAL_CONNECTION_H
01179 
01180 
01181 // End of File ///////////////////////////////////////////////////////////////

Generated on Thu Jan 24 21:58:00 2008 for OPAL by  doxygen 1.5.1