//This process is specific to decode STAR OCEAN samples. public static byte[] decodeSOStreamBRRToWav(ref byte[] brr, ref bool ptrLooped, bool addWavHeader = true, bool applyGaussFilter = true, Int16 bitwidth = 16, Int16 channels = 1, UInt32 samplerate = 32000) { List <Int16> rawSamples = new List <Int16>(); int nOfBrrBytes = brr[7] + (brr[8] & 0x3F) * 0x0100; brr = brr.Skip(9).ToArray(); brr = brr.Take(nOfBrrBytes).ToArray(); nOfBrrBytes = (nOfBrrBytes / 9) * 16; while (rawSamples.Count < nOfBrrBytes) { int startIndex = (rawSamples.Count * 9) / 16; rawSamples.AddRange(decodeBRRToInt16(brr.Skip(startIndex).ToArray(), ref ptrLooped, false)); } if (rawSamples.Count <= 0) { return new byte[] { } } ; if (applyGaussFilter) { gaussFilter(ref rawSamples); } if (!addWavHeader) { return(rawSamples.SelectMany(BitConverter.GetBytes).ToArray()); } byte[] wavBytes = Brr.getWavHeader(rawSamples.Count, 16, 1, samplerate).ToArray(); wavBytes = wavBytes.Concat(rawSamples.SelectMany(BitConverter.GetBytes).ToArray()).ToArray(); return(wavBytes); }
public static byte[] decodeBRRToWav(byte[] brr, ref bool ptrLooped, bool addWavHeader = true, bool applyGaussFilter = true, Int16 bitwidth = 16, Int16 channels = 1, UInt32 samplerate = 32000) { List <Int16> rawSamples = decodeBRRToInt16(brr, ref ptrLooped); if (rawSamples.Count <= 0) { return new byte[] { } } ; if (applyGaussFilter) { gaussFilter(ref rawSamples); } if (!addWavHeader) { return(rawSamples.SelectMany(BitConverter.GetBytes).ToArray()); } byte[] wavBytes = Brr.getWavHeader(rawSamples.Count, 16, 1, samplerate).ToArray(); wavBytes = wavBytes.Concat(rawSamples.SelectMany(BitConverter.GetBytes).ToArray()).ToArray(); return(wavBytes); }