changeset 171:f736f3ce8310

fc-gsm2vm utility written
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 22 Mar 2017 18:21:03 +0000
parents a72bbc3ace09
children c138906889f7
files .hgignore miscutil/Makefile miscutil/fc-gsm2vm.c
diffstat 3 files changed, 72 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Wed Mar 22 08:55:53 2017 +0000
+++ b/.hgignore	Wed Mar 22 18:21:03 2017 +0000
@@ -20,6 +20,7 @@
 ^loadtools/fc-xram$
 
 ^miscutil/fc-fr2tch$
+^miscutil/fc-gsm2vm$
 ^miscutil/fc-rgbconv$
 ^miscutil/fc-serterm$
 ^miscutil/fc-tch2fr$
--- a/miscutil/Makefile	Wed Mar 22 08:55:53 2017 +0000
+++ b/miscutil/Makefile	Wed Mar 22 18:21:03 2017 +0000
@@ -1,18 +1,22 @@
 CC=	gcc
 CFLAGS=	-O2
-PROGS=	fc-fr2tch fc-rgbconv fc-serterm fc-tch2fr fc-vm2hex imei-luhn
+PROGS=	fc-fr2tch fc-gsm2vm fc-rgbconv fc-serterm fc-tch2fr fc-vm2hex imei-luhn
 SCRIPTS=c139explore pirexplore
 INSTBIN=/opt/freecalypso/bin
 
 all:	${PROGS}
 
 FR2TCH_OBJS=	fc-fr2tch.o gsm0610.o
+GSM2VM_OBJS=	fc-gsm2vm.o gsm0610.o
 TCH2FR_OBJS=	fc-tch2fr.o gsm0610.o
 SERTERM_OBJS=	fc-serterm.o openport.o ttypassthru.o
 
 fc-fr2tch:	${FR2TCH_OBJS}
 	${CC} ${CFLAGS} -o $@ ${FR2TCH_OBJS}
 
+fc-gsm2vm:	${GSM2VM_OBJS}
+	${CC} ${CFLAGS} -o $@ ${GSM2VM_OBJS}
+
 fc-rgbconv:	fc-rgbconv.c
 	${CC} ${CFLAGS} -o $@ $@.c
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/miscutil/fc-gsm2vm.c	Wed Mar 22 18:21:03 2017 +0000
@@ -0,0 +1,66 @@
+/*
+ * 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
+ * a voice memo file that can be uploaded into the FFS of a FreeCalypso device
+ * and played with the audio_vm_play_start() API or the AT@VMP command that
+ * invokes the latter.
+ */
+
+#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[34], arm_bytes[34];
+	static u_char header_bytes[6] = {0x00, 0xC4, 0x00, 0x00, 0x00, 0x00};
+	static u_char endmarker[2] = {0xFF, 0xFB};
+	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);
+	}
+	tidsp_bytes[33] = 0;
+	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 < 34; i += 2) {
+			arm_bytes[i] = tidsp_bytes[i+1];
+			arm_bytes[i+1] = tidsp_bytes[i];
+		}
+		fwrite(header_bytes, 1, 6, outf);
+		fwrite(arm_bytes, 1, 34, outf);
+		gotsome = 1;
+	}
+	fwrite(endmarker, 1, 2, outf);
+	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);
+}