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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }