public VorbisPacket(ByteArray aByteArray, VorbisHeader aVorbisHeader, Byte[] aFirstSegmentArray) { oggPageHeader = new OggPageHeader(aByteArray); sizeSegmentList = oggPageHeader.GetSegmentSizeList(); vorbisSegmentArray = new VorbisSegment[sizeSegmentList.Count]; for (int i = 0; i < sizeSegmentList.Count; i++) { Byte[] lPacket = aByteArray.ReadBytes(sizeSegmentList[i]); Byte[] lPacketAll = new Byte[sizeSegmentList[i] + aFirstSegmentArray.Length]; for (int j = 0; j < aFirstSegmentArray.Length; j++) { lPacketAll[j] = aFirstSegmentArray[j]; } for (int j = 0; j < sizeSegmentList[i]; j++) { lPacketAll[aFirstSegmentArray.Length + j] = lPacket[j]; } MemoryStream lMemoryStream = new MemoryStream(lPacketAll); ByteArrayLittle lByteArray = new ByteArrayLittle(lMemoryStream); vorbisSegmentArray[i] = new VorbisSegment(lByteArray, aVorbisHeader); aFirstSegmentArray = new Byte[0]; } nextSegmentArray = aByteArray.ReadBytes(oggPageHeader.GetNextSegmentSize()); }
public OggPage(OggPage src) { Header = src.Header; Size = src.Size; Segments = new byte[src.Segments.Length][]; for (int pos = 0; pos < Segments.Length; pos++) { Segments[pos] = new byte[src.Segments[pos].Length]; Array.Copy(src.Segments[pos], Segments[pos], Segments[pos].Length); } }
private OggPage GetOggPage(ref int offset) { OggPageHeader hdr = new OggPageHeader(); OggPage page = new OggPage(); int pageSize = 0; ByteArrayToStructure(Audio, offset, ref hdr); if (hdr.Header[0] != 'O' || hdr.Header[1] != 'g' || hdr.Header[2] != 'g' || hdr.Header[3] != 'S') { return(null); } page.Header = hdr; pageSize += Marshal.SizeOf(hdr); page.Segments = new byte[0][]; /* where will the segment data start */ int segmentDataPos = pageSize + hdr.PageSegments; /* position in page segment table */ int pageSegTablePos = 0; /* logical number of the segment */ int pageSegNum = 0; while (pageSegTablePos < hdr.PageSegments) { int lenEntry = Audio[offset + pageSize]; int len = lenEntry; pageSize++; pageSegTablePos++; while (lenEntry == 0xFF) { lenEntry = Audio[offset + pageSize]; len += lenEntry; pageSize++; pageSegTablePos++; } Array.Resize(ref page.Segments, pageSegNum + 1); page.Segments[pageSegNum] = new byte[len]; Array.Copy(Audio, offset + segmentDataPos, page.Segments[pageSegNum], 0, len); segmentDataPos += page.Segments[pageSegNum].Length; pageSegNum++; } page.Size = segmentDataPos; offset += segmentDataPos; return(page); }