2 * sun_au.datatype by Fredrik Wikstrom
10 static int16
decode_alaw (uint8 a_val
);
11 static int16
decode_mulaw(uint8 u_val
);
13 DEC_SETUPPROTO(SetupALAW
) {
14 data
->sample
.size
= 1;
15 data
->block
.size
= data
->sample
.size
* data
->au
.channels
;
16 data
->block
.frames
= 1;
20 DECODERPROTO(DecodeALAW
) {
22 for (fr
= 0; fr
< numFrames
; fr
++) {
23 for (ch
= 0; ch
< data
->au
.channels
; ch
++) {
24 *Dst
[ch
]++ = decode_alaw(*Src
++) >> 8;
27 return frameIndex
+ numFrames
;
30 DECODERPROTO(DecodeULAW
) {
32 for (fr
= 0; fr
< numFrames
; fr
++) {
33 for (ch
= 0; ch
< data
->au
.channels
; ch
++) {
34 *Dst
[ch
]++ = decode_mulaw(*Src
++) >> 8;
37 return frameIndex
+ numFrames
;
40 #define SIGN_BIT (0x80) /* Sign bit for a A-law byte. */
41 #define QUANT_MASK (0xf) /* Quantization field mask. */
42 #define SEG_SHIFT (4) /* Left shift for segment number. */
43 #define SEG_MASK (0x70) /* Segment field mask. */
44 #define BIAS (0x84) /* Bias for linear code. */
46 static int16
decode_alaw (uint8 a_val
) {
52 t
= (a_val
& QUANT_MASK
) << 4;
53 seg
= ((unsigned)a_val
& SEG_MASK
) >> SEG_SHIFT
;
65 return ((a_val
& SIGN_BIT
) ? t
: -t
);
68 static int16
decode_mulaw(uint8 u_val
) {
71 /* Complement to obtain normal u-law value. */
75 * Extract and bias the quantization bits. Then
76 * shift up by the segment number and subtract out the bias.
78 t
= ((u_val
& QUANT_MASK
) << 3) + BIAS
;
79 t
<<= ((unsigned)u_val
& SEG_MASK
) >> SEG_SHIFT
;
81 return ((u_val
& SIGN_BIT
) ? (BIAS
- t
) : (t
- BIAS
));