diff tchtools/fc-vm2hex.c @ 902:8ddb16a37273

tree org: move TCH and VM utils from miscutil to tchtools
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 28 Dec 2022 07:52:30 +0000
parents miscutil/fc-vm2hex.c@a72bbc3ace09
children 5041bcb8140f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tchtools/fc-vm2hex.c	Wed Dec 28 07:52:30 2022 +0000
@@ -0,0 +1,86 @@
+/*
+ * This utility converts the old-fashioned (non-AMR) voice memo files
+ * read out of FFS into hex strings that can be analyzed by a human
+ * or further fed to fc-tch2fr.
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+char *infname;
+FILE *inf, *outf;
+
+static unsigned
+get_word()
+{
+	u_char b[2];
+	int i, c;
+
+	for (i = 0; i < 2; i++) {
+		c = getc(inf);
+		if (c < 0) {
+			fprintf(stderr, "error: premature EOF in %s\n",
+				infname);
+			exit(1);
+		}
+		b[i] = c;
+	}
+	return((b[1] << 8) | b[0]);
+}
+
+convert_speech_sample()
+{
+	u_char bytes[34];
+	int i, dp;
+	unsigned word;
+
+	dp = 0;
+	for (i = 0; i < 17; i++) {
+		word = get_word();
+		bytes[dp++] = word >> 8;
+		bytes[dp++] = word;
+	}
+	for (i = 0; i < 33; i++)
+		fprintf(outf, "%02X", bytes[i]);
+}
+
+main(argc, argv)
+	char **argv;
+{
+	unsigned first_word;
+
+	if (argc < 2 || argc > 3) {
+		fprintf(stderr, "usage: %s infile [outfile]\n", argv[0]);
+		exit(1);
+	}
+	infname = argv[1];
+	inf = fopen(infname, "r");
+	if (!inf) {
+		perror(infname);
+		exit(1);
+	}
+	if (argc > 2) {
+		outf = fopen(argv[2], "w");
+		if (!outf) {
+			perror(argv[2]);
+			exit(1);
+		}
+	} else
+		outf = stdout;
+
+	for (;;) {
+		first_word = get_word();
+		if (first_word == 0xFBFF)	/* SC_VM_END_MASK */
+			break;
+		fprintf(outf, "%04X", first_word);
+		if (first_word & 0x8000) {	/* B_VM_SPEECH */
+			fprintf(outf, " %04X", get_word());
+			fprintf(outf, " %04X", get_word());
+			putc(' ', outf);
+			convert_speech_sample();
+		}
+		putc('\n', outf);
+	}
+	exit(0);
+}