Listing 2:ADPCM Decoder // This routine also uses the IndexTable and StepSizeTable from Listing 1 signed int ADPCMDecoder( char code ) { predsample = state.prevsample; // Restore previous values index = state.previndex; step = StepSizeTable[index]; // Find quantizer step size diffq = step >> 3; // Inverse quantize ADPCM code into a if( code & 4 ) // diff. using the quantizer step diffq += step; if( code & 2 ) diffq += step >> 1; if( code & 1 ) diffq += step >> 2; if( code & 8 ) // Add the difference to predicted sample predsample -= diffq; else predsample += diffq; if( predsample > 32767 ) // Check if overflow of new predicted sample predsample = 32767; else if( predsample < -32768 ) predsample = -32768; index += IndexTable[code]; // Find new quantizer step size if( index < 0 ) // Check if overflow of new quantizer step index = 0; if( index > 88 ) index = 88; state.prevsample = predsample; // Save values for next iteration state.previndex = index; return( predsample ); // Return new sample }