private unsafe List<FlacFrameInformation> ScanThisShit(FlacMetadataStreamInfo streamInfo) { Stream stream = _stream; //if (!(stream is BufferedStream)) // stream = new BufferedStream(stream); byte[] buffer = new byte[BufferSize]; int read = 0; stream.Position = 4; //fLaC FlacMetadata.ReadAllMetadataFromStream(stream); List<FlacFrameInformation> frames = new List<FlacFrameInformation>(); FlacFrameInformation frameInfo = new FlacFrameInformation(); frameInfo.IsFirstFrame = true; FlacFrameHeader baseHeader = null; while (true) { read = stream.Read(buffer, 0, buffer.Length); if (read <= FlacConstant.FrameHeaderSize) break; fixed (byte* bufferPtr = buffer) { byte* ptr = bufferPtr; //for (int i = 0; i < read - FlacConstant.FrameHeaderSize; i++) while ((bufferPtr + read - FlacConstant.FrameHeaderSize) > ptr) { if ((*ptr++ & 0xFF) == 0xFF && (*ptr & 0xF8) == 0xF8) //check sync { byte* ptrSafe = ptr; ptr--; FlacFrameHeader tmp = null; if (IsFrame(ref ptr, streamInfo, baseHeader, out tmp)) { FlacFrameHeader header = tmp; if (frameInfo.IsFirstFrame) { baseHeader = header; frameInfo.IsFirstFrame = false; } if (baseHeader.CompareTo(header)) { frameInfo.StreamOffset = stream.Position - read + ((ptrSafe - 1) - bufferPtr); frameInfo.Header = header; frames.Add(frameInfo); frameInfo.SampleOffset += header.BlockSize; } else { ptr = ptrSafe; } //todo: } else { ptr = ptrSafe; } } } } stream.Position -= FlacConstant.FrameHeaderSize; } return frames; }
private unsafe List <FlacFrameInformation> ScanThisShit(FlacMetadataStreamInfo streamInfo) { Stream stream = _stream; //if (!(stream is BufferedStream)) // stream = new BufferedStream(stream); byte[] buffer = new byte[BufferSize]; int read = 0; stream.Position = 4; //fLaC FlacMetadata.ReadAllMetadataFromStream(stream); List <FlacFrameInformation> frames = new List <FlacFrameInformation>(); FlacFrameInformation frameInfo = new FlacFrameInformation(); frameInfo.IsFirstFrame = true; FlacFrameHeader baseHeader = null; while (true) { read = stream.Read(buffer, 0, buffer.Length); if (read <= FlacConstant.FrameHeaderSize) break; fixed(byte *bufferPtr = buffer) { byte *ptr = bufferPtr; //for (int i = 0; i < read - FlacConstant.FrameHeaderSize; i++) while ((bufferPtr + read - FlacConstant.FrameHeaderSize) > ptr) { if ((*ptr++ & 0xFF) == 0xFF && (*ptr & 0xF8) == 0xF8) //check sync { byte *ptrSafe = ptr; ptr--; FlacFrameHeader tmp = null; if (IsFrame(ref ptr, streamInfo, baseHeader, out tmp)) { FlacFrameHeader header = tmp; if (frameInfo.IsFirstFrame) { baseHeader = header; frameInfo.IsFirstFrame = false; } if (baseHeader.CompareTo(header)) { frameInfo.StreamOffset = stream.Position - read + ((ptrSafe - 1) - bufferPtr); frameInfo.Header = header; frames.Add(frameInfo); frameInfo.SampleOffset += header.BlockSize; } else { ptr = ptrSafe; } //todo: } else { ptr = ptrSafe; } } } } stream.Position -= FlacConstant.FrameHeaderSize; } return(frames); }