FreeCalypso > hg > freecalypso-tools
annotate tchtools/fc-vm2gsmx.c @ 995:74024eb17e04
fc-loadtool help: improve language regarding 16 MiB flash chips
In FC project history, 16 MiB flash originally meant Pirelli DP-L10.
Then we got FCDEV3B with the same flash (our own design), but now we are
discovering more Calypso devices that used such large flash, both late
Calypso era (Sony Ericsson K2x0) as well as much earlier ones (FIC FLUID
devices.txt file with 2004 dates, Leonardo+ rev 5). Hence we need to
migrate to more generic or neutral language in associated documentation,
without giving elevated status to specific examples that drove our
early project history.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 03 Dec 2023 21:11:12 +0000 |
parents | 546bf873ccc8 |
children |
rev | line source |
---|---|
170
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
904
5041bcb8140f
tchtools/fc-vm2hex.c: update header comment for new situation
Mychaela Falconia <falcon@freecalypso.org>
parents:
902
diff
changeset
|
2 * This utility converts old-fashioned (non-AMR) TCS211 voice memo files |
905
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
3 * read out of FFS into Themyscira Wireless gsmx (extended-libgsm) format, |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
4 * allowing further decoding into playable speech with gsmfr-decode. |
170
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 */ |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 #include <sys/types.h> |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include <stdio.h> |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 #include <stdlib.h> |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 |
905
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
11 static char *infname; |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
12 static FILE *inf, *outf; |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
13 static u_long file_offset; |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
14 |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
15 static const u_char bfi_marker[2] = {0xBF, 0x00}; |
170
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 static unsigned |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 get_word() |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 { |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 u_char b[2]; |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 int i, c; |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 for (i = 0; i < 2; i++) { |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 c = getc(inf); |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 if (c < 0) { |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 fprintf(stderr, "error: premature EOF in %s\n", |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 infname); |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 exit(1); |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 } |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 b[i] = c; |
905
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
31 file_offset++; |
170
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 } |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 return((b[1] << 8) | b[0]); |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 } |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 |
905
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
36 static void |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
37 read_dsp_bytes(bytes) |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
38 u_char *bytes; |
170
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 { |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 int i, dp; |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 unsigned word; |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 dp = 0; |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 for (i = 0; i < 17; i++) { |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 word = get_word(); |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 bytes[dp++] = word >> 8; |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 bytes[dp++] = word; |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 } |
905
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
49 } |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
50 |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
51 static void |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
52 convert_speech_sample() |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
53 { |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
54 u_char tidsp_bytes[34], libgsm_bytes[33]; |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
55 |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
56 read_dsp_bytes(tidsp_bytes); |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
57 gsm0610_tidsp_to_libgsm(tidsp_bytes, libgsm_bytes); |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
58 fwrite(libgsm_bytes, 1, 33, outf); |
170
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 } |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 main(argc, argv) |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 char **argv; |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 { |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 unsigned first_word; |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 |
905
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
66 if (argc != 3) { |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
67 fprintf(stderr, "usage: %s infile outfile\n", argv[0]); |
170
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 exit(1); |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 } |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 infname = argv[1]; |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 inf = fopen(infname, "r"); |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 if (!inf) { |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 perror(infname); |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 exit(1); |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 } |
905
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
76 outf = fopen(argv[2], "w"); |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
77 if (!outf) { |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
78 perror(argv[2]); |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
79 exit(1); |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
80 } |
170
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 for (;;) { |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 first_word = get_word(); |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 if (first_word == 0xFBFF) /* SC_VM_END_MASK */ |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 break; |
905
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
85 if ((first_word & 0xB7FF) == 0x8400) { |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
86 /* skip dummy header words 1 and 2 */ |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
87 get_word(); |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
88 get_word(); |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
89 /* process the actual speech or SID frame */ |
170
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 convert_speech_sample(); |
905
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
91 } else if (first_word == 0x0400) { |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
92 /* it's a skipped frame, aka BFI */ |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
93 fwrite(bfi_marker, 1, 2, outf); |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
94 } else { |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
95 fprintf(stderr, |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
96 "error in %s at offset 0x%lx: invalid frame header word 0x%04X\n", |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
97 infname, file_offset, first_word); |
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
98 exit(1); |
170
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 } |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 } |
905
546bf873ccc8
tchtools: new program fc-vm2gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
904
diff
changeset
|
101 fclose(outf); |
170
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 exit(0); |
a72bbc3ace09
fc-vm2hex utility written
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 } |