private unsafe void ReadSubFrames(int *ptrDestBuffer, int *ptrResidualBuffer) { List <FlacSubFrameBase> subFrames = new List <FlacSubFrameBase>(); //alocateOutput var data = AllocOuputMemory(ptrDestBuffer, ptrResidualBuffer); _subFrameData = data; byte[] buffer = new byte[0x20000]; if ((_streamInfo.MaxFrameSize * Header.Channels * Header.BitsPerSample * 2 >> 3) > buffer.Length) { buffer = new byte[(_streamInfo.MaxFrameSize * Header.Channels * Header.BitsPerSample * 2 >> 3) - FlacConstant.FrameHeaderSize]; } int read = _stream.Read(buffer, 0, (int)Math.Min(buffer.Length, _stream.Length - _stream.Position)); fixed(byte *ptrBuffer = buffer) { FlacBitReader reader = new FlacBitReader(ptrBuffer, 0); for (int c = 0; c < Header.Channels; c++) { int bitsPerSample = Header.BitsPerSample; if (Header.ChannelAssignment == ChannelAssignment.MidSide || Header.ChannelAssignment == ChannelAssignment.LeftSide) { bitsPerSample += c; } else if (Header.ChannelAssignment == ChannelAssignment.RightSide) { bitsPerSample += 1 - c; } var subframe = FlacSubFrameBase.GetSubFrame(reader, data[c], Header, bitsPerSample); subFrames.Add(subframe); } reader.Flush(); //Zero-padding to byte alignment. //footer Crc16 = (short)reader.ReadBits(16); _stream.Position -= read - reader.Position; MapToChannels(_subFrameData); } #if FLAC_DEBUG _subFrames = subFrames.AsReadOnly(); #endif }
private unsafe int ReadSubFrames() { List <FlacSubFrameBase> subFrames = new List <FlacSubFrameBase>(); //alocateOutput var data = AllocOuputMemory(); _data = data; byte[] buffer = new byte[0x20000]; if ((_streamInfo.MaxFrameSize * Header.Channels * Header.BitsPerSample * 2 >> 3) > buffer.Length) { buffer = new byte[(_streamInfo.MaxFrameSize * Header.Channels * Header.BitsPerSample * 2 >> 3) - FlacConstant.FrameHeaderSize]; } int read = _stream.Read(buffer, 0, (int)Math.Min(buffer.Length, _stream.Length - _stream.Position)); fixed(byte *ptrBuffer = buffer) { FlacBitReader reader = new FlacBitReader(ptrBuffer, 0); ChannelAssignment channelAssignment = Header.ChannelAssignment; for (int c = 0; c < Header.Channels; c++) { int bps = Header.BitsPerSample; if (Header.ChannelAssignment == ChannelAssignment.MidSide || Header.ChannelAssignment == ChannelAssignment.LeftSide) { bps += c; } else if (Header.ChannelAssignment == ChannelAssignment.RightSide) { bps += 1 - c; } var subframe = FlacSubFrameBase.GetSubFrame(reader, data[c], Header, bps); subFrames.Add(subframe); } reader.Flush(); CRC16 = (ushort)reader.ReadBits(16); _stream.Position -= read - reader.Position; SamplesToBytes(_data); return(reader.Position); } }
public unsafe static FlacSubFrameBase GetSubFrame(FlacBitReader reader, FlacSubFrameData data, FlacFrameHeader header, int bps) { uint x; int wastedBits = 0, totalBits = 0, order = 0; x = reader.ReadBits(8); bool haswastedBits = (x & 1) != 0; x &= 0xFE; //1111 1110 if (haswastedBits) { int u = (int)reader.ReadUnary(); wastedBits = u + 1; bps -= wastedBits; totalBits = bps; } if ((x & 0x80) != 0) { Debug.WriteLine("Flacdecoder lost sync while reading FlacSubFrameHeader. [x & 0x80]."); return(null); } FlacSubFrameBase subFrame = null; if ((x > 2 && x < 16) || (x > 24 && x < 64)) { Debug.WriteLine("Invalid FlacSubFrameHeader. [" + x.ToString("x") + "]"); return(null); } else if (x == 0) { subFrame = new FlacSubFrameConstant(reader, header, data, bps); } else if (x == 2) { //verbatim subFrame = new FlacSubFrameVerbatim(reader, header, data, bps); } else if (x >= 16 && x <= 24) { //fixed order = (int)((x >> 1) & 7); subFrame = new FlacSubFrameFixed(reader, header, data, bps, order); } else if (x >= 64) { //lpc order = (int)(((x >> 1) & 31) + 1); subFrame = new FlacSubFrameLPC(reader, header, data, bps, order); } else { Debug.WriteLine("Invalid Flac-SubframeType: x = " + x + "."); return(null); } if (haswastedBits) { int *ptrDest = data.destBuffer; for (int i = 0; i < header.BlockSize; i++) { *(ptrDest++) <<= wastedBits; } } //System.Diagnostics.Debug.WriteLine(subFrame.GetType().Name); if (subFrame != null) { subFrame.WastedBits = wastedBits; } else { Debug.WriteLine("Unknown error while reading FlacSubFrameHeader"); } return(subFrame); }