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.AllDataFromStream(stream); List <FlacFrameInformation> frames = new List <FlacFrameInformation>(); FlacFrameInformation frameInfo = new FlacFrameInformation(); frameInfo.IsFirstFrame = true; FlacFrameHeader header; FlacFrameHeader tmp = null; FlacFrameHeader baseHeader = null; while (true) { read = stream.Read(buffer, 0, buffer.Length); if (read <= FlacConstant.FrameHeaderSize) break; fixed(byte *bufferPtr = buffer) { byte *ptr = bufferPtr; byte *ptrSafe; //for (int i = 0; i < read - FlacConstant.FrameHeaderSize; i++) while ((bufferPtr + read - FlacConstant.FrameHeaderSize) > ptr) { if ((*ptr++ & 0xFF) == 0xFF && (*ptr & 0xF8) == 0xF8) //check sync { ptrSafe = ptr; ptr--; if (IsFrame(ref ptr, streamInfo, baseHeader, out tmp)) { 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); }
public FlacFile(Stream stream, FlacPreScanMethodMode?scanFlag, Action <FlacPreScanFinishedEventArgs> onscanFinished) { if (stream == null) { throw new ArgumentNullException(); } if (!stream.CanRead) { throw new ArgumentException("Stream is not readable.", "stream"); } _stream = stream; //skip ID3v2 Tags.ID3.ID3v2.SkipTag(stream); int read = 0; //read fLaC sync byte[] beginSync = new byte[4]; read = stream.Read(beginSync, 0, beginSync.Length); if (read < beginSync.Length) { throw new EndOfStreamException("Can not read \"fLaC\" sync."); } if (beginSync[0] == 0x66 && beginSync[1] == 0x4C && beginSync[2] == 0x61 && beginSync[3] == 0x43) { //read metadata var metadata = FlacMetadata.AllDataFromStream(stream); Metadata = metadata; if (metadata == null || metadata.Count <= 0) { throw new FlacException("No Metadata found.", FlacLayer.Metadata); } FlacMetadataStreamInfo streamInfo = metadata.Where(x => x.MetaDataType == FlacMetaDataType.StreamInfo).First() as FlacMetadataStreamInfo; if (streamInfo == null) { new FlacException("No StreamInfo-Metadata found.", FlacLayer.Metadata); } _streamInfo = streamInfo; _waveFormat = new WaveFormat(streamInfo.SampleRate, (short)streamInfo.BitsPerSample, (short)streamInfo.Channels, AudioEncoding.Pcm); Debug.WriteLine("Flac StreamInfo found -> WaveFormat: " + _waveFormat.ToString()); Debug.WriteLine("Flac-File-Metadata read."); } else { throw new FlacException("Invalid Flac-File. \"fLaC\" Sync not found.", FlacLayer.Top); } //prescan stream if (scanFlag != null) { FlacPreScan scan = new FlacPreScan(stream); scan.ScanFinished += (s, e) => { if (onscanFinished != null) { onscanFinished(e); } }; scan.ScanStream(_streamInfo, (FlacPreScanMethodMode)scanFlag); _scan = scan; } }