FreeCalypso > hg > gsm-codec-lib
annotate hrutil/cod-craft.c @ 581:e2d5cad04cbf
libgsmhr1 RxFE: store CN R0+LPC separately from speech
In the original GSM 06.06 code the ECU for speech mode is entirely
separate from the CN generator, maintaining separate state. (The
main intertie between them is the speech vs CN state variable,
distinguishing between speech and CN BFIs, in addition to the
CN-specific function of distinguishing between initial and update
SIDs.)
In the present RxFE implementation I initially thought that we could
use the same saved_frame buffer for both ECU and CN, overwriting
just the first 4 params (R0 and LPC) when a valid SID comes in.
However, I now realize it was a bad idea: the original code has a
corner case (long sequence of speech-mode BFIs to put the ECU in
state 6, then SID and CN-mode BFIs, then a good speech frame) that
would be broken by that buffer reuse approach. We could eliminate
this corner case by resetting the ECU state when passing through
a CN insertion period, but doing so would needlessly increase
the behavioral diffs between GSM 06.06 and our version.
Solution: use a separate CN-specific buffer for CN R0+LPC parameters,
and match the behavior of GSM 06.06 code in this regard.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 13 Feb 2025 10:02:45 +0000 |
parents | 5452d6cd64b1 |
children |
rev | line source |
---|---|
518
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
570
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
2 * This program facilitates hand-crafting HRv1 encoder output files (*.cod). |
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
3 * It reads a line-based ASCII source and compiles it into binary *.cod format. |
518
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 */ |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 #include <sys/types.h> |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 #include <ctype.h> |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include <stdio.h> |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 #include <stdint.h> |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 #include <stdlib.h> |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 #include <string.h> |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 #include <strings.h> |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 #include "../libgsmhr1/tw_gsmhr.h" |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 #define MAX_FIELDS 18 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 static char *infname, *outfname; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 static FILE *inf, *outf; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 static int lineno; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 static char linebuf[256]; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 static char *fields[MAX_FIELDS]; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 static unsigned nfields; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 |
570
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
25 static int16_t enc_frame[GSMHR_NUM_PARAMS_ENC]; |
518
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 static void |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 set_all_0() |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 { |
570
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
30 bzero(enc_frame, sizeof(int16_t) * GSMHR_NUM_PARAMS); |
518
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 static void |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 set_dhf() |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 { |
570
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
36 bcopy(gsmhr_dhf_params, enc_frame, sizeof(int16_t) * GSMHR_NUM_PARAMS); |
518
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 static void |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 set_sid_cw() |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 { |
575
5452d6cd64b1
gsmhr-cod-craft: use gsmhr_set_sid_cw_params() function
Mychaela Falconia <falcon@freecalypso.org>
parents:
570
diff
changeset
|
42 gsmhr_set_sid_cw_params(enc_frame); |
518
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 static int |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 get_line() |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 char *cp; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 if (!fgets(linebuf, sizeof linebuf, inf)) |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 return 1; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 lineno++; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 if (!index(linebuf, '\n')) { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 fprintf(stderr, "%s line %d: too long or missing newline\n", |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 infname, lineno); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 exit(1); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 nfields = 0; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 for (cp = linebuf; ; ) { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 while (isspace(*cp)) |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 cp++; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 if (*cp == '\0' || *cp == '#') |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 break; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 if (nfields >= MAX_FIELDS) { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 fprintf(stderr, "%s line %d: too many fields\n", |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 infname, lineno); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 exit(1); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 fields[nfields++] = cp; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 while (*cp && !isspace(*cp)) |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 cp++; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 if (*cp) |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 *cp++ = '\0'; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 return 0; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 static int |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 get_line_nonempty() |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 int rc; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 for (;;) { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 rc = get_line(); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 if (rc) |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 return rc; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 if (nfields) |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 return 0; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 static void |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 set_speech_params(start_param, start_arg) |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 unsigned start_param, start_arg; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 unsigned ni, no; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 u_long val; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 char *cp; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 no = start_param; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 for (ni = start_arg; ni < nfields; ni++) { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 if (!isxdigit(fields[ni][0])) { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 inv_number: fprintf(stderr, |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 "%s line %d: field \"%s\" is not a valid number\n", |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 infname, lineno, fields[ni]); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 exit(1); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 val = strtoul(fields[ni], &cp, 16); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 if (*cp) |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 goto inv_number; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 if (val > 0x7FF) { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 fprintf(stderr, |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 "%s line %d: number \"%s\" is too large for a speech parameter\n", |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 infname, lineno, fields[ni]); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 exit(1); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 } |
570
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
117 enc_frame[no++] = val; |
518
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 static void |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 handle_r0() |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 if (nfields != 2) { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 fprintf(stderr, "%s line %d: R0 takes one argument\n", |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 infname, lineno); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 exit(1); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
129 set_speech_params(0, 1); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
130 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
131 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
132 static void |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
133 handle_lpc() |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
134 { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
135 if (nfields != 5) { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
136 fprintf(stderr, "%s line %d: LPC takes 4 arguments\n", |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
137 infname, lineno); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
138 exit(1); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
139 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
140 set_speech_params(1, 1); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
141 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
142 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
143 static void |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
144 handle_mode() |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
145 { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
146 if (nfields != 2) { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 fprintf(stderr, "%s line %d: Mode takes one argument\n", |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 infname, lineno); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 exit(1); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
150 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
151 set_speech_params(5, 1); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 static void |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 handle_sf() |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
157 unsigned sf_0_based; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
159 if (nfields != 5) { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
160 fprintf(stderr, "%s line %d: sf takes 4 arguments\n", |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
161 infname, lineno); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
162 exit(1); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
163 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
164 if (fields[1][0] < '1' || fields[1][0] > '4' || fields[1][1]) { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
165 fprintf(stderr, |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
166 "%s line %d: first argument to sf must be in range [1,4]\n", |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
167 infname, lineno); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
168 exit(1); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
169 } |
519
6f8abfe253a4
gsmhr-dec-craft: works after bugfix
Mychaela Falconia <falcon@freecalypso.org>
parents:
518
diff
changeset
|
170 sf_0_based = fields[1][0] - '1'; |
518
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
171 set_speech_params(6 + sf_0_based * 3, 2); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
172 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
173 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
174 static void |
570
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
175 set_vad_sp() |
518
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
176 { |
570
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
177 if (nfields != 3) { |
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
178 fprintf(stderr, "%s line %d: vad-sp takes 2 arguments\n", |
518
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
179 infname, lineno); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
180 exit(1); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
181 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 if (fields[1][0] < '0' || fields[1][0] > '1' || fields[1][1]) { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 fprintf(stderr, |
570
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
184 "%s line %d: invalid VAD argument \"%s\" (must be 0 or 1)\n", |
518
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 infname, lineno, fields[1]); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 exit(1); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 } |
570
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
188 enc_frame[18] = fields[1][0] - '0'; |
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
189 if (fields[2][0] < '0' || fields[2][0] > '1' || fields[2][1]) { |
518
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
190 fprintf(stderr, |
570
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
191 "%s line %d: invalid SP argument \"%s\" (must be 0 or 1)\n", |
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
192 infname, lineno, fields[2]); |
518
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 exit(1); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 } |
570
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
195 enc_frame[19] = fields[2][0] - '0'; |
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
196 if (enc_frame[18] && !enc_frame[19]) { |
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
197 fprintf(stderr, |
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
198 "%s line %d: combination VAD=1 SP=0 is invalid\n", |
518
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
199 infname, lineno); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
200 exit(1); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
204 static void |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 emit_frame() |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 { |
570
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
207 if (gsmhr_check_common_params(enc_frame) < 0) { |
518
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 fprintf(stderr, |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
209 "%s line %d: one of the preceding speech parameters is out of range\n", |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 infname, lineno); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 exit(1); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
212 } |
570
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
213 fwrite(enc_frame, 2, GSMHR_NUM_PARAMS_ENC, outf); |
518
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 main(argc, argv) |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 char **argv; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219 int rc; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
220 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
221 if (argc != 3) { |
570
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
222 fprintf(stderr, "usage: %s input.src output.cod\n", argv[0]); |
518
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
223 exit(1); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
224 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
225 infname = argv[1]; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
226 outfname = argv[2]; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
227 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
228 inf = fopen(infname, "r"); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
229 if (!inf) { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
230 perror(infname); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
231 exit(1); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
232 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
233 outf = fopen(outfname, "w"); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
234 if (!outf) { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
235 perror(outfname); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
236 exit(1); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
237 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
238 |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
239 for (;;) { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
240 rc = get_line_nonempty(); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
241 if (rc) |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
242 break; |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
243 if (!strcasecmp(fields[0], "all-0")) |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
244 set_all_0(); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
245 else if (!strcasecmp(fields[0], "dhf")) |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
246 set_dhf(); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
247 else if (!strcasecmp(fields[0], "r0")) |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
248 handle_r0(); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
249 else if (!strcasecmp(fields[0], "lpc")) |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
250 handle_lpc(); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
251 else if (!strcasecmp(fields[0], "mode")) |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
252 handle_mode(); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
253 else if (!strcasecmp(fields[0], "sf")) |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
254 handle_sf(); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
255 else if (!strcasecmp(fields[0], "sid-cw")) |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
256 set_sid_cw(); |
570
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
257 else if (!strcasecmp(fields[0], "vad-sp")) |
b4c4ed4b1b91
hrutil: new program gsmhr-cod-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
569
diff
changeset
|
258 set_vad_sp(); |
518
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
259 else if (!strcasecmp(fields[0], "emit-frame")) |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
260 emit_frame(); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
261 else { |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
262 fprintf(stderr, |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
263 "%s line %d: non-understood keyword \"%s\"\n", |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
264 infname, lineno, fields[0]); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
265 exit(1); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
266 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
267 } |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
268 exit(0); |
087a88d25ba2
new program gsmhr-dec-craft
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
269 } |