view miscutil/fc-vm2hex.c @ 416:30f6d1c32c6f

doc/Flash-boot-defect article removed (no longer relevant) This article is no longer relevant because the issue in question only affected one (1) defective FCDEV3B board which was not and never will be sold.
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 26 Oct 2018 07:11:08 +0000
parents a72bbc3ace09
children
line wrap: on
line source

/*
 * 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);
}