view mgw/dtmf_init.c @ 128:5685412bd6aa

sip-in: pass DTMF start & stop to themwi-mgw
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 01 Oct 2022 23:07:01 -0800
parents 815e4c59162e
children
line wrap: on
line source

/*
 * The code in this module executes once upon themwi-mgw startup;
 * it initializes the arrays of linear PCM samples for DTMF output.
 *
 * The amplitudes of the two sine waves comprising each DTMF tone
 * are also defined here.
 */

#include <math.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include "dtmf_defs.h"
#include "int_defs.h"

#define	DTMF_AMPL_LOW_TONE	5000
#define	DTMF_AMPL_HIGH_TONE	6000

extern struct dtmf_desc dtmf_table[];

static void
init_one_dtmf(desc)
	struct dtmf_desc *desc;
{
	float angle_low, angle_high;
	unsigned n;
	int16_t *samp;

	angle_low = 0;
	angle_high = 0;
	samp = desc->samples;
	for (n = 0; n < DTMF_MAX_FRAMES * SAMPLES_PER_FRAME; n++) {
		*samp++ = sinf(angle_low) * DTMF_AMPL_LOW_TONE +
			  sinf(angle_high) * DTMF_AMPL_HIGH_TONE;
		angle_low += desc->freq_low;
		angle_high += desc->freq_high;
	}
}

dtmf_init_sample_arrays()
{
	struct dtmf_desc *desc;

	for (desc = dtmf_table; desc->digit; desc++) {
		desc->samples =
		  malloc(DTMF_MAX_FRAMES * SAMPLES_PER_FRAME * sizeof(int16_t));
		if (!desc->samples) {
			perror("malloc for DTMF samples");
			exit(1);
		}
		init_one_dtmf(desc);
	}
	return 0;
}