annotate miscutil/fc-tch2fr.c @ 465:003e48f8ebe1

rvinterf/etmsync/fsnew.c: cast 0 to (char *) for execl sentinel I generally don't use NULL and use plain 0 instead, based on a "NULL considered harmful" discussion on the classiccmp mailing list many aeons ago (I couldn't find it, and I reason that it must have been 2005 or earlier), but a recent complaint by a packager sent me searching, and I found this: https://ewontfix.com/11/ While I don't give a @#$% about "modern" systems and code-nazi tools, I realized that passing a plain 0 as a pointer sentinel in execl is wrong because it will break on systems where pointers are longer than the plain int type. Again, I don't give a @#$% about the abomination of x86_64 and the like, but if anyone ever manages to port my code to something like a PDP-11 (16-bit int, 32-bit long and pointers), then passing a plain 0 as a function argument where a pointer is expected most definitely won't work: if the most natural stack slot and SP alignment unit is 16 bits, fitting an int, with longs and pointers taking up two such slots, then the call stack will be totally wrong with a plain 0 passed for a pointer. Casting the 0 to (char *) ought to be the most kosher solution for the most retro systems possible.
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 11 Feb 2019 00:00:19 +0000
parents d57f68d0568d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * Our experimental Calypso firmware enables us to capture the output of
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * the GSM 05.03 channel decoder in the DSP, i.e., the bits leaving the
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * channel decoder and going into the speech decoder. Our fc-shell utility
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * allows saving this capture to a file; the captured booty includes not only
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 * the expected 260 bits per frame, but also some DSP status words which are
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 * not fully understood, but which are believed to contain indications as to
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 * whether the decoded speech frame is good or bad.
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 *
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 * My first naive thought was to save the captured speech frames in libgsm
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 * format so I could then play them with the 'play' command (SoX package)
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 * under Linux, but the problem with this naive approach is that the bad frames
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 * indication is lost, and some of the saved "speech" frames will contain
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 * utter garbage, resulting in very unkind-on-ears noises if that file is
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 * then played. I don't know what the proper solution should be; I don't know
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 * what the commercial cellphone implementations of the GSM 06.10 speech decoder
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 * (buried in black box DSPs) do when they get bad frames from the channel
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 * decoder.
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 *
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 * The present utility reproduces the naive behaviour of my previous
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 * implementation of fc-shell's tch record command: it takes hex files written
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 * by the current implementation of tch record in fc-shell, DISREGARDS the
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 * DSP status words, and blindly converts each 260-bit frame (good or bad)
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 * into libgsm format.
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 */
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 #include <sys/types.h>
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 #include <ctype.h>
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 #include <stdio.h>
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 #include <stdlib.h>
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 static
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 decode_hex_digit(ch)
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 {
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 if (isdigit(ch))
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 return(ch - '0');
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 else if (isupper(ch))
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 return(ch - 'A' + 10);
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 else
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 return(ch - 'a' + 10);
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 }
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 main(argc, argv)
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 char **argv;
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 {
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 FILE *inf, *outf;
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 char linebuf[128];
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 int lineno;
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 char *cp;
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 int i, j;
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 u_char tidsp_bytes[33], libgsm_bytes[33];
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 if (argc != 3) {
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 fprintf(stderr, "usage: %s infile outfile\n", argv[0]);
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 exit(1);
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 }
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 inf = fopen(argv[1], "r");
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 if (!inf) {
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 perror(argv[1]);
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 exit(1);
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 }
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 outf = fopen(argv[2], "w");
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 if (!outf) {
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 perror(argv[2]);
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 exit(1);
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 }
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 for (lineno = 1; fgets(linebuf, sizeof linebuf, inf); lineno++) {
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 /* skip DSP status words */
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 cp = linebuf;
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 for (i = 0; i < 3; i++) {
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 for (j = 0; j < 4; j++) {
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 if (!isxdigit(*cp++)) {
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 invalid: fprintf(stderr,
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 "error: %s is not in the expected format\n",
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 argv[1]);
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 exit(1);
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 }
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 }
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 if (*cp++ != ' ')
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 goto invalid;
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 }
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 /* read the frame bits */
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 for (i = 0; i < 33; i++) {
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 if (!isxdigit(cp[0]) || !isxdigit(cp[1]))
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 goto invalid;
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 tidsp_bytes[i] = (decode_hex_digit(cp[0]) << 4) |
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 decode_hex_digit(cp[1]);
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 cp += 2;
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 }
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 gsm0610_tidsp_to_libgsm(tidsp_bytes, libgsm_bytes);
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 fwrite(libgsm_bytes, 1, 33, outf);
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 }
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 exit(0);
d57f68d0568d fc-tch2fr utility written, added under miscutil
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 }