diff test-v22/modem_func.c @ 10:3c5734b88c20

sipout-test-v22 put together
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 07 Mar 2024 02:33:49 -0800
parents test-fsk/modem_rx.c@6d832abad660
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-v22/modem_func.c	Thu Mar 07 02:33:49 2024 -0800
@@ -0,0 +1,122 @@
+/*
+ * In this module we implement our interface to SpanDSP V.22 engine.
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <spandsp.h>
+#include "../include/pstn_defs.h"
+
+extern int v22_bitrate;
+
+#define	MAX_TEXT_LINE	80
+
+static v22bis_state_t *modem_state;
+static async_rx_state_t *async_state;
+static u_char rx_line_buf[MAX_TEXT_LINE];
+static unsigned rx_buf_fill;
+
+static void
+safe_print_char(c)
+{
+	if (c >= ' ' && c <= '~') {
+		putchar(c);
+		return;
+	}
+	switch (c) {
+	case '\t':
+		putchar(c);
+		return;
+	case '\n':
+		return;
+	case '\r':
+		putchar('\\');
+		putchar('r');
+		return;
+	case '\b':
+		putchar('\\');
+		putchar('b');
+		return;
+	case '\f':
+		putchar('\\');
+		putchar('f');
+		return;
+	}
+	printf("\\x%02X", c);
+}
+
+static void
+print_rx_line()
+{
+	u_char *dp, *endp;
+	int c;
+
+	fputs("MRx:\t", stdout);
+	dp = rx_line_buf;
+	endp = rx_line_buf + rx_buf_fill;
+	while (dp < endp) {
+		c = *dp++;
+		safe_print_char(c);
+	}
+	if (c != '\n')
+		putchar('\\');
+	putchar('\n');
+}
+
+static void
+byte_rx_func(user_data, byte)
+	void *user_data;
+	int byte;
+{
+	if (byte < 0) {
+		printf("Modem state change: %s\n", signal_status_to_str(byte));
+		return;
+	}
+	rx_line_buf[rx_buf_fill++] = byte;
+	if (byte == '\n' || rx_buf_fill >= MAX_TEXT_LINE) {
+		print_rx_line();
+		rx_buf_fill = 0;
+	}
+}
+
+static int
+supply_bit()
+{
+	return 1;
+}
+
+void
+init_modem_func()
+{
+	async_state = async_rx_init(NULL, 8, ASYNC_PARITY_NONE, 1, true,
+				    byte_rx_func, NULL);
+	if (!async_state) {
+		fprintf(stderr, "error: async_rx_init() failed!\n");
+		exit(1);
+	}
+	modem_state = v22bis_init(NULL, v22_bitrate, V22BIS_GUARD_TONE_NONE,
+				  true, supply_bit, NULL, async_rx_put_bit,
+				  async_state);
+	if (!modem_state) {
+		fprintf(stderr, "error: v22bis_init() failed!\n");
+		exit(1);
+	}
+}
+
+void
+process_rx_frame(samples)
+	int16_t *samples;
+{
+	v22bis_rx(modem_state, samples, FRAME_20MS);
+}
+
+void
+fill_tx_frame(samples)
+	int16_t *samples;
+{
+	v22bis_tx(modem_state, samples, FRAME_20MS);
+}