diff tchtools/fc-efr2tch.c @ 906:94890123a74f

tchtools: new program fc-efr2tch
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 28 Dec 2022 10:05:46 +0000
parents tchtools/fc-fr2tch.c@8ddb16a37273
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tchtools/fc-efr2tch.c	Wed Dec 28 10:05:46 2022 +0000
@@ -0,0 +1,59 @@
+/*
+ * This utility converts a GSM EFR speech recording from Themyscira Wireless
+ * gsmx format into hex strings of TCH UL bits, to be fed to the TCH UL play
+ * buffer in the Calypso DSP by way of a suitable FreeCalypso firmware version
+ * and the special tch play command in fc-shell.
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+main(argc, argv)
+	char **argv;
+{
+	FILE *inf, *outf;
+	u_char efr_bytes[31], tidsp_bytes[33];
+	int cc, i, gotsome = 0;
+
+	if (argc != 3) {
+		fprintf(stderr, "usage: %s infile outfile\n", argv[0]);
+		exit(1);
+	}
+	inf = fopen(argv[1], "r");
+	if (!inf) {
+		perror(argv[1]);
+		exit(1);
+	}
+	outf = fopen(argv[2], "w");
+	if (!outf) {
+		perror(argv[2]);
+		exit(1);
+	}
+	for (;;) {
+		cc = fread(efr_bytes, 1, 31, inf);
+		if (cc < 31)
+			break;
+		if ((efr_bytes[0] & 0xF0) != 0xC0) {
+invalid:		fprintf(stderr,
+				"error: %s is not in EFR codec format\n",
+				argv[1]);
+			exit(1);
+		}
+		efr_std_to_tidsp(efr_bytes, tidsp_bytes);
+		for (i = 0; i < 33; i++)
+			fprintf(outf, "%02X", tidsp_bytes[i]);
+		putc('\n', outf);
+		gotsome = 1;
+	}
+	fclose(outf);
+	if (cc) {
+		if (gotsome)
+			fprintf(stderr,
+			"warning: extra non-31 bytes at the end of %s\n",
+				argv[1]);
+		else
+			goto invalid;
+	}
+	exit(0);
+}