Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]

Diff markup

Differences between /linux/drivers/isdn/hardware/eicon/capidtmf.c (Version 2.6.25.8) and /linux/drivers/isdn/hardware/eicon/capidtmf.c (Version 2.6.11.8)


  1                                                     1 
  2 /*                                                
  3  *                                                
  4   Copyright (c) Eicon Networks, 2002.             
  5  *                                                
  6   This source file is supplied for the use wit    
  7   Eicon Networks range of DIVA Server Adapters    
  8  *                                                
  9   Eicon File Revision :    2.1                    
 10  *                                                
 11   This program is free software; you can redis    
 12   it under the terms of the GNU General Public    
 13   the Free Software Foundation; either version    
 14   any later version.                              
 15  *                                                
 16   This program is distributed in the hope that    
 17   but WITHOUT ANY WARRANTY OF ANY KIND WHATSOE    
 18   implied warranty of MERCHANTABILITY or FITNE    
 19   See the GNU General Public License for more     
 20  *                                                
 21   You should have received a copy of the GNU G    
 22   along with this program; if not, write to th    
 23   Foundation, Inc., 675 Mass Ave, Cambridge, M    
 24  *                                                
 25  */                                               
 26                                                   
 27 #include "platform.h"                             
 28                                                   
 29                                                   
 30                                                   
 31                                                   
 32                                                   
 33                                                   
 34                                                   
 35                                                   
 36                                                   
 37 #include "capidtmf.h"                             
 38                                                   
 39 /* #define TRACE_ */                              
 40                                                   
 41 #define FILE_ "CAPIDTMF.C"                        
 42                                                   
 43 /*--------------------------------------------    
 44                                                   
 45                                                   
 46 #define trace(a)                                  
 47                                                   
 48                                                   
 49                                                   
 50 /*--------------------------------------------    
 51                                                   
 52 static short capidtmf_expand_table_alaw[0x0100    
 53 {                                                 
 54    -5504,   5504,   -344,    344, -22016,  220    
 55    -2752,   2752,    -88,     88, -11008,  110    
 56    -7552,   7552,   -472,    472, -30208,  302    
 57    -3776,   3776,   -216,    216, -15104,  151    
 58    -4480,   4480,   -280,    280, -17920,  179    
 59    -2240,   2240,    -24,     24,  -8960,   89    
 60    -6528,   6528,   -408,    408, -26112,  261    
 61    -3264,   3264,   -152,    152, -13056,  130    
 62    -6016,   6016,   -376,    376, -24064,  240    
 63    -3008,   3008,   -120,    120, -12032,  120    
 64    -8064,   8064,   -504,    504, -32256,  322    
 65    -4032,   4032,   -248,    248, -16128,  161    
 66    -4992,   4992,   -312,    312, -19968,  199    
 67    -2496,   2496,    -56,     56,  -9984,   99    
 68    -7040,   7040,   -440,    440, -28160,  281    
 69    -3520,   3520,   -184,    184, -14080,  140    
 70    -5248,   5248,   -328,    328, -20992,  209    
 71    -2624,   2624,    -72,     72, -10496,  104    
 72    -7296,   7296,   -456,    456, -29184,  291    
 73    -3648,   3648,   -200,    200, -14592,  145    
 74    -4224,   4224,   -264,    264, -16896,  168    
 75    -2112,   2112,     -8,      8,  -8448,   84    
 76    -6272,   6272,   -392,    392, -25088,  250    
 77    -3136,   3136,   -136,    136, -12544,  125    
 78    -5760,   5760,   -360,    360, -23040,  230    
 79    -2880,   2880,   -104,    104, -11520,  115    
 80    -7808,   7808,   -488,    488, -31232,  312    
 81    -3904,   3904,   -232,    232, -15616,  156    
 82    -4736,   4736,   -296,    296, -18944,  189    
 83    -2368,   2368,    -40,     40,  -9472,   94    
 84    -6784,   6784,   -424,    424, -27136,  271    
 85    -3392,   3392,   -168,    168, -13568,  135    
 86 };                                                
 87                                                   
 88 static short capidtmf_expand_table_ulaw[0x0100    
 89 {                                                 
 90   -32124,  32124,  -1884,   1884,  -7932,   79    
 91   -15996,  15996,   -876,    876,  -3900,   39    
 92   -23932,  23932,  -1372,   1372,  -5884,   58    
 93   -11900,  11900,   -620,    620,  -2876,   28    
 94   -28028,  28028,  -1628,   1628,  -6908,   69    
 95   -13948,  13948,   -748,    748,  -3388,   33    
 96   -19836,  19836,  -1116,   1116,  -4860,   48    
 97    -9852,   9852,   -492,    492,  -2364,   23    
 98   -30076,  30076,  -1756,   1756,  -7420,   74    
 99   -14972,  14972,   -812,    812,  -3644,   36    
100   -21884,  21884,  -1244,   1244,  -5372,   53    
101   -10876,  10876,   -556,    556,  -2620,   26    
102   -25980,  25980,  -1500,   1500,  -6396,   63    
103   -12924,  12924,   -684,    684,  -3132,   31    
104   -17788,  17788,   -988,    988,  -4348,   43    
105    -8828,   8828,   -428,    428,  -2108,   21    
106   -31100,  31100,  -1820,   1820,  -7676,   76    
107   -15484,  15484,   -844,    844,  -3772,   37    
108   -22908,  22908,  -1308,   1308,  -5628,   56    
109   -11388,  11388,   -588,    588,  -2748,   27    
110   -27004,  27004,  -1564,   1564,  -6652,   66    
111   -13436,  13436,   -716,    716,  -3260,   32    
112   -18812,  18812,  -1052,   1052,  -4604,   46    
113    -9340,   9340,   -460,    460,  -2236,   22    
114   -29052,  29052,  -1692,   1692,  -7164,   71    
115   -14460,  14460,   -780,    780,  -3516,   35    
116   -20860,  20860,  -1180,   1180,  -5116,   51    
117   -10364,  10364,   -524,    524,  -2492,   24    
118   -24956,  24956,  -1436,   1436,  -6140,   61    
119   -12412,  12412,   -652,    652,  -3004,   30    
120   -16764,  16764,   -924,    924,  -4092,   40    
121    -8316,   8316,   -396,    396,  -1980,   19    
122 };                                                
123                                                   
124                                                   
125 /*--------------------------------------------    
126                                                   
127 static short capidtmf_recv_window_function[CAP    
128 {                                                 
129     -500L,   -999L,  -1499L,  -1998L,  -2496L,    
130    -4483L,  -4978L,  -5471L,  -5963L,  -6454L,    
131    -8401L,  -8883L,  -9363L,  -9840L, -10316L,    
132   -12193L, -12655L, -13115L, -13571L, -14024L,    
133   -15804L, -16240L, -16672L, -17100L, -17524L,    
134   -19180L, -19583L, -19981L, -20375L, -20764L,    
135   -22270L, -22634L, -22993L, -23346L, -23694L,    
136   -25030L, -25350L, -25664L, -25971L, -26273L,    
137   -27418L, -27688L, -27952L, -28210L, -28461L,    
138   -29398L, -29615L, -29826L, -30029L, -30226L,    
139   -30941L, -31102L, -31256L, -31402L, -31541L,    
140   -32024L, -32126L, -32221L, -32308L, -32388L,    
141   -32631L, -32673L, -32707L, -32734L, -32753L,    
142   -32753L, -32734L, -32707L, -32673L, -32631L,    
143   -32388L, -32308L, -32221L, -32126L, -32024L,    
144   -31541L, -31402L, -31256L, -31102L, -30941L,    
145   -30226L, -30029L, -29826L, -29615L, -29398L,    
146   -28461L, -28210L, -27952L, -27688L, -27418L,    
147   -26273L, -25971L, -25664L, -25350L, -25030L,    
148   -23694L, -23346L, -22993L, -22634L, -22270L,    
149   -20764L, -20375L, -19981L, -19583L, -19180L,    
150   -17524L, -17100L, -16672L, -16240L, -15804L,    
151   -14024L, -13571L, -13115L, -12655L, -12193L,    
152   -10316L,  -9840L,  -9363L,  -8883L,  -8401L,    
153    -6454L,  -5963L,  -5471L,  -4978L,  -4483L,    
154    -2496L,  -1998L,  -1499L,   -999L,   -500L,    
155 };                                                
156                                                   
157 static byte capidtmf_leading_zeroes_table[0x10    
158 {                                                 
159   8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4,    
160   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,    
161   2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,    
162   2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,    
163   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,    
164   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,    
165   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,    
166   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,    
167   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    
168   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    
169   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    
170   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    
171   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    
172   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    
173   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    
174   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,    
175 };                                                
176                                                   
177 #define capidtmf_byte_leading_zeroes(b)  (capi    
178 #define capidtmf_word_leading_zeroes(w)  (((w)    
179 #define capidtmf_dword_leading_zeroes(d)  (((d    
180                                                   
181                                                   
182 /*--------------------------------------------    
183                                                   
184                                                   
185 static void capidtmf_goertzel_loop (long *buff    
186 {                                                 
187   int i, j;                                       
188   long c, d, q0, q1, q2;                          
189                                                   
190   for (i = 0; i < CAPIDTMF_RECV_TOTAL_FREQUENC    
191   {                                               
192     q1 = buffer[i];                               
193     q2 = buffer[i + CAPIDTMF_RECV_TOTAL_FREQUE    
194     d = coeffs[i] >> 1;                           
195     c = d << 1;                                   
196     if (c >= 0)                                   
197     {                                             
198       for (j = 0; j < count; j++)                 
199       {                                           
200         q0 = sample[j] - q2 + (c * (q1 >> 16))    
201         q2 = q1;                                  
202         q1 = q0;                                  
203       }                                           
204     }                                             
205     else                                          
206     {                                             
207       c = -c;                                     
208       d = -d;                                     
209       for (j = 0; j < count; j++)                 
210       {                                           
211         q0 = sample[j] - q2 - ((c * (q1 >> 16)    
212         q2 = q1;                                  
213         q1 = q0;                                  
214       }                                           
215     }                                             
216     buffer[i] = q1;                               
217     buffer[i + CAPIDTMF_RECV_TOTAL_FREQUENCY_C    
218   }                                               
219   q1 = buffer[i];                                 
220   q2 = buffer[i + CAPIDTMF_RECV_TOTAL_FREQUENC    
221   c = (coeffs[i] >> 1) << 1;                      
222   if (c >= 0)                                     
223   {                                               
224     for (j = 0; j < count; j++)                   
225     {                                             
226       q0 = sample[j] - q2 + (c * (q1 >> 16)) +    
227       q2 = q1;                                    
228       q1 = q0;                                    
229       c -= CAPIDTMF_RECV_FUNDAMENTAL_DECREMENT    
230     }                                             
231   }                                               
232   else                                            
233   {                                               
234     c = -c;                                       
235     for (j = 0; j < count; j++)                   
236     {                                             
237       q0 = sample[j] - q2 - ((c * (q1 >> 16))     
238       q2 = q1;                                    
239       q1 = q0;                                    
240       c += CAPIDTMF_RECV_FUNDAMENTAL_DECREMENT    
241     }                                             
242   }                                               
243   coeffs[i] = c;                                  
244   buffer[i] = q1;                                 
245   buffer[i + CAPIDTMF_RECV_TOTAL_FREQUENCY_COU    
246 }                                                 
247                                                   
248                                                   
249 static void capidtmf_goertzel_result (long *bu    
250 {                                                 
251   int i;                                          
252   long d, e, q1, q2, lo, mid, hi;                 
253   dword k;                                        
254                                                   
255   for (i = 0; i < CAPIDTMF_RECV_TOTAL_FREQUENC    
256   {                                               
257     q1 = buffer[i];                               
258     q2 = buffer[i + CAPIDTMF_RECV_TOTAL_FREQUE    
259     d = coeffs[i] >> 1;                           
260     if (d >= 0)                                   
261       d = ((d << 1) * (-q1 >> 16)) + (((dword)    
262     else                                          
263       d = ((-d << 1) * (-q1 >> 16)) + (((dword    
264     e = (q2 >= 0) ? q2 : -q2;                     
265     if (d >= 0)                                   
266     {                                             
267       k = ((dword)(d & 0xffff)) * ((dword)(e &    
268       lo = k & 0xffff;                            
269       mid = k >> 16;                              
270       k = ((dword)(d >> 16)) * ((dword)(e & 0x    
271       mid += k & 0xffff;                          
272       hi = k >> 16;                               
273       k = ((dword)(d & 0xffff)) * ((dword)(e >    
274       mid += k & 0xffff;                          
275       hi += k >> 16;                              
276       hi += ((dword)(d >> 16)) * ((dword)(e >>    
277     }                                             
278     else                                          
279     {                                             
280       d = -d;                                     
281       k = ((dword)(d & 0xffff)) * ((dword)(e &    
282       lo = -((long)(k & 0xffff));                 
283       mid = -((long)(k >> 16));                   
284       k = ((dword)(d >> 16)) * ((dword)(e & 0x    
285       mid -= k & 0xffff;                          
286       hi = -((long)(k >> 16));                    
287       k = ((dword)(d & 0xffff)) * ((dword)(e >    
288       mid -= k & 0xffff;                          
289       hi -= k >> 16;                              
290       hi -= ((dword)(d >> 16)) * ((dword)(e >>    
291     }                                             
292     if (q2 < 0)                                   
293     {                                             
294       lo = -lo;                                   
295       mid = -mid;                                 
296       hi = -hi;                                   
297     }                                             
298     d = (q1 >= 0) ? q1 : -q1;                     
299     k = ((dword)(d & 0xffff)) * ((dword)(d & 0    
300     lo += k & 0xffff;                             
301     mid += k >> 16;                               
302     k = ((dword)(d >> 16)) * ((dword)(d & 0xff    
303     mid += (k & 0xffff) << 1;                     
304     hi += (k >> 16) << 1;                         
305     hi += ((dword)(d >> 16)) * ((dword)(d >> 1    
306     d = (q2 >= 0) ? q2 : -q2;                     
307     k = ((dword)(d & 0xffff)) * ((dword)(d & 0    
308     lo += k & 0xffff;                             
309     mid += k >> 16;                               
310     k = ((dword)(d >> 16)) * ((dword)(d & 0xff    
311     mid += (k & 0xffff) << 1;                     
312     hi += (k >> 16) << 1;                         
313     hi += ((dword)(d >> 16)) * ((dword)(d >> 1    
314     mid += lo >> 16;                              
315     hi += mid >> 16;                              
316     buffer[i] = (lo & 0xffff) | (mid << 16);      
317     buffer[i + CAPIDTMF_RECV_TOTAL_FREQUENCY_C    
318   }                                               
319 }                                                 
320                                                   
321                                                   
322 /*--------------------------------------------    
323                                                   
324 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_697         
325 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_770         
326 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_852         
327 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_941         
328 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1209        
329 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1336        
330 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1477        
331 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1633        
332 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_635         
333 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1010        
334 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1140        
335 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1272        
336 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1405        
337 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1555        
338 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1715        
339 #define CAPIDTMF_RECV_GUARD_SNR_INDEX_1875        
340                                                   
341 #define CAPIDTMF_RECV_GUARD_SNR_DONTCARE          
342 #define CAPIDTMF_RECV_NO_DIGIT                    
343 #define CAPIDTMF_RECV_TIME_GRANULARITY            
344                                                   
345 #define CAPIDTMF_RECV_INDICATION_DIGIT            
346                                                   
347 static long capidtmf_recv_goertzel_coef_table[    
348 {                                                 
349   0xda97L * 2,  /* 697 Hz (Low group 697 Hz) *    
350   0xd299L * 2,  /* 770 Hz (Low group 770 Hz) *    
351   0xc8cbL * 2,  /* 852 Hz (Low group 852 Hz) *    
352   0xbd36L * 2,  /* 941 Hz (Low group 941 Hz) *    
353   0x9501L * 2,  /* 1209 Hz (High group 1209 Hz    
354   0x7f89L * 2,  /* 1336 Hz (High group 1336 Hz    
355   0x6639L * 2,  /* 1477 Hz (High group 1477 Hz    
356   0x48c6L * 2,  /* 1633 Hz (High group 1633 Hz    
357   0xe14cL * 2,  /* 630 Hz (Lower guard of low     
358   0xb2e0L * 2,  /* 1015 Hz (Upper guard of low    
359   0xa1a0L * 2,  /* 1130 Hz (Lower guard of hig    
360   0x8a87L * 2,  /* 1272 Hz (Guard between 1209    
361   0x7353L * 2,  /* 1405 Hz (2nd harmonics of 6    
362   0x583bL * 2,  /* 1552 Hz (2nd harmonics of 7    
363   0x37d8L * 2,  /* 1720 Hz (2nd harmonics of 8    
364   0x0000L * 2   /* 100-630 Hz (fundamentals) *    
365 };                                                
366                                                   
367                                                   
368 static word capidtmf_recv_guard_snr_low_table[    
369 {                                                 
370   14,                                    /* Lo    
371   14,                                    /* Lo    
372   16,                                    /* Lo    
373   16,                                    /* Lo    
374   CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Lo    
375   CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Lo    
376   CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Lo    
377   CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Lo    
378   14,                                    /* Lo    
379   16,                                    /* Lo    
380   CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Lo    
381   CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Lo    
382   DSPDTMF_RX_HARMONICS_SEL_DEFAULT - 8,  /* Lo    
383   DSPDTMF_RX_HARMONICS_SEL_DEFAULT - 4,  /* Lo    
384   DSPDTMF_RX_HARMONICS_SEL_DEFAULT - 4,  /* Lo    
385   12                                     /* Lo    
386 };                                                
387                                                   
388                                                   
389 static word capidtmf_recv_guard_snr_high_table    
390 {                                                 
391   CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Hi    
392   CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Hi    
393   CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Hi    
394   CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Hi    
395   20,                                    /* Hi    
396   20,                                    /* Hi    
397   20,                                    /* Hi    
398   20,                                    /* Hi    
399   CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Hi    
400   CAPIDTMF_RECV_GUARD_SNR_DONTCARE,      /* Hi    
401   16,                                    /* Hi    
402   4,                                     /* Hi    
403   6,                                     /* Hi    
404   8,                                     /* Hi    
405   16,                                    /* Hi    
406   12                                     /* Hi    
407 };                                                
408                                                   
409                                                   
410 /*--------------------------------------------    
411                                                   
412 static void capidtmf_recv_init (t_capidtmf_sta    
413 {                                                 
414   p_state->recv.min_gap_duration = 1;             
415   p_state->recv.min_digit_duration = 1;           
416                                                   
417   p_state->recv.cycle_counter = 0;                
418   p_state->recv.current_digit_on_time = 0;        
419   p_state->recv.current_digit_off_time = 0;       
420   p_state->recv.current_digit_value = CAPIDTMF    
421                                                   
422   p_state->recv.digit_write_pos = 0;              
423   p_state->recv.digit_read_pos = 0;               
424   p_state->recv.indication_state = 0;             
425   p_state->recv.indication_state_ack = 0;         
426   p_state->recv.state = CAPIDTMF_RECV_STATE_ID    
427 }                                                 
428                                                   
429                                                   
430 void capidtmf_recv_enable (t_capidtmf_state       
431 {                                                 
432   p_state->recv.indication_state_ack &= CAPIDT    
433   p_state->recv.min_digit_duration = (word)(((    
434     ((dword)(CAPIDTMF_RECV_TIME_GRANULARITY /     
435   if (p_state->recv.min_digit_duration <= 1)      
436     p_state->recv.min_digit_duration = 1;         
437   else                                            
438     (p_state->recv.min_digit_duration)--;         
439   p_state->recv.min_gap_duration =                
440     (word)((((dword) min_gap_duration) * 8) /     
441   if (p_state->recv.min_gap_duration <= 1)        
442     p_state->recv.min_gap_duration = 1;           
443   else                                            
444     (p_state->recv.min_gap_duration)--;           
445   p_state->recv.state |= CAPIDTMF_RECV_STATE_D    
446 }                                                 
447                                                   
448                                                   
449 void capidtmf_recv_disable (t_capidtmf_state      
450 {                                                 
451   p_state->recv.state &= ~CAPIDTMF_RECV_STATE_    
452   if (p_state->recv.state == CAPIDTMF_RECV_STA    
453     capidtmf_recv_init (p_state);                 
454   else                                            
455   {                                               
456     p_state->recv.cycle_counter = 0;              
457     p_state->recv.current_digit_on_time = 0;      
458     p_state->recv.current_digit_off_time = 0;     
459     p_state->recv.current_digit_value = CAPIDT    
460   }                                               
461 }                                                 
462                                                   
463                                                   
464 word capidtmf_recv_indication (t_capidtmf_stat    
465 {                                                 
466   word i, j, k, flags;                            
467                                                   
468   flags = p_state->recv.indication_state ^ p_s    
469   p_state->recv.indication_state_ack ^= flags     
470   if (p_state->recv.digit_write_pos != p_state    
471   {                                               
472     i = 0;                                        
473     k = p_state->recv.digit_write_pos;            
474     j = p_state->recv.digit_read_pos;             
475     do                                            
476     {                                             
477       buffer[i++] = p_state->recv.digit_buffer    
478       j = (j == CAPIDTMF_RECV_DIGIT_BUFFER_SIZ    
479     } while (j != k);                             
480     p_state->recv.digit_read_pos = k;             
481     return (i);                                   
482   }                                               
483   p_state->recv.indication_state_ack ^= flags;    
484   return (0);                                     
485 }                                                 
486                                                   
487                                                   
488 #define CAPIDTMF_RECV_WINDOWED_SAMPLES  32        
489                                                   
490 void capidtmf_recv_block (t_capidtmf_state   *    
491 {                                                 
492   byte result_digit;                              
493   word sample_number, cycle_counter, n, i;        
494   word low_peak, high_peak;                       
495   dword lo, hi;                                   
496   byte   *p;                                      
497   short *q;                                       
498   byte goertzel_result_buffer[CAPIDTMF_RECV_TO    
499     short windowed_sample_buffer[CAPIDTMF_RECV    
500                                                   
501                                                   
502   if (p_state->recv.state & CAPIDTMF_RECV_STAT    
503   {                                               
504     cycle_counter = p_state->recv.cycle_counte    
505     sample_number = 0;                            
506     while (sample_number < length)                
507     {                                             
508       if (cycle_counter < CAPIDTMF_RECV_ACCUMU    
509       {                                           
510         if (cycle_counter == 0)                   
511         {                                         
512           for (i = 0; i < CAPIDTMF_RECV_TOTAL_    
513           {                                       
514             p_state->recv.goertzel_buffer[0][i    
515             p_state->recv.goertzel_buffer[1][i    
516           }                                       
517         }                                         
518         n = CAPIDTMF_RECV_ACCUMULATE_CYCLES -     
519         if (n > length - sample_number)           
520           n = length - sample_number;             
521         if (n > CAPIDTMF_RECV_WINDOWED_SAMPLES    
522           n = CAPIDTMF_RECV_WINDOWED_SAMPLES;     
523         p = buffer + sample_number;               
524         q = capidtmf_recv_window_function + cy    
525         if (p_state->ulaw)                        
526         {                                         
527           for (i = 0; i < n; i++)                 
528           {                                       
529             windowed_sample_buffer[i] =           
530               (short)((capidtmf_expand_table_u    
531           }                                       
532         }                                         
533         else                                      
534         {                                         
535           for (i = 0; i < n; i++)                 
536           {                                       
537             windowed_sample_buffer[i] =           
538               (short)((capidtmf_expand_table_a    
539           }                                       
540         }                                         
541         capidtmf_recv_goertzel_coef_table[CAPI    
542         capidtmf_goertzel_loop (p_state->recv.    
543           capidtmf_recv_goertzel_coef_table, w    
544         cycle_counter += n;                       
545         sample_number += n;                       
546       }                                           
547       else                                        
548       {                                           
549         capidtmf_goertzel_result (p_state->rec    
550           capidtmf_recv_goertzel_coef_table);     
551         for (i = 0; i < CAPIDTMF_RECV_TOTAL_FR    
552         {                                         
553           lo = (dword)(p_state->recv.goertzel_    
554           hi = (dword)(p_state->recv.goertzel_    
555           if (hi != 0)                            
556           {                                       
557             n = capidtmf_dword_leading_zeroes     
558             hi = (hi << n) | (lo >> (32 - n));    
559           }                                       
560           else                                    
561           {                                       
562             n = capidtmf_dword_leading_zeroes     
563             hi = lo << n;                         
564             n += 32;                              
565           }                                       
566           n = 195 - 3 * n;                        
567           if (hi >= 0xcb300000L)                  
568             n += 2;                               
569           else if (hi >= 0xa1450000L)             
570             n++;                                  
571           goertzel_result_buffer[i] = (byte) n    
572         }                                         
573         low_peak = DSPDTMF_RX_SENSITIVITY_LOW_    
574         result_digit = CAPIDTMF_RECV_NO_DIGIT;    
575         for (i = 0; i < CAPIDTMF_LOW_GROUP_FRE    
576         {                                         
577           if (goertzel_result_buffer[i] > low_    
578           {                                       
579             low_peak = goertzel_result_buffer[    
580             result_digit = (byte) i;              
581           }                                       
582         }                                         
583         high_peak = DSPDTMF_RX_SENSITIVITY_HIG    
584         n = CAPIDTMF_RECV_NO_DIGIT;               
585         for (i = CAPIDTMF_LOW_GROUP_FREQUENCIE    
586         {                                         
587           if (goertzel_result_buffer[i] > high    
588           {                                       
589             high_peak = goertzel_result_buffer    
590             n = (i - CAPIDTMF_LOW_GROUP_FREQUE    
591           }                                       
592         }                                         
593         result_digit |= (byte) n;                 
594         if (low_peak + DSPDTMF_RX_HIGH_EXCEEDI    
595           result_digit = CAPIDTMF_RECV_NO_DIGI    
596         if (high_peak + DSPDTMF_RX_LOW_EXCEEDI    
597           result_digit = CAPIDTMF_RECV_NO_DIGI    
598         n = 0;                                    
599         for (i = 0; i < CAPIDTMF_RECV_TOTAL_FR    
600         {                                         
601           if ((((short)(low_peak - goertzel_re    
602            || (((short)(high_peak - goertzel_r    
603           {                                       
604             n++;                                  
605           }                                       
606         }                                         
607         if (n != 2)                               
608           result_digit = CAPIDTMF_RECV_NO_DIGI    
609                                                   
610         if (result_digit == CAPIDTMF_RECV_NO_D    
611         {                                         
612           if (p_state->recv.current_digit_on_t    
613           {                                       
614             if (++(p_state->recv.current_digit    
615             {                                     
616               p_state->recv.current_digit_on_t    
617               p_state->recv.current_digit_off_    
618             }                                     
619           }                                       
620           else                                    
621           {                                       
622             if (p_state->recv.current_digit_of    
623               (p_state->recv.current_digit_off    
624           }                                       
625         }                                         
626         else                                      
627         {                                         
628           if ((p_state->recv.current_digit_on_    
629            && (p_state->recv.current_digit_off    
630           {                                       
631             (p_state->recv.current_digit_off_t    
632           }                                       
633           else                                    
634           {                                       
635             n = p_state->recv.current_digit_of    
636             if ((p_state->recv.current_digit_o    
637              && (result_digit != p_state->recv    
638             {                                     
639               p_state->recv.current_digit_on_t    
640               n = 0;                              
641             }                                     
642             p_state->recv.current_digit_value     
643             p_state->recv.current_digit_off_ti    
644             if (p_state->recv.current_digit_on    
645             {                                     
646               p_state->recv.current_digit_on_t    
647               if (p_state->recv.current_digit_    
648               {                                   
649                 p_state->recv.current_digit_on    
650                 i = (p_state->recv.digit_write    
651                   0 : p_state->recv.digit_writ    
652                 if (i == p_state->recv.digit_r    
653                 {                                 
654                   trace (dprintf ("%s,%d: Rece    
655                     (char   *)(FILE_), __LINE_    
656                 }                                 
657                 else                              
658                 {                                 
659                   p_state->recv.digit_buffer[p    
660                   p_state->recv.digit_write_po    
661                   p_state->recv.indication_sta    
662                     (p_state->recv.indication_    
663                     (~p_state->recv.indication    
664                 }                                 
665               }                                   
666             }                                     
667           }                                       
668         }                                         
669         cycle_counter = 0;                        
670         sample_number++;                          
671       }                                           
672     }                                             
673     p_state->recv.cycle_counter = cycle_counte    
674   }                                               
675 }                                                 
676                                                   
677                                                   
678 void capidtmf_init (t_capidtmf_state   *p_stat    
679 {                                                 
680   p_state->ulaw = ulaw;                           
681   capidtmf_recv_init (p_state);                   
682 }                                                 
683                                                   
684                                                   
685 /*--------------------------------------------    
686                                                   
  This page was automatically generated by the LXR engine.