home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
274.lha
/
SimGen_Src
/
DUNPACK.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-07-26
|
1KB
|
52 lines
/* DUnpack.c --- Fibonacci Delta decompression by Steve Hayes */
#include <exec/types.h>
/* Fibonacci delta encoding for sound data */
BYTE codeToDelta[16] = {-34,-21,-13,-8,-5,-3,-2,-1,0,1,2,3,5,8,13,21};
/* Unpack Fibonacci-delta encoded data from n byte source
* buffer into 2*n byte dest buffer, given initial data
* value x. It returns the lats data value x so you can
* call it several times to incrementally decompress the data.
*/
BYTE D1Unpack(source,n,dest,x)
BYTE *source;
ULONG n;
BYTE *dest;
BYTE x;
{
UBYTE d;
ULONG i, lim;
lim = n << 1;
for (i=0; i < lim; ++i) {
/* Decode a data nibble, high nibble then low nibble */
d = source[i >> 1]; /* get a pair of nibbles */
if (i & 1) { /* select low or high nibble */
d &= 0xf; /* mask to get the low nibble */
} else {
d >>= 4; /* shift to get the high nibble */
}
x += codeToDelta[d]; /* add in the decoded delta */
dest[i] = x; /* store a 1 byte sample */
}
return(x);
}
/* Unpack Fibonacci-delta encoded data from n byte
* source buffer into 2*(n-2) byte dest buffer.
* Source buffer has a pad byte, an 8-bit initial
* value, followed by n-2 bytes comprising 2*(n-2)
* 4-bit encoded samples.
*/
void DUnpack(source, n, dest)
BYTE *source;
ULONG n;
BYTE *dest;
{
D1Unpack(source+2, n-2, dest, source[1]);
}