FreeCalypso > hg > freecalypso-tools
diff miscutil/fc-vm2hex.c @ 170:a72bbc3ace09
fc-vm2hex utility written
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 22 Mar 2017 08:55:53 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/miscutil/fc-vm2hex.c Wed Mar 22 08:55:53 2017 +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); +}