00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef PTLIB_DTMF_H
00020 #define PTLIB_DTMF_H
00021
00022 #if P_DTMF
00023
00024 #ifdef P_USE_PRAGMA
00025 #pragma interface
00026 #endif
00027
00028
00029 class PDTMFDecoder : public PObject
00030 {
00031 PCLASSINFO(PDTMFDecoder, PObject)
00032
00033 public:
00034 enum {
00035 DetectSamples = 520,
00036 DetectTime = DetectSamples/8
00037 };
00038
00039 PDTMFDecoder();
00040 PString Decode(const short * sampleData, PINDEX numSamples, unsigned mult = 1, unsigned div = 1);
00041
00042 protected:
00043 enum {
00044 NumTones = 10
00045 };
00046
00047
00048 char key[256];
00049
00050
00051 int p1[NumTones];
00052
00053
00054 int h[NumTones], k[NumTones], y[NumTones];
00055 int sampleCount, tonesDetected, inputAmplitude;
00056 };
00057
00058
00102 class PTones : public PShortArray
00103 {
00104 PCLASSINFO(PTones, PShortArray)
00105
00106 public:
00107 enum {
00108 MaxVolume = 100,
00109 DefaultSampleRate = 8000,
00110 MinFrequency = 30,
00111 MinModulation = 5,
00112 SineScale = 1000
00113 };
00114
00118 PTones(
00119 unsigned masterVolume = MaxVolume,
00120 unsigned sampleRate = DefaultSampleRate
00121 );
00122
00125 PTones(
00126 const PString & descriptor,
00127 unsigned masterVolume = MaxVolume,
00128 unsigned sampleRate = DefaultSampleRate
00129 );
00130
00134 bool Generate(
00135 const PString & descriptor
00136 );
00137
00144 bool Generate(
00145 char operation,
00146 unsigned frequency1,
00147 unsigned frequency2,
00148 unsigned milliseconds,
00149 unsigned volume = MaxVolume
00150 );
00151
00152 protected:
00153 void Construct();
00154
00155 bool Juxtapose(unsigned frequency1, unsigned frequency2, unsigned milliseconds, unsigned volume);
00156 bool Modulate (unsigned frequency, unsigned modulate, unsigned milliseconds, unsigned volume);
00157 bool PureTone (unsigned frequency, unsigned milliseconds, unsigned volume);
00158 bool Silence (unsigned milliseconds);
00159
00160 unsigned CalcSamples(unsigned milliseconds, unsigned frequency1, unsigned frequency2 = 0);
00161
00162 void AddSample(int sample, unsigned volume);
00163
00164 unsigned m_sampleRate;
00165 unsigned m_maxFrequency;
00166 unsigned m_masterVolume;
00167 char m_lastOperation;
00168 unsigned m_lastFrequency1, m_lastFrequency2;
00169 int m_angle1, m_angle2;
00170 };
00171
00172
00177 class PDTMFEncoder : public PTones
00178 {
00179 PCLASSINFO(PDTMFEncoder, PTones)
00180
00181 public:
00182 enum { DefaultToneLen = 100 };
00183
00187 PDTMFEncoder(
00188 const char * dtmf = NULL,
00189 unsigned milliseconds = DefaultToneLen
00190 );
00191
00195 PDTMFEncoder(
00196 char key,
00197 unsigned milliseconds = DefaultToneLen
00198 );
00199
00203 void AddTone(
00204 const char * str,
00205 unsigned milliseconds = DefaultToneLen
00206 );
00207
00211 void AddTone(
00212 char ch,
00213 unsigned milliseconds = DefaultToneLen
00214 );
00215
00220 void AddTone(
00221 double frequency1,
00222 double frequency2 = 0,
00223 unsigned milliseconds = DefaultToneLen
00224 );
00225
00230 void GenerateRingBackTone()
00231 {
00232 Generate("440+480:2-4");
00233 }
00234
00239 void GenerateDialTone()
00240 {
00241 Generate("350+440:1");
00242 }
00243
00248 void GenerateBusyTone()
00249 {
00250 Generate("480+620:0.5-0.5");
00251 }
00252
00260 char DtmfChar(
00261 PINDEX i
00262 );
00263
00264 };
00265
00266
00267 #endif // P_DTMF
00268
00269 #endif // PTLIB_DTMF_H
00270
00271
00272