PTLib  Version 2.12.9
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
dtmf.h
Go to the documentation of this file.
1 /*
2  * ----------------------------------------------------------------------------
3  * "THE BEER-WARE LICENSE" (Revision 42):
4  * <phk@FreeBSD.org> wrote this file. As long as you retain this notice you
5  * can do whatever you want with this stuff. If we meet some day, and you think
6  * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
7  * ----------------------------------------------------------------------------
8  *
9  * Extract DTMF signals from 16 bit PCM audio
10  *
11  * Originally written by Poul-Henning Kamp <phk@freebsd.org>
12  * Made into a C++ class by Roger Hardiman <roger@freebsd.org>, January 2002
13  *
14  * $Revision: 24177 $
15  * $Author: rjongbloed $
16  * $Date: 2010-04-05 21:52:04 +1000 (Mon, 05 Apr 2010) $
17  */
18 
19 #ifndef PTLIB_DTMF_H
20 #define PTLIB_DTMF_H
21 
22 #if P_DTMF
23 
24 #ifdef P_USE_PRAGMA
25 #pragma interface
26 #endif
27 
28 
29 class PDTMFDecoder : public PObject
30 {
32 
33  public:
34  enum {
36  DetectTime = DetectSamples/8 // Milliseconds
37  };
38 
39  PDTMFDecoder();
40  PString Decode(const short * sampleData, PINDEX numSamples, unsigned mult = 1, unsigned div = 1);
41 
42  protected:
43  enum {
44  NumTones = 10
45  };
46 
47  // key lookup table (initialised once)
48  char key[256];
49 
50  // frequency table (initialised once)
51  int p1[NumTones];
52 
53  // variables to be retained on each cycle of the decode function
56 };
57 
58 
102 class PTones : public PShortArray
103 {
105 
106  public:
107  enum {
108  MaxVolume = 100,
112  SineScale = 1000
113  };
114 
118  PTones(
119  unsigned masterVolume = MaxVolume,
120  unsigned sampleRate = DefaultSampleRate
121  );
122 
125  PTones(
126  const PString & descriptor,
127  unsigned masterVolume = MaxVolume,
128  unsigned sampleRate = DefaultSampleRate
129  );
130 
134  bool Generate(
135  const PString & descriptor
136  );
137 
144  bool Generate(
145  char operation,
146  unsigned frequency1,
147  unsigned frequency2,
148  unsigned milliseconds,
149  unsigned volume = MaxVolume
150  );
151 
152  protected:
153  void Construct();
154 
155  bool Juxtapose(unsigned frequency1, unsigned frequency2, unsigned milliseconds, unsigned volume);
156  bool Modulate (unsigned frequency, unsigned modulate, unsigned milliseconds, unsigned volume);
157  bool PureTone (unsigned frequency, unsigned milliseconds, unsigned volume);
158  bool Silence (unsigned milliseconds);
159 
160  unsigned CalcSamples(unsigned milliseconds, unsigned frequency1, unsigned frequency2 = 0);
161 
162  void AddSample(int sample, unsigned volume);
163 
164  unsigned m_sampleRate;
165  unsigned m_maxFrequency;
166  unsigned m_masterVolume;
170 };
171 
172 
177 class PDTMFEncoder : public PTones
178 {
180 
181  public:
182  enum { DefaultToneLen = 100 };
183 
187  PDTMFEncoder(
188  const char * dtmf = NULL,
189  unsigned milliseconds = DefaultToneLen
190  );
191 
195  PDTMFEncoder(
196  char key,
197  unsigned milliseconds = DefaultToneLen
198  );
199 
203  void AddTone(
204  const char * str,
205  unsigned milliseconds = DefaultToneLen
206  );
207 
211  void AddTone(
212  char ch,
213  unsigned milliseconds = DefaultToneLen
214  );
215 
220  void AddTone(
221  double frequency1, // primary frequency
222  double frequency2 = 0, // secondary frequency, or 0 if no secondary frequency
223  unsigned milliseconds = DefaultToneLen // length of DTMF tone in milliseconds
224  );
225 
231  {
232  Generate("440+480:2-4");
233  }
234 
240  {
241  Generate("350+440:1");
242  }
243 
249  {
250  Generate("480+620:0.5-0.5");
251  }
252 
260  char DtmfChar(
261  PINDEX i
262  );
263  // Overiding GetSize() screws up the SetSize()
264 };
265 
266 
267 #endif // P_DTMF
268 
269 #endif // PTLIB_DTMF_H
270 
271 
272 // End Of File ///////////////////////////////////////////////////////////////