OPAL  Version 3.14.3
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: 31638 $
26  * $Author: rjongbloed $
27  * $Date: 2014-03-31 12:33:26 +1100 (Mon, 31 Mar 2014) $
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_config.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 milliseconds
125  );
126 
127  virtual void OnStartReceive(
128  char tone,
129  unsigned timestamp
130  );
131  virtual void OnEndReceive();
132 
133  void UseRTPSession(bool rx, OpalRTPSession * session);
134 
137  void SetTxMediaFormat(const OpalMediaFormat & mediaFormat);
138  void SetRxMediaFormat(const OpalMediaFormat & mediaFormat);
139 
140  static PINDEX ASCIIToRFC2833(char tone, bool hasNSE);
141  static char RFC2833ToASCII(PINDEX rfc2833, bool hasNSE);
142 
143  protected:
144  bool InternalTransmitFrame();
145  bool AbortTransmit();
146  WORD GetTimestampSince(const PTimeInterval & tick) const;
147 
149  PDECLARE_NOTIFIER(PTimer, OpalRFC2833Proto, ReceiveTimeout);
150  PDECLARE_NOTIFIER(PTimer, OpalRFC2833Proto, TransmitTimeout);
151 
157  PNotifier m_receiveNotifier;
159 
161 
162  enum {
168  } m_transmitState;
172  PTimeInterval m_transmitStartTime;
176 
183 
185  P_REMOVE_VIRTUAL_VOID(OnEndReceive(char, unsigned, unsigned));
186 };
187 
188 
189 #endif // OPAL_CODEC_RFC2833_H
190 
191