18 static struct ADPCMstate state;
21 static const int8_t ai8_IndexTable[16] = {
22 -1, -1, -1, -1, 2, 4, 6, 8,
23 -1, -1, -1, -1, 2, 4, 6, 8
31 static const uint16_t au16_StepSizeTable[49] = {
32 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45,
33 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143,
34 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449,
35 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552
38 void ADPCMEncoderInit(
void) {
39 state.i16_prevsample=0;
40 state.i16_previndex=0;
62 i16_predsample = state.i16_prevsample;
63 i16_index = state.i16_previndex;
64 i16_step = au16_StepSizeTable[i16_index];
68 i16_diff = i16_sample - i16_predsample;
79 if ( i16_diff >= tempstep ) {
84 if ( i16_diff >= tempstep ) {
89 if ( i16_diff >= tempstep )
94 i16_diffq = i16_step >> 3;
96 i16_diffq += i16_step;
98 i16_diffq += i16_step >> 1;
100 i16_diffq += i16_step >> 2;
105 i16_predsample -= i16_diffq;
107 i16_predsample += i16_diffq;
110 if ( i16_predsample > MAX_POS )
111 i16_predsample = MAX_POS;
112 else if ( i16_predsample < MAX_NEG )
113 i16_predsample = MAX_NEG;
117 i16_index += ai8_IndexTable[code];
122 if ( i16_index > MAX_INDEX )
123 i16_index = MAX_INDEX;
127 state.i16_prevsample = i16_predsample;
128 state.i16_previndex = i16_index;
130 return ( code & 0x0f );
133 void ADPCMDecoderInit(
void) {
134 state.i16_prevsample= 0;
135 state.i16_previndex=0;
150 i16_predsample = state.i16_prevsample;
151 i16_index = state.i16_previndex;
154 i16_step = au16_StepSizeTable[i16_index];
158 i16_diffq = i16_step >> 3;
160 i16_diffq += i16_step;
162 i16_diffq += i16_step >> 1;
164 i16_diffq += i16_step >> 2;
168 i16_predsample -= i16_diffq;
170 i16_predsample += i16_diffq;
173 if ( i16_predsample > MAX_POS )
174 i16_predsample = MAX_POS;
175 else if ( i16_predsample < MAX_NEG )
176 i16_predsample = MAX_NEG;
180 i16_index += ai8_IndexTable[u8_code];
185 if ( i16_index > MAX_INDEX )
186 i16_index = MAX_INDEX;
190 state.i16_prevsample = i16_predsample;
191 state.i16_previndex = i16_index;
193 return( i16_predsample );