Newer
Older
Scratch / mobius / src / drivers / sound / misc.c
/*****************************************************************************
*****************************************************************************/
short mulaw_expand(unsigned char data)
{
	static const unsigned short exp_tab[8] =
	{
		0, 132, 396, 924, 1980, 4092, 8316, 16764
	};
	unsigned char exp;
	short ret_val;

	data = ~data;
	exp = (data >> 4) & 7;
	ret_val = exp_tab[exp] + ((data & 0x0F) << (exp + 3));
	if((data & 0x80) != 0)
		ret_val = -ret_val;
	return ret_val;
}
/*****************************************************************************
xxx - use a formula, like u-law
*****************************************************************************/
short alaw_expand(unsigned char data)
{
	static const short alaw2dma16[] =
	{
	     -5504,  -5248,  -6016,  -5760,  -4480,  -4224,  -4992,  -4736,
	     -7552,  -7296,  -8064,  -7808,  -6528,  -6272,  -7040,  -6784,
	     -2752,  -2624,  -3008,  -2880,  -2240,  -2112,  -2496,  -2368,
	     -3776,  -3648,  -4032,  -3904,  -3264,  -3136,  -3520,  -3392,
	    -22016, -20992, -24064, -23040, -17920, -16896, -19968, -18944,
	    -30208, -29184, -32256, -31232, -26112, -25088, -28160, -27136,
	    -11008, -10496, -12032, -11520,  -8960,  -8448,  -9984,  -9472,
	    -15104, -14592, -16128, -15616, -13056, -12544, -14080, -13568,
	      -344,   -328,   -376,   -360,   -280,   -264,   -312,   -296,
	      -472,   -456,   -504,   -488,   -408,   -392,   -440,   -424,
	       -88,    -72,   -120,   -104,    -24,     -8,    -56,    -40,
	      -216,   -200,   -248,   -232,   -152,   -136,   -184,   -168,
	     -1376,  -1312,  -1504,  -1440,  -1120,  -1056,  -1248,  -1184,
	     -1888,  -1824,  -2016,  -1952,  -1632,  -1568,  -1760,  -1696,
	      -688,   -656,   -752,   -720,   -560,   -528,   -624,   -592,
	      -944,   -912,  -1008,   -976,   -816,   -784,   -880,   -848,
	      5504,   5248,   6016,   5760,   4480,   4224,   4992,   4736,
	      7552,   7296,   8064,   7808,   6528,   6272,   7040,   6784,
	      2752,   2624,   3008,   2880,   2240,   2112,   2496,   2368,
	      3776,   3648,   4032,   3904,   3264,   3136,   3520,   3392,
	     22016,  20992,  24064,  23040,  17920,  16896,  19968,  18944,
	     30208,  29184,  32256,  31232,  26112,  25088,  28160,  27136,
	     11008,  10496,  12032,  11520,   8960,   8448,   9984,   9472,
	     15104,  14592,  16128,  15616,  13056,  12544,  14080,  13568,
	       344,    328,    376,    360,    280,    264,    312,    296,
	       472,    456,    504,    488,    408,    392,    440,    424,
		88,     72,    120,    104,     24,      8,     56,     40,
	       216,    200,    248,    232,    152,    136,    184,    168,
	      1376,   1312,   1504,   1440,   1120,   1056,   1248,   1184,
	      1888,   1824,   2016,   1952,   1632,   1568,   1760,   1696,
	       688,    656,    752,    720,    560,    528,    624,    592,
	       944,    912,   1008,    976,    816,    784,    880,    848
	};

	return alaw2dma16[data];
}
/*****************************************************************************
this function assumes sizeof(long)==4
and it assumes little-endian CPU (e.g. x86)
*****************************************************************************/
unsigned long read_be32(unsigned char *buffer)
{/* 'volatile' makes code a little smaller with GCC for x86 */
	volatile union
	{
		unsigned long dword;
		unsigned char byte[4];
	} temp;

	temp.byte[0] = buffer[3];
	temp.byte[1] = buffer[2];
	temp.byte[2] = buffer[1];
	temp.byte[3] = buffer[0];
	return temp.dword;
}
/*****************************************************************************
this function assumes sizeof(short)==2
and it assumes little-endian CPU (e.g. x86)
*****************************************************************************/
unsigned short read_be16(unsigned char *buffer)
{
	union
	{
		unsigned long word;
		unsigned char byte[2];
	} temp;

	temp.byte[0] = buffer[1];
	temp.byte[1] = buffer[0];
	return temp.word;
}