Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/freealut-1.1.0/src/alutCodec.c @ 35

Last change on this file since 35 was 14, checked in by landauf, 17 years ago

added freealut

File size: 3.3 KB
RevLine 
[14]1#include "alutInternal.h"
2
3ALvoid *
4_alutCodecLinear (ALvoid *data, size_t length, ALint numChannels,
5                  ALint bitsPerSample, ALfloat sampleFrequency)
6{
7  return _alutBufferDataConstruct (data, length, numChannels, bitsPerSample,
8                                   sampleFrequency);
9}
10
11ALvoid *
12_alutCodecPCM8s (ALvoid *data, size_t length, ALint numChannels,
13                 ALint bitsPerSample, ALfloat sampleFrequency)
14{
15  int8_t *d = (int8_t *) data;
16  size_t i;
17  for (i = 0; i < length; i++)
18    {
19      d[i] += (int8_t) 128;
20    }
21  return _alutBufferDataConstruct (data, length, numChannels, bitsPerSample,
22                                   sampleFrequency);
23}
24
25ALvoid *
26_alutCodecPCM16 (ALvoid *data, size_t length, ALint numChannels,
27                 ALint bitsPerSample, ALfloat sampleFrequency)
28{
29  int16_t *d = (int16_t *) data;
30  size_t i, l = length / 2;
31  for (i = 0; i < l; i++)
32    {
33      int16_t x = d[i];
34      d[i] = ((x << 8) & 0xFF00) | ((x >> 8) & 0x00FF);
35    }
36  return _alutBufferDataConstruct (data, length, numChannels, bitsPerSample,
37                                   sampleFrequency);
38}
39
40/*
41 * From: http://www.multimedia.cx/simpleaudio.html#tth_sEc6.1
42 */
43static int16_t
44mulaw2linear (uint8_t mulawbyte)
45{
46  static const int16_t exp_lut[8] = {
47    0, 132, 396, 924, 1980, 4092, 8316, 16764
48  };
49  int16_t sign, exponent, mantissa, sample;
50  mulawbyte = ~mulawbyte;
51  sign = (mulawbyte & 0x80);
52  exponent = (mulawbyte >> 4) & 0x07;
53  mantissa = mulawbyte & 0x0F;
54  sample = exp_lut[exponent] + (mantissa << (exponent + 3));
55  if (sign != 0)
56    {
57      sample = -sample;
58    }
59  return sample;
60}
61
62ALvoid *
63_alutCodecULaw (ALvoid *data, size_t length, ALint numChannels,
64                ALint bitsPerSample, ALfloat sampleFrequency)
65{
66  uint8_t *d = (uint8_t *) data;
67  int16_t *buf = (int16_t *) _alutMalloc (length * 2);
68  size_t i;
69  if (buf == NULL)
70    {
71      return NULL;
72    }
73  for (i = 0; i < length; i++)
74    {
75      buf[i] = mulaw2linear (d[i]);
76    }
77  free (data);
78  return _alutBufferDataConstruct (buf, length * 2, numChannels,
79                                   bitsPerSample, sampleFrequency);
80}
81
82/*
83 * From: http://www.multimedia.cx/simpleaudio.html#tth_sEc6.1
84 */
85#define SIGN_BIT (0x80)         /* Sign bit for a A-law byte. */
86#define QUANT_MASK (0xf)        /* Quantization field mask. */
87#define SEG_SHIFT (4)           /* Left shift for segment number. */
88#define SEG_MASK (0x70)         /* Segment field mask. */
89static int16_t
90alaw2linear (uint8_t a_val)
91{
92  int16_t t, seg;
93  a_val ^= 0x55;
94  t = (a_val & QUANT_MASK) << 4;
95  seg = ((int16_t) a_val & SEG_MASK) >> SEG_SHIFT;
96  switch (seg)
97    {
98    case 0:
99      t += 8;
100      break;
101    case 1:
102      t += 0x108;
103      break;
104    default:
105      t += 0x108;
106      t <<= seg - 1;
107    }
108  return (a_val & SIGN_BIT) ? t : -t;
109}
110
111ALvoid *
112_alutCodecALaw (ALvoid *data, size_t length, ALint numChannels,
113                ALint bitsPerSample, ALfloat sampleFrequency)
114{
115  uint8_t *d = (uint8_t *) data;
116  int16_t *buf = (int16_t *) _alutMalloc (length * 2);
117  size_t i;
118  if (buf == NULL)
119    {
120      return NULL;
121    }
122  for (i = 0; i < length; i++)
123    {
124      buf[i] = alaw2linear (d[i]);
125    }
126  free (data);
127  return _alutBufferDataConstruct (buf, length * 2, numChannels,
128                                   bitsPerSample, sampleFrequency);
129}
Note: See TracBrowser for help on using the repository browser.