00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #ifndef _DTMF_H
00042 #define _DTMF_H
00043
00044 #ifdef P_USE_PRAGMA
00045 #pragma interface
00046 #endif
00047
00048 #include <ptlib.h>
00049
00050 class PDTMFDecoder : public PObject
00051 {
00052 PCLASSINFO(PDTMFDecoder, PObject)
00053
00054 public:
00055 PDTMFDecoder();
00056 PString Decode(const void *buf, PINDEX bytes);
00057
00058 protected:
00059
00060 char key[256];
00061
00062
00063 int p1[8];
00064
00065
00066 int h[8], k[8], y[8];
00067 int nn, so, ia;
00068 };
00069
00075 class PDTMFEncoder : public PBYTEArray
00076 {
00077 PCLASSINFO(PDTMFEncoder, PBYTEArray)
00078
00079 public:
00080 enum { DefaultToneLen = 100 };
00081
00085 inline PDTMFEncoder(
00086 const char * dtmf = NULL,
00087 unsigned len = DefaultToneLen
00088 )
00089 { if (dtmf != NULL) AddTone(dtmf, len); }
00090
00091
00095 void AddTone(
00096 char ch,
00097 unsigned len = DefaultToneLen
00098 );
00099
00103 void AddTone(
00104 const PString & str,
00105 unsigned len = DefaultToneLen
00106 );
00107
00112 void AddTone(
00113 double freq1,
00114 double freq2 = 0,
00115 unsigned len = DefaultToneLen
00116 );
00117
00122 void GenerateRingBackTone()
00123 {
00124 AddTone(440, 480, 2000);
00125 AddTone(0, 0, 4000);
00126 }
00127
00132 void GenerateDialTone()
00133 {
00134 AddTone(350, 440, 1000);
00135 }
00136
00141 void GenerateBusyTone()
00142 {
00143 AddTone(480, 620, 500);
00144 AddTone(0, 0, 500);
00145 }
00146
00154 char DtmfChar(
00155 PINDEX i
00156 );
00157
00158 protected:
00159 static PMutex & GetMutex();
00160 static BOOL sineTabInit;
00161 static void MakeSineTable();
00162 static inline double sine(unsigned int ptr)
00163 { return sinetab[ptr >> (32-11)]; }
00164 static double sinetab[1 << 11];
00165 };
00166
00167 #endif