Sane FreeBSD patch
[asterisk/asterisk.git] / codecs / lpc10 / lpcini.c
1 /*
2
3 $Log$
4 Revision 1.15  2003/10/16 10:44:04  markster
5 Sane FreeBSD patch
6
7 Revision 1.2  2003/10/16 10:44:04  markster
8 Sane FreeBSD patch
9
10 Revision 1.1.1.1  2003/02/12 13:59:15  matteo
11 mer feb 12 14:56:57 CET 2003
12
13 Revision 1.2  2000/01/05 08:20:39  markster
14 Some OSS fixes and a few lpc changes to make it actually work
15
16  * Revision 1.2  1996/08/20  20:35:41  jaf
17  * Added functions for allocating and initializing lpc10_encoder_state
18  * and lpc10_decoder_state structures.
19  *
20  * Revision 1.1  1996/08/19  22:31:40  jaf
21  * Initial revision
22  *
23
24 */
25
26 #ifdef P_R_O_T_O_T_Y_P_E_S
27 extern int lpcini_(void);
28 /* comlen contrl_ 12 */
29 /*:ref: initlpcenc_ 14 0 */
30 /*:ref: initlpcdec_ 14 0 */
31 #endif
32
33 /*  -- translated by f2c (version 19951025).
34    You must link the resulting object file with the libraries:
35         -lf2c -lm   (in that order)
36 */
37
38 #include "f2c.h"
39
40 #include <stdlib.h>
41
42 /* Common Block Declarations */
43
44 struct {
45     integer order, lframe;
46     logical corrp;
47 } contrl_;
48
49 #define contrl_1 contrl_
50
51 /* ***************************************************************** */
52
53 /* $Log$
54  * Revision 1.15  2003/10/16 10:44:04  markster
55  * Sane FreeBSD patch
56  *
57 /* Revision 1.2  2003/10/16 10:44:04  markster
58 /* Sane FreeBSD patch
59 /*
60 /* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
61 /* mer feb 12 14:56:57 CET 2003
62 /*
63 /* Revision 1.2  2000/01/05 08:20:39  markster
64 /* Some OSS fixes and a few lpc changes to make it actually work
65 /*
66  * Revision 1.2  1996/08/20  20:35:41  jaf
67  * Added functions for allocating and initializing lpc10_encoder_state
68  * and lpc10_decoder_state structures.
69  *
70  * Revision 1.1  1996/08/19  22:31:40  jaf
71  * Initial revision
72  * */
73 /* Revision 1.1  1996/03/28  00:04:05  jaf */
74 /* Initial revision */
75
76
77 /* ***************************************************************** */
78
79 /* Initialize COMMON block variables used by LPC-10 encoder and decoder, */
80 /* and call initialization routines for both of them. */
81
82 /* Subroutine */ int lpcini_(void)
83 {
84
85 /* $Log$
86  * Revision 1.15  2003/10/16 10:44:04  markster
87  * Sane FreeBSD patch
88  *
89 /* Revision 1.2  2003/10/16 10:44:04  markster
90 /* Sane FreeBSD patch
91 /*
92 /* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
93 /* mer feb 12 14:56:57 CET 2003
94 /*
95 /* Revision 1.2  2000/01/05 08:20:39  markster
96 /* Some OSS fixes and a few lpc changes to make it actually work
97 /*
98  * Revision 1.2  1996/08/20  20:35:41  jaf
99  * Added functions for allocating and initializing lpc10_encoder_state
100  * and lpc10_decoder_state structures.
101  *
102  * Revision 1.1  1996/08/19  22:31:40  jaf
103  * Initial revision
104  * */
105 /* Revision 1.3  1996/03/29  22:03:47  jaf */
106 /* Removed definitions for any constants that were no longer used. */
107
108 /* Revision 1.2  1996/03/26  19:34:33  jaf */
109 /* Added comments indicating which constants are not needed in an */
110 /* application that uses the LPC-10 coder. */
111
112 /* Revision 1.1  1996/02/07  14:43:51  jaf */
113 /* Initial revision */
114
115 /*   LPC Configuration parameters: */
116 /* Frame size, Prediction order, Pitch period */
117 /* $Log$
118  * Revision 1.15  2003/10/16 10:44:04  markster
119  * Sane FreeBSD patch
120  *
121 /* Revision 1.2  2003/10/16 10:44:04  markster
122 /* Sane FreeBSD patch
123 /*
124 /* Revision 1.1.1.1  2003/02/12 13:59:15  matteo
125 /* mer feb 12 14:56:57 CET 2003
126 /*
127 /* Revision 1.2  2000/01/05 08:20:39  markster
128 /* Some OSS fixes and a few lpc changes to make it actually work
129 /*
130  * Revision 1.2  1996/08/20  20:35:41  jaf
131  * Added functions for allocating and initializing lpc10_encoder_state
132  * and lpc10_decoder_state structures.
133  *
134  * Revision 1.1  1996/08/19  22:31:40  jaf
135  * Initial revision
136  * */
137 /* Revision 1.3  1996/03/29  22:05:55  jaf */
138 /* Commented out the common block variables that are not needed by the */
139 /* embedded version. */
140
141 /* Revision 1.2  1996/03/26  19:34:50  jaf */
142 /* Added comments indicating which constants are not needed in an */
143 /* application that uses the LPC-10 coder. */
144
145 /* Revision 1.1  1996/02/07  14:44:09  jaf */
146 /* Initial revision */
147
148 /*   LPC Processing control variables: */
149
150 /* *** Read-only: initialized in setup */
151
152 /*  Files for Speech, Parameter, and Bitstream Input & Output, */
153 /*    and message and debug outputs. */
154
155 /* Here are the only files which use these variables: */
156
157 /* lpcsim.f setup.f trans.f error.f vqsetup.f */
158
159 /* Many files which use fdebug are not listed, since it is only used in */
160 /* those other files conditionally, to print trace statements. */
161 /*      integer fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
162 /*  LPC order, Frame size, Quantization rate, Bits per frame, */
163 /*    Error correction */
164 /* Subroutine SETUP is the only place where order is assigned a value, */
165 /* and that value is 10.  It could increase efficiency 1% or so to */
166 /* declare order as a constant (i.e., a Fortran PARAMETER) instead of as 
167 */
168 /* a variable in a COMMON block, since it is used in many places in the */
169 /* core of the coding and decoding routines.  Actually, I take that back. 
170 */
171 /* At least when compiling with f2c, the upper bound of DO loops is */
172 /* stored in a local variable before the DO loop begins, and then that is 
173 */
174 /* compared against on each iteration. */
175 /* Similarly for lframe, which is given a value of MAXFRM in SETUP. */
176 /* Similarly for quant, which is given a value of 2400 in SETUP.  quant */
177 /* is used in only a few places, and never in the core coding and */
178 /* decoding routines, so it could be eliminated entirely. */
179 /* nbits is similar to quant, and is given a value of 54 in SETUP. */
180 /* corrp is given a value of .TRUE. in SETUP, and is only used in the */
181 /* subroutines ENCODE and DECODE.  It doesn't affect the speed of the */
182 /* coder significantly whether it is .TRUE. or .FALSE., or whether it is 
183 */
184 /* a constant or a variable, since it is only examined once per frame. */
185 /* Leaving it as a variable that is set to .TRUE.  seems like a good */
186 /* idea, since it does enable some error-correction capability for */
187 /* unvoiced frames, with no change in the coding rate, and no noticeable 
188 */
189 /* quality difference in the decoded speech. */
190 /*      integer quant, nbits */
191 /* *** Read/write: variables for debugging, not needed for LPC algorithm 
192 */
193
194 /*  Current frame, Unstable frames, Output clip count, Max onset buffer, 
195 */
196 /*    Debug listing detail level, Line count on listing page */
197
198 /* nframe is not needed for an embedded LPC10 at all. */
199 /* nunsfm is initialized to 0 in SETUP, and incremented in subroutine */
200 /* ERROR, which is only called from RCCHK.  When LPC10 is embedded into */
201 /* an application, I would recommend removing the call to ERROR in RCCHK, 
202 */
203 /* and remove ERROR and nunsfm completely. */
204 /* iclip is initialized to 0 in SETUP, and incremented in entry SWRITE in 
205 */
206 /* sread.f.  When LPC10 is embedded into an application, one might want */
207 /* to cause it to be incremented in a routine that takes the output of */
208 /* SYNTHS and sends it to an audio device.  It could be optionally */
209 /* displayed, for those that might want to know what it is. */
210 /* maxosp is never initialized to 0 in SETUP, although it probably should 
211 */
212 /* be, and it is updated in subroutine ANALYS.  I doubt that its value */
213 /* would be of much interest to an application in which LPC10 is */
214 /* embedded. */
215 /* listl and lincnt are not needed for an embedded LPC10 at all. */
216 /*      integer nframe, nunsfm, iclip, maxosp, listl, lincnt */
217 /*      common /contrl/ fsi, fso, fpi, fpo, fbi, fbo, pbin, fmsg, fdebug */
218 /*      common /contrl/ quant, nbits */
219 /*      common /contrl/ nframe, nunsfm, iclip, maxosp, listl, lincnt */
220     contrl_1.order = 10;
221     contrl_1.lframe = 180;
222     contrl_1.corrp = TRUE_;
223     return 0;
224 } /* lpcini_ */
225
226
227
228 /* Allocate memory for, and initialize, the state that needs to be
229    kept from encoding one frame to the next for a single
230    LPC-10-compressed audio stream.  Return 0 if malloc fails,
231    otherwise return pointer to new structure. */
232
233 struct lpc10_encoder_state *
234 create_lpc10_encoder_state()
235 {
236     struct lpc10_encoder_state *st;
237
238     st = (struct lpc10_encoder_state *)
239         malloc((unsigned) sizeof (struct lpc10_encoder_state));
240     if (st != 0) {
241         init_lpc10_encoder_state(st);
242     }
243     return (st);
244 }
245
246
247
248 void init_lpc10_encoder_state(struct lpc10_encoder_state *st)
249 {
250     int i;
251
252     lpcini_();
253
254     /* State used only by function hp100 */
255     st->z11 = 0.0f;
256     st->z21 = 0.0f;
257     st->z12 = 0.0f;
258     st->z22 = 0.0f;
259     
260     /* State used by function analys */
261     for (i = 0; i < 540; i++) {
262         st->inbuf[i] = 0.0f;
263         st->pebuf[i] = 0.0f;
264     }
265     for (i = 0; i < 696; i++) {
266         st->lpbuf[i] = 0.0f;
267     }
268     for (i = 0; i < 312; i++) {
269         st->ivbuf[i] = 0.0f;
270     }
271     st->bias = 0.0f;
272     /* integer osbuf[10];  /* no initial value necessary */
273     st->osptr = 1;
274     for (i = 0; i < 3; i++) {
275         st->obound[i] = 0;
276     }
277     st->vwin[4] = 307;
278     st->vwin[5] = 462;
279     st->awin[4] = 307;
280     st->awin[5] = 462;
281     for (i = 0; i < 8; i++) {
282         st->voibuf[i] = 0;
283     }
284     for (i = 0; i < 3; i++) {
285         st->rmsbuf[i] = 0.0f;
286     }
287     for (i = 0; i < 30; i++) {
288         st->rcbuf[i] = 0.0f;
289     }
290     st->zpre = 0.0f;
291
292
293     /* State used by function onset */
294     st->n = 0.0f;
295     st->d__ = 1.0f;
296     /* real fpc;   /* no initial value necessary */
297     for (i = 0; i < 16; i++) {
298         st->l2buf[i] = 0.0f;
299     }
300     st->l2sum1 = 0.0f;
301     st->l2ptr1 = 1;
302     st->l2ptr2 = 9;
303     /* integer lasti;    /* no initial value necessary */
304     st->hyst = FALSE_;
305
306     /* State used by function voicin */
307     st->dither = 20.0f;
308     st->maxmin = 0.0f;
309     for (i = 0; i < 6; i++) {
310         st->voice[i] = 0.0f;
311     }
312     st->lbve = 3000;
313     st->fbve = 3000;
314     st->fbue = 187;
315     st->ofbue = 187;
316     st->sfbue = 187;
317     st->lbue = 93;
318     st->olbue = 93;
319     st->slbue = 93;
320     st->snr = (real) (st->fbve / st->fbue << 6);
321
322     /* State used by function dyptrk */
323     for (i = 0; i < 60; i++) {
324         st->s[i] = 0.0f;
325     }
326     for (i = 0; i < 120; i++) {
327         st->p[i] = 0;
328     }
329     st->ipoint = 0;
330     st->alphax = 0.0f;
331
332     /* State used by function chanwr */
333     st->isync = 0;
334
335 }
336
337
338
339 /* Allocate memory for, and initialize, the state that needs to be
340    kept from decoding one frame to the next for a single
341    LPC-10-compressed audio stream.  Return 0 if malloc fails,
342    otherwise return pointer to new structure. */
343
344 struct lpc10_decoder_state *
345 create_lpc10_decoder_state()
346 {
347     struct lpc10_decoder_state *st;
348
349     st = (struct lpc10_decoder_state *)
350         malloc((unsigned) sizeof (struct lpc10_decoder_state));
351     if (st != 0) {
352         init_lpc10_decoder_state(st);
353     }
354     return (st);
355 }
356
357
358
359 void init_lpc10_decoder_state(struct lpc10_decoder_state *st)
360 {
361     int i;
362
363     lpcini_();
364
365     /* State used by function decode */
366     st->iptold = 60;
367     st->first = TRUE_;
368     st->ivp2h = 0;
369     st->iovoic = 0;
370     st->iavgp = 60;
371     st->erate = 0;
372     for (i = 0; i < 30; i++) {
373         st->drc[i] = 0;
374     }
375     for (i = 0; i < 3; i++) {
376         st->dpit[i] = 0;
377         st->drms[i] = 0;
378     }
379
380     /* State used by function synths */
381     for (i = 0; i < 360; i++) {
382         st->buf[i] = 0.0f;
383     }
384     st->buflen = 180;
385
386     /* State used by function pitsyn */
387     /* ivoico;   /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
388     /* ipito;   /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
389     st->rmso = 1.0f;
390     /* rco[10];   /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
391     /* integer jsamp;   /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
392     st->first_pitsyn = TRUE_;
393
394     /* State used by function bsynz */
395     st->ipo = 0;
396     for (i = 0; i < 166; i++) {
397         st->exc[i] = 0.0f;
398         st->exc2[i] = 0.0f;
399     }
400     st->lpi1 = 0.0f;
401     st->lpi2 = 0.0f;
402     st->lpi3 = 0.0f;
403     st->hpi1 = 0.0f;
404     st->hpi2 = 0.0f;
405     st->hpi3 = 0.0f;
406     st->rmso_bsynz = 0.0f;
407
408     /* State used by function random */
409     st->j = 2;
410     st->k = 5;
411     st->y[0] = (shortint) -21161;
412     st->y[1] = (shortint) -8478;
413     st->y[2] = (shortint) 30892;
414     st->y[3] = (shortint) -10216;
415     st->y[4] = (shortint) 16950;
416
417     /* State used by function deemp */
418     st->dei1 = 0.0f;
419     st->dei2 = 0.0f;
420     st->deo1 = 0.0f;
421     st->deo2 = 0.0f;
422     st->deo3 = 0.0f;
423 }