aboutsummaryrefslogtreecommitdiffstats
path: root/src/libdtmf/dtmf_decode.h
blob: 7c5780f928f89e295fc2407e8509f47297a35842 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include "../libfm/fm.h"

typedef struct ftmf_meas {
	double		frequency_low;
	double		frequency_high;
	double		amplitude_low;
	double		amplitude_high;
	int		count;
} dtmf_meas_t;

typedef struct dtmf_dec {
	void		*priv;
	void		(*recv_digit)(void *priv, char digit, dtmf_meas_t *meas);
	int		samplerate;		/* samplerate */
	double		freq_margin;		/* +- limit of frequency deviation (percent) valid tone*/
	double		min_amplitude;		/* minimum amplitude relative to 0 dBm */
	double		max_amplitude;		/* maximum amplitude relative to 0 dBm */
	double		forward_twist;		/* how much do higher frequencies are louder than lower frequencies */
	double		reverse_twist;		/* how much do lower frequencies are louder than higher frequencies */
	int		time_detect;
	int		time_meas;
	int		time_pause;
	fm_demod_t	demod_low;		/* demodulator for low frequencies */
	fm_demod_t	demod_high;		/* demodulator for high frequencies */
	iir_filter_t	freq_lp[2];		/* low pass to filter the frequency result */
	char		detected;		/* currently detected DTMF digit or 0 for no detection */
	int		count;			/* counter to count detection or loss (pause) of signal */
	dtmf_meas_t	meas;			/* measurements */
} dtmf_dec_t;

int dtmf_decode_init(dtmf_dec_t *dtmf, void *priv, void (*recv_digit)(void *priv, char digit, dtmf_meas_t *meas), int samplerate, double max_amplitude, double min_amplitude);
void dtmf_decode_exit(dtmf_dec_t *dtmf);
void dtmf_decode(dtmf_dec_t *dtmf, sample_t *samples, int length);
void dtmf_decode_filter(dtmf_dec_t *dtmf, sample_t *samples, int length, sample_t *frequency_low, sample_t *frequency_high, sample_t *amplitude_low, sample_t *amplitude_high);