257 lines
7.2 KiB
C
257 lines
7.2 KiB
C
/*
|
|
|
|
$Log$
|
|
Revision 1.18 2004/08/31 13:32:11 markster
|
|
Merge NetBSD and Courtesy tone with modifications (bug #2329)
|
|
|
|
Revision 1.17 2003/10/26 18:50:49 markster
|
|
Make it build and run on MacOS X
|
|
|
|
Revision 1.3 2003/10/26 18:50:49 markster
|
|
Make it build and run on MacOS X
|
|
|
|
Revision 1.2 2003/04/23 19:13:35 markster
|
|
More OpenBSD patches
|
|
|
|
Revision 1.1.1.2 2003/03/16 22:37:30 matteo
|
|
dom mar 16 23:37:23 CET 2003
|
|
|
|
Revision 1.2 2003/03/16 16:09:48 markster
|
|
Mere James's cleanups for fewer build warnings
|
|
|
|
Revision 1.1 2000/01/05 00:20:06 markster
|
|
Add broken lpc10 code... It's not too far from working I don't think...
|
|
|
|
* Revision 1.1 1996/08/19 22:47:31 jaf
|
|
* Initial revision
|
|
*
|
|
|
|
*/
|
|
|
|
#ifndef __LPC10_H__
|
|
#define __LPC10_H__
|
|
|
|
#define P_R_O_T_O_T_Y_P_E_S
|
|
|
|
#define LPC10_SAMPLES_PER_FRAME 180
|
|
#define LPC10_BITS_IN_COMPRESSED_FRAME 54
|
|
|
|
|
|
/*
|
|
|
|
The "#if defined"'s in this file are by no means intended to be
|
|
complete. They are what Nautilus uses, which has been successfully
|
|
compiled under DOS with the Microsoft C compiler, and under a few
|
|
versions of Unix with the GNU C compiler.
|
|
|
|
*/
|
|
|
|
#if defined(unix) || defined(__unix__) || defined(__NetBSD__)
|
|
typedef short INT16;
|
|
typedef int INT32;
|
|
#endif
|
|
|
|
|
|
#if defined(__MSDOS__) || defined(MSDOS)
|
|
typedef int INT16;
|
|
typedef long INT32;
|
|
#endif
|
|
|
|
#if defined(__APPLE__)
|
|
typedef short INT16;
|
|
typedef int INT32;
|
|
#endif
|
|
|
|
#if defined(WIN32) && defined(_MSC_VER)
|
|
typedef __int16 INT16;
|
|
typedef __int32 INT32;
|
|
#pragma warning(disable: 4005)
|
|
#endif
|
|
|
|
|
|
/* The initial values for every member of this structure is 0, except
|
|
where noted in comments. */
|
|
|
|
/* These two lines are copied from f2c.h. There should be a more
|
|
elegant way of doing this than having the same declarations in two
|
|
files. */
|
|
|
|
typedef float real;
|
|
typedef INT32 integer;
|
|
typedef INT32 logical;
|
|
typedef INT16 shortint;
|
|
|
|
struct lpc10_encoder_state {
|
|
/* State used only by function hp100 */
|
|
real z11;
|
|
real z21;
|
|
real z12;
|
|
real z22;
|
|
|
|
/* State used by function analys */
|
|
real inbuf[540], pebuf[540];
|
|
real lpbuf[696], ivbuf[312];
|
|
real bias;
|
|
integer osbuf[10]; /* no initial value necessary */
|
|
integer osptr; /* initial value 1 */
|
|
integer obound[3];
|
|
integer vwin[6] /* was [2][3] */; /* initial value vwin[4] = 307; vwin[5] = 462; */
|
|
integer awin[6] /* was [2][3] */; /* initial value awin[4] = 307; awin[5] = 462; */
|
|
integer voibuf[8] /* was [2][4] */;
|
|
real rmsbuf[3];
|
|
real rcbuf[30] /* was [10][3] */;
|
|
real zpre;
|
|
|
|
|
|
/* State used by function onset */
|
|
real n;
|
|
real d__; /* initial value 1.f */
|
|
real fpc; /* no initial value necessary */
|
|
real l2buf[16];
|
|
real l2sum1;
|
|
integer l2ptr1; /* initial value 1 */
|
|
integer l2ptr2; /* initial value 9 */
|
|
integer lasti; /* no initial value necessary */
|
|
logical hyst; /* initial value FALSE_ */
|
|
|
|
/* State used by function voicin */
|
|
real dither; /* initial value 20.f */
|
|
real snr;
|
|
real maxmin;
|
|
real voice[6] /* was [2][3] */; /* initial value is probably unnecessary */
|
|
integer lbve, lbue, fbve, fbue;
|
|
integer ofbue, sfbue;
|
|
integer olbue, slbue;
|
|
/* Initial values:
|
|
lbve = 3000;
|
|
fbve = 3000;
|
|
fbue = 187;
|
|
ofbue = 187;
|
|
sfbue = 187;
|
|
lbue = 93;
|
|
olbue = 93;
|
|
slbue = 93;
|
|
snr = (real) (fbve / fbue << 6);
|
|
*/
|
|
|
|
/* State used by function dyptrk */
|
|
real s[60];
|
|
integer p[120] /* was [60][2] */;
|
|
integer ipoint;
|
|
real alphax;
|
|
|
|
/* State used by function chanwr */
|
|
integer isync;
|
|
|
|
};
|
|
|
|
|
|
struct lpc10_decoder_state {
|
|
|
|
/* State used by function decode */
|
|
integer iptold; /* initial value 60 */
|
|
logical first; /* initial value TRUE_ */
|
|
integer ivp2h;
|
|
integer iovoic;
|
|
integer iavgp; /* initial value 60 */
|
|
integer erate;
|
|
integer drc[30] /* was [3][10] */;
|
|
integer dpit[3];
|
|
integer drms[3];
|
|
|
|
/* State used by function synths */
|
|
real buf[360];
|
|
integer buflen; /* initial value 180 */
|
|
|
|
/* State used by function pitsyn */
|
|
integer ivoico; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
|
integer ipito; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
|
real rmso; /* initial value 1.f */
|
|
real rco[10]; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
|
integer jsamp; /* no initial value necessary as long as first_pitsyn is initially TRUE_ */
|
|
logical first_pitsyn; /* initial value TRUE_ */
|
|
|
|
/* State used by function bsynz */
|
|
integer ipo;
|
|
real exc[166];
|
|
real exc2[166];
|
|
real lpi1;
|
|
real lpi2;
|
|
real lpi3;
|
|
real hpi1;
|
|
real hpi2;
|
|
real hpi3;
|
|
real rmso_bsynz;
|
|
|
|
/* State used by function random */
|
|
integer j; /* initial value 2 */
|
|
integer k; /* initial value 5 */
|
|
shortint y[5]; /* initial value { -21161,-8478,30892,-10216,16950 } */
|
|
|
|
/* State used by function deemp */
|
|
real dei1;
|
|
real dei2;
|
|
real deo1;
|
|
real deo2;
|
|
real deo3;
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
Calling sequence:
|
|
|
|
Call create_lpc10_encoder_state(), which returns a pointer to an
|
|
already initialized lpc10_encoder_state structure.
|
|
|
|
lpc10_encode reads indices 0 through (LPC10_SAMPLES_PER_FRAME-1) of
|
|
array speech[], and writes indices 0 through
|
|
(LPC10_BITS_IN_COMPRESSED_FRAME-1) of array bits[], and both reads
|
|
and writes the lpc10_encoder_state structure contents. The
|
|
lpc10_encoder_state structure should *not* be initialized for every
|
|
frame of encoded speech. Once at the beginning of execution, done
|
|
automatically for you by create_lpc10_encoder_state(), is enough.
|
|
|
|
init_lpc10_encoder_state() reinitializes the lpc10_encoder_state
|
|
structure. This might be useful if you are finished processing one
|
|
sound sample, and want to reuse the same lpc10_encoder_state
|
|
structure to process another sound sample. There might be other
|
|
uses as well.
|
|
|
|
Note that the comments in the lpc10/lpcenc.c file imply that indices
|
|
1 through 180 of array speech[] are read. These comments were
|
|
written for the Fortran version of the code, before it was
|
|
automatically converted to C by the conversion program f2c. f2c
|
|
seems to use the convention that the pointers to arrays passed as
|
|
function arguments point to the first index used in the Fortran
|
|
code, whatever index that might be (usually 1), and then it modifies
|
|
the pointer inside of the function, like so:
|
|
|
|
if (speech) {
|
|
--speech;
|
|
}
|
|
|
|
So that the code can access the first value at index 1 and the last
|
|
at index 180. This makes the translated C code "closer" to the
|
|
original Fortran code.
|
|
|
|
The calling sequence for the decoder is similar to the encoder. The
|
|
only significant difference is that the array bits[] is read
|
|
(indices 0 through (LPC10_BITS_IN_COMPRESSED_FRAME-1)), and the
|
|
array speech[] is written (indices 0 through
|
|
(LPC10_SAMPLES_PER_FRAME-1)).
|
|
|
|
*/
|
|
|
|
struct lpc10_encoder_state * create_lpc10_encoder_state (void);
|
|
void init_lpc10_encoder_state (struct lpc10_encoder_state *st);
|
|
int lpc10_encode (real *speech, INT32 *bits, struct lpc10_encoder_state *st);
|
|
|
|
struct lpc10_decoder_state * create_lpc10_decoder_state (void);
|
|
void init_lpc10_decoder_state (struct lpc10_decoder_state *st);
|
|
int lpc10_decode (INT32 *bits, real *speech, struct lpc10_decoder_state *st);
|
|
|
|
#endif /* __LPC10_H__ */
|