~ubuntu-branches/ubuntu/trusty/iaxmodem/trusty

« back to all changes in this revision

Viewing changes to lib/spandsp/src/dtmf.c

  • Committer: Bazaar Package Importer
  • Author(s): Julien BLACHE
  • Date: 2007-05-15 09:43:53 UTC
  • mfrom: (1.1.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20070515094353-bpr27hxvt6taxugb
Tags: 0.3.0~dfsg-1
* New upstream release.
  + Now supports V.17 reception; see changelog for details.

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
 * along with this program; if not, write to the Free Software
23
23
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24
24
 *
25
 
 * $Id: dtmf.c,v 1.12 2007/01/03 14:15:35 steveu Exp $
 
25
 * $Id: dtmf.c,v 1.14 2007/02/27 16:52:16 steveu Exp $
26
26
 */
27
27
 
28
28
/*! \file dtmf.h */
47
47
#include "spandsp/telephony.h"
48
48
#include "spandsp/tone_detect.h"
49
49
#include "spandsp/tone_generate.h"
 
50
#include "spandsp/super_tone_rx.h"
50
51
#include "spandsp/dtmf.h"
51
52
 
52
53
#if !defined(M_PI)
56
57
 
57
58
//#define USE_3DNOW
58
59
 
59
 
#define ms_to_samples(t)            (((t)*SAMPLE_RATE)/1000)
60
 
 
61
 
#define DTMF_DURATION               ms_to_samples(70)
62
 
#define DTMF_PAUSE                  ms_to_samples(80)
63
 
#define DTMF_CYCLE                  (DTMF_DURATION + DTMF_PAUSE)
 
60
#define DEFAULT_DTMF_TX_LEVEL       -10
 
61
#define DEFAULT_DTMF_TX_ON_TIME     50
 
62
#define DEFAULT_DTMF_TX_OFF_TIME    55
64
63
 
65
64
#define DTMF_THRESHOLD              8.0e7f
66
65
#define DTMF_NORMAL_TWIST           6.3f    /* 8dB */
168
167
    s[2].v3 = vv[10];
169
168
    s[3].v3 = vv[11];
170
169
}
 
170
/*- End of function --------------------------------------------------------*/
171
171
#endif
172
 
/*- End of function --------------------------------------------------------*/
173
172
 
174
173
int dtmf_rx(dtmf_rx_state_t *s, const int16_t amp[], int samples)
175
174
{
337
336
                {
338
337
                    /* Avoid reporting multiple no digit conditions on flaky hits */
339
338
                    if (s->in_digit  ||  hit)
340
 
                        s->realtime_callback(s->realtime_callback_data, hit);
 
339
                    {
 
340
                        i = (s->in_digit  &&  !hit)  ?  -99  :  rint(log10f(s->energy)*10.0f - 20.08f - 90.30F + DBM0_MAX_POWER);
 
341
                        s->realtime_callback(s->realtime_callback_data, hit, i);
 
342
                    }
341
343
                }
342
344
                else
343
345
                {
369
371
            goertzel_reset(&s->row_out[i]);
370
372
            goertzel_reset(&s->col_out[i]);
371
373
        }
372
 
        s->energy = 0.0;
 
374
        s->energy = 0.0f;
373
375
        s->current_sample = 0;
374
376
    }
375
377
    if (s->current_digits  &&  s->callback)
398
400
/*- End of function --------------------------------------------------------*/
399
401
 
400
402
void dtmf_rx_set_realtime_callback(dtmf_rx_state_t *s,
401
 
                                   void (*callback)(void *user_data, int signal),
 
403
                                   tone_report_func_t callback,
402
404
                                   void *user_data)
403
405
{
404
406
    s->realtime_callback = callback;
413
415
{
414
416
    if (filter_dialtone >= 0)
415
417
    {
416
 
        s->z350_1 = 0.0;
417
 
        s->z350_2 = 0.0;
418
 
        s->z440_1 = 0.0;
419
 
        s->z440_2 = 0.0;
 
418
        s->z350_1 = 0.0f;
 
419
        s->z350_2 = 0.0f;
 
420
        s->z440_1 = 0.0f;
 
421
        s->z440_2 = 0.0f;
420
422
        s->filter_dialtone = filter_dialtone;
421
423
    }
422
424
    if (twist >= 0)
423
 
        s->normal_twist = powf(10.0, twist/10.0);
 
425
        s->normal_twist = powf(10.0f, twist/10.0f);
424
426
    if (reverse_twist >= 0)
425
 
        s->reverse_twist = powf(10.0, reverse_twist/10.0);
 
427
        s->reverse_twist = powf(10.0f, reverse_twist/10.0f);
426
428
}
427
429
/*- End of function --------------------------------------------------------*/
428
430
 
429
431
dtmf_rx_state_t *dtmf_rx_init(dtmf_rx_state_t *s,
430
 
                              void (*callback)(void *user_data, const char *digits, int len),
 
432
                              dtmf_rx_callback_t callback,
431
433
                              void *user_data)
432
434
{
433
435
    int i;
458
460
        goertzel_init(&s->row_out[i], &dtmf_detect_row[i]);
459
461
        goertzel_init(&s->col_out[i], &dtmf_detect_col[i]);
460
462
    }
461
 
    s->energy = 0.0;
 
463
    s->energy = 0.0f;
462
464
    s->current_sample = 0;
463
465
    s->lost_digits = 0;
464
466
    s->current_digits = 0;
480
482
        {
481
483
            make_tone_gen_descriptor(&dtmf_digit_tones[row*4 + col],
482
484
                                     (int) dtmf_row[row],
483
 
                                     -10,
 
485
                                     DEFAULT_DTMF_TX_LEVEL,
484
486
                                     (int) dtmf_col[col],
485
 
                                     -10,
486
 
                                     50,
487
 
                                     55,
 
487
                                     DEFAULT_DTMF_TX_LEVEL,
 
488
                                     DEFAULT_DTMF_TX_ON_TIME,
 
489
                                     DEFAULT_DTMF_TX_OFF_TIME,
488
490
                                     0,
489
491
                                     0,
490
492
                                     FALSE);