OPAL  Version 3.12.9
rfc2833.h
Go to the documentation of this file.
1 /*
2  * rfc2833.h
3  *
4  * Open Phone Abstraction Library (OPAL)
5  * Formally known as the Open H323 project.
6  *
7  * Copyright (c) 2001 Equivalence Pty. Ltd.
8  *
9  * The contents of this file are subject to the Mozilla Public License
10  * Version 1.0 (the "License"); you may not use this file except in
11  * compliance with the License. You may obtain a copy of the License at
12  * http://www.mozilla.org/MPL/
13  *
14  * Software distributed under the License is distributed on an "AS IS"
15  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
16  * the License for the specific language governing rights and limitations
17  * under the License.
18  *
19  * The Original Code is Open Phone Abstraction Library.
20  *
21  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
22  *
23  * Contributor(s): ______________________________________.
24  *
25  * $Revision: 27199 $
26  * $Author: rjongbloed $
27  * $Date: 2012-03-15 18:19:15 +1100 (Thu, 15 Mar 2012) $
28  */
29 
30 #ifndef OPAL_CODEC_RFC2833_H
31 #define OPAL_CODEC_RFC2833_H
32 
33 #ifdef P_USE_PRAGMA
34 #pragma interface
35 #endif
36 
37 #include <opal/buildopts.h>
38 
39 #include <opal/mediafmt.h>
40 #include <rtp/rtp_session.h>
41 
42 
43 class OpalRTPConnection;
44 
45 
47 
48 class OpalRFC2833EventsMask : public std::vector<bool>
49 {
50  public:
51  enum { NumEvents = 256 };
52  OpalRFC2833EventsMask(bool defaultValue = false);
53  OpalRFC2833EventsMask(const char * defaultValues);
55  friend ostream & operator<<(ostream & strm, const OpalRFC2833EventsMask & mask);
56  friend istream & operator>>(istream & strm, OpalRFC2833EventsMask & mask);
57 };
58 
60 const PCaselessString & OpalRFC288EventsName();
61 
62 
64 
65 class OpalRFC2833Info : public PObject
66 {
67  PCLASSINFO(OpalRFC2833Info, PObject);
68  public:
69  // the following values are mandated by RFC 2833
70  enum NTEEvent {
71  Digit0 = 0,
72  Digit1 = 1,
73  Digit2 = 2,
74  Digit3 = 3,
75  Digit4 = 4,
76  Digit5 = 5,
77  Digit6 = 6,
78  Digit7 = 7,
79  Digit8 = 8,
80  Digit9 = 9,
81  Star = 10,
82  Hash = 11,
83  A = 12,
84  B = 13,
85  C = 14,
86  D = 15,
87  Flash = 16,
88  CED = 32,
89  CNG = 36
90  };
91 
93  char tone,
94  unsigned duration = 0,
95  unsigned timestamp = 0
96  );
97 
98  char GetTone() const { return tone; }
99  unsigned GetDuration() const { return duration; }
100  unsigned GetTimestamp() const { return timestamp; }
101  bool IsToneStart() const { return duration == 0; }
102 
103  protected:
104  char tone;
105  unsigned duration;
106  unsigned timestamp;
107 };
108 
109 
111 
112 class OpalRFC2833Proto : public PObject
113 {
114  PCLASSINFO(OpalRFC2833Proto, PObject);
115  public:
117  const PNotifier & receiveNotifier,
118  const OpalMediaFormat & mediaFormat
119  );
121 
122  virtual bool SendToneAsync(
123  char tone,
124  unsigned duration
125  );
126 
127  virtual void OnStartReceive(
128  char tone,
129  unsigned timestamp
130  );
131  virtual void OnStartReceive(
132  char tone
133  );
134  virtual void OnEndReceive(
135  char tone,
136  unsigned duration,
137  unsigned timestamp
138  );
139 
140  void UseRTPSession(bool rx, OpalRTPSession * session);
141 
144  void SetTxMediaFormat(const OpalMediaFormat & mediaFormat);
145  void SetRxMediaFormat(const OpalMediaFormat & mediaFormat);
146 
147  static PINDEX ASCIIToRFC2833(char tone, bool hasNSE);
148  static char RFC2833ToASCII(PINDEX rfc2833, bool hasNSE);
149 
150  protected:
151  void SendAsyncFrame();
152 
154  PDECLARE_NOTIFIER(PTimer, OpalRFC2833Proto, ReceiveTimeout);
155  PDECLARE_NOTIFIER(PTimer, OpalRFC2833Proto, AsyncTimeout);
156 
162  PNotifier m_receiveNotifier;
164 
165  enum {
169  } m_receiveState;
170 
173  unsigned m_tonesReceived;
176 
177  enum {
183  } m_transmitState;
184 
185  PMutex m_sendMutex;
191  PTimeInterval m_asyncStart;
194 };
195 
196 
197 #endif // OPAL_CODEC_RFC2833_H
198 
199