FreeCalypso > hg > freecalypso-tools
annotate tchtools/fc-vm2gsmx.c @ 989:a5bff8104b45
pln-ppb-test: implement program operation
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 03 Dec 2023 00:16:17 +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 } |