using System; using System.Collections.Generic; using System.Linq; using System.Text; using LibEveryFileExplorer.Math; namespace LibEveryFileExplorer.SND { public class DSPADPCM { Int16[] Table; double Last1 = 0; double Last2 = 0; public DSPADPCM(Int16[] CoefTable) { Table = CoefTable; } public void UpdateLastSamples(short Prev1, short Prev2) { Last1 = Prev1; Last2 = Prev2; } public Int16[] GetWaveData(byte[] Data, int Offset, int Length) { List DataOut = new List(); for (int i = Offset + 1; i < (Offset + Length); i += 8) { int Scale = 1 << (Data[i - 1] & 0xF); int Coef = (Data[i - 1] >> 4) & 0xF; double Coef1 = Table[Coef * 2]; double Coef2 = Table[Coef * 2 + 1]; for (int j = 0; j < 7; j++) { int high = Data[i + j] >> 4; int low = Data[i + j] & 0xF; if (high >= 8) high -= 16; if (low >= 8) low -= 16; double val = (((high * Scale) << 11) + 1024.0 + (Coef1 * Last1 + Coef2 * Last2)) / 2048.0; //>> 11; short samp = (short)MathUtil.Clamp((int)val, short.MinValue, short.MaxValue); DataOut.Add(samp); Last2 = Last1; Last1 = val; val = (((low * Scale) << 11) + 1024.0 + (Coef1 * Last1 + Coef2 * Last2)) / 2048.0;//>> 11; samp = (short)MathUtil.Clamp((int)val, short.MinValue, short.MaxValue); DataOut.Add(samp); Last2 = Last1; Last1 = val; } } return DataOut.ToArray(); } } }