diff miscutil/fc-fr2tch.c @ 5:7eaa3307e5df

fc-fr2tch utility written, added under miscutil
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 14 Jun 2016 01:40:14 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/miscutil/fc-fr2tch.c	Tue Jun 14 01:40:14 2016 +0000
@@ -0,0 +1,59 @@
+/*
+ * This utility converts a GSM 06.10 speech recording from the format that is
+ * commonly accepted as standard in the Unix/Linux world (libgsm format) into
+ * hex strings of TCH bits to be fed to the GSM 05.03 channel encoder by way
+ * of a TI Calypso GSM device, a FreeCalypso GSM firmware version with the
+ * TCH rerouting feature, and fc-shell's tch play command.
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+main(argc, argv)
+	char **argv;
+{
+	FILE *inf, *outf;
+	u_char libgsm_bytes[33], 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(libgsm_bytes, 1, 33, inf);
+		if (cc < 33)
+			break;
+		if ((libgsm_bytes[0] & 0xF0) != 0xD0) {
+invalid:		fprintf(stderr, "error: %s is not in libgsm format\n",
+				argv[1]);
+			exit(1);
+		}
+		gsm0610_libgsm_to_tidsp(libgsm_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-33 bytes at the end of %s\n",
+				argv[1]);
+		else
+			goto invalid;
+	}
+	exit(0);
+}