public unsafe static FlacMetadata FromStream(Stream stream) { bool lastBlock = false; FlacMetaDataType type = FlacMetaDataType.Undef; int length = 0; byte[] b = new byte[4]; if (stream.Read(b, 0, 4) <= 0) { throw new FlacException(new EndOfStreamException("Could not read metadata"), FlacLayer.Metadata); fixed(byte *headerBytes = b) { FlacBitReader bitReader = new FlacBitReader(headerBytes, 0); lastBlock = bitReader.ReadBits(1) == 1; type = (FlacMetaDataType)bitReader.ReadBits(7); length = (int)bitReader.ReadBits(24); ////1000 0000 //if (((b[0] & 0x80) >> 7) == 1) // lastBlock = true; //type = (FlacMetaDataType)(b[0] & 0x7F); //int length = (b[1] + (b[2] << 8) + (b[3] << 16)); } FlacMetadata data; long streamStartPosition = stream.Position; if ((int)type < 0 || (int)type > 6) return(null); } else { switch (type) { case FlacMetaDataType.StreamInfo: data = new FlacMetadataStreamInfo(stream, length, lastBlock); break; case FlacMetaDataType.Seektable: data = new FlacMetadataSeekTable(stream, length, lastBlock); break; default: data = new FlacMetadata(type, lastBlock, length); break; } } stream.Seek(length - (stream.Position - streamStartPosition), SeekOrigin.Current); return(data); }
public static unsafe FlacMetadata FromStream(Stream stream) { bool lastBlock = false; FlacMetaDataType type = FlacMetaDataType.Undef; int length = 0; byte[] b = new byte[4]; if (stream.Read(b, 0, 4) <= 0) throw new FlacException(new EndOfStreamException("Could not read metadata"), FlacLayer.Metadata); fixed (byte* headerBytes = b) { FlacBitReader bitReader = new FlacBitReader(headerBytes, 0); lastBlock = bitReader.ReadBits(1) == 1; type = (FlacMetaDataType)bitReader.ReadBits(7); length = (int)bitReader.ReadBits(24); ////1000 0000 //if (((b[0] & 0x80) >> 7) == 1) // lastBlock = true; //type = (FlacMetaDataType)(b[0] & 0x7F); //int length = (b[1] + (b[2] << 8) + (b[3] << 16)); } FlacMetadata data; long streamStartPosition = stream.Position; if ((int)type < 0 || (int)type > 6) return null; else { switch (type) { case FlacMetaDataType.StreamInfo: data = new FlacMetadataStreamInfo(stream, length, lastBlock); break; case FlacMetaDataType.Seektable: data = new FlacMetadataSeekTable(stream, length, lastBlock); break; default: data = new FlacMetadata(type, lastBlock, length); break; } } stream.Seek(length - (stream.Position - streamStartPosition), SeekOrigin.Current); return data; }
/// <summary> /// Reads and returns a single <see cref="FlacMetadata"/> from the specified <paramref name="stream"/>. /// </summary> /// <param name="stream">The stream which contains the <see cref="FlacMetadata"/>.</param> /// <returns>Returns the read <see cref="FlacMetadata"/>.</returns> public static unsafe FlacMetadata FromStream(Stream stream) { bool lastBlock; FlacMetaDataType type; int length; byte[] b = new byte[4]; if (stream.Read(b, 0, 4) <= 0) throw new FlacException(new EndOfStreamException("Could not read metadata"), FlacLayer.Metadata); fixed (byte* headerBytes = b) { FlacBitReader bitReader = new FlacBitReader(headerBytes, 0); lastBlock = bitReader.ReadBits(1) == 1; type = (FlacMetaDataType)bitReader.ReadBits(7); length = (int)bitReader.ReadBits(24); } FlacMetadata data; long streamStartPosition = stream.Position; if ((int)type < 0 || (int)type > 6) return null; switch (type) { case FlacMetaDataType.StreamInfo: data = new FlacMetadataStreamInfo(stream, length, lastBlock); break; case FlacMetaDataType.Seektable: data = new FlacMetadataSeekTable(stream, length, lastBlock); break; default: data = new FlacMetadata(type, lastBlock, length); break; } stream.Seek(length - (stream.Position - streamStartPosition), SeekOrigin.Current); return data; }