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); } }
private unsafe void ReadSubFrames() { List<FlacSubFrameBase> subFrames = new List<FlacSubFrameBase>(); //alocateOutput var data = AllocOuputMemory(); _subFrames = 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(); Crc16 = (short) reader.ReadBits(16); _stream.Position -= read - reader.Position; MapToChannels(_subFrames); } }