////------------------------------------------------------------------------------------------------------------------------------ private static FlacMetadataBlock ReadBlock(StreamBuffer stream) { int flags = stream.ReadByte(); // Length int length = stream.ReadBigEndianInt(3); if (length >= stream.Length) return null; byte[] data = new byte[length]; stream.Read(data, length); FlacMetadataBlock metadataBlock; FlacMetadataBlockType blockType = (FlacMetadataBlockType)(flags & HeaderFlags.BlockType); switch (blockType) { case FlacMetadataBlockType.Padding: metadataBlock = new FlacPaddingMetadataBlock(); break; case FlacMetadataBlockType.Application: metadataBlock = new FlacApplicationMetadataBlock(); break; case FlacMetadataBlockType.StreamInfo: metadataBlock = new FlacStreamInfoMetadataBlock(); break; case FlacMetadataBlockType.SeekTable: metadataBlock = new FlacSeekTableMetadataBlock(); break; case FlacMetadataBlockType.VorbisComment: metadataBlock = new FlacVorbisCommentsMetadataBlock(); break; case FlacMetadataBlockType.CueSheet: metadataBlock = new FlacCueSheetMetadataBlock(); break; case FlacMetadataBlockType.Picture: metadataBlock = new FlacPictureMetadataBlock(); break; default: metadataBlock = new FlacMetadataBlock(); break; } metadataBlock.Flags = flags; metadataBlock.Data = data; return metadataBlock; }
/// <summary> /// Initializes a new instance of the <see cref="VbriHeader"/> class. /// </summary> /// <param name="firstFrame">The first frame.</param> /// <param name="firstFrameBuffer">The first frame buffer.</param> /// <param name="offset">The offset.</param> public VbriHeader(MpaFrame firstFrame, StreamBuffer firstFrameBuffer, long offset) : base(firstFrame, firstFrameBuffer, offset, VbrHeaderType.Vbri) { /* FhG VBRI Header size description 4 'VBRI' (ID) 2 version 2 delay 2 quality 4 # bytes 4 # frames 2 table size (for TOC) 2 table scale (for TOC) 2 size of a table entry (max. size = 4 byte (must be stored in an integer)) 2 frames per table entry ?? dynamic table consisting out of frames with size 1-4 whole length in table size! (for TOC) */ // name Name = firstFrameBuffer.ReadString(4); // version Version = (short)firstFrameBuffer.ReadBigEndianInt16(); // delay _delay = firstFrameBuffer.ReadBigEndianInt16(); // quality Quality = firstFrameBuffer.ReadBigEndianInt16(); // size of the file, in bytes, of all the data FileSize = firstFrameBuffer.ReadBigEndianInt32(); // amount of frames FrameCount = firstFrameBuffer.ReadBigEndianInt32(); // number of entries in the table (for TOC) TableEntries = (short)firstFrameBuffer.ReadBigEndianInt16(); // table scale (for TOC) TableScale = (short)firstFrameBuffer.ReadBigEndianInt16(); // size of a table entry (in bytes) TableEntrySize = (short)firstFrameBuffer.ReadBigEndianInt16(); // frames per table entry FramesPerTableEntry = (short)firstFrameBuffer.ReadBigEndianInt16(); // dynamic table consisting out of frames TableLength = TableEntries * TableEntrySize; Toc = new int[TableEntries + 1]; for (int i = 0; i <= TableEntries; i++) { int value = firstFrameBuffer.ReadBigEndianInt(TableEntrySize); Toc[i] = value * TableScale; } _totalLengthMilliseconds = firstFrame.AudioLength * FrameCount; }
public void ReadBigEndianIntTest3Bytes() { const int Value = 0x123456; const int Expected = 0x563412; StreamBuffer target = new StreamBuffer(BitConverter.GetBytes(Value)) { Position = 0 }; long actual = target.ReadBigEndianInt(3); Assert.AreEqual(Expected, actual); }