diff mgw/dtmf_init.c @ 126:815e4c59162e

mgw DTMF: tone definitions and sample array generation
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 01 Oct 2022 17:09:51 -0800
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mgw/dtmf_init.c	Sat Oct 01 17:09:51 2022 -0800
@@ -0,0 +1,54 @@
+/*
+ * 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;
+}