OPAL Version 3.10.4

- Main Page
- Related Pages
- Namespaces
- Data Structures
- Files

- File List
- Globals

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: 26128 $
26 * $Author: rjongbloed $
27 * $Date: 2011-07-07 21:36:57 -0500 (Thu, 07 Jul 2011) $
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.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);
54 OpalRFC2833EventsMask & operator&=(const OpalRFC2833EventsMask & other);
55 friend ostream & operator<<(ostream & strm, const OpalRFC2833EventsMask & mask);
56 friend istream & operator>>(istream & strm, OpalRFC2833EventsMask & mask);
57 };
58
59 typedef OpalMediaOptionValue<OpalRFC2833EventsMask> OpalRFC288EventsOption;
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
92 OpalRFC2833Info(
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 PCLASSINFO(OpalRFC2833Proto, PObject);
114 public:
115 OpalRFC2833Proto(
116 OpalRTPConnection & conn,
117 const PNotifier & receiveNotifier,
118 const OpalMediaFormat & mediaFormat
119 );
120 ~OpalRFC2833Proto();
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 const RTP_Session::FilterNotifier & GetReceiveHandler() const { return m_receiveHandler; }
141
142 OpalMediaFormat GetTxMediaFormat() const;
143 OpalMediaFormat GetRxMediaFormat() const;
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
153 PDECLARE_RTPFilterNotifier(OpalRFC2833Proto, ReceivedPacket);
154 PDECLARE_NOTIFIER(PTimer, OpalRFC2833Proto, ReceiveTimeout);
155 PDECLARE_NOTIFIER(PTimer, OpalRFC2833Proto, AsyncTimeout);
156
157 OpalRTPConnection & m_connection;
158 OpalMediaFormat m_baseMediaFormat;
159 RTP_DataFrame::PayloadTypes m_txPayloadType;
160 RTP_DataFrame::PayloadTypes m_rxPayloadType;
161 OpalRFC2833EventsMask m_txEvents;
162 OpalRFC2833EventsMask m_rxEvents;
163 PNotifier m_receiveNotifier;
164 RTP_Session::FilterNotifier m_receiveHandler;
165
166 enum {
167 ReceiveIdle,
168 ReceiveActive,
169 ReceiveEnding
170 } m_receiveState;
171
172 BYTE m_receivedTone;
173 unsigned m_tonesReceived;
174 PTimer m_receiveTimer;
175 DWORD m_previousReceivedTimestamp;
176
177 enum {
178 TransmitIdle,
179 TransmitActive,
180 TransmitEnding1,
181 TransmitEnding2,
182 TransmitEnding3,
183 } m_transmitState;
184
185 RTP_Session * m_rtpSession;
186 PTimer m_asyncTransmitTimer;
187 PTimer m_asyncDurationTimer;
188 DWORD m_transmitTimestamp;
189 bool m_rewriteTransmitTimestamp;
190 PTimeInterval m_asyncStart;
191 BYTE m_transmitCode;
192 unsigned m_transmitDuration;
193
194 PMutex m_mutex;
195 };
196
197
198 #endif // OPAL_CODEC_RFC2833_H
199
200