/// <summary> /// Loads the first meta data block found on the stream (first byte is supposed to be the start of the meta data block)... the stream will be forwarded to the start /// of the next meta data block (or the start of the audio frames) /// </summary> /// <param name="data"></param> public static MetadataBlock Create(Stream data) { // Step 1: Get header byte[] headerData = new byte[4]; // always 4 bytes data.Read(headerData, 0, 4); MetadataBlockHeader header = new MetadataBlockHeader(headerData); // Step 2: Get instance of meta data block by type MetadataBlock metaDataBlock = GetInstanceByBlockType(header.Type); if (metaDataBlock != null) { metaDataBlock.header = header; // Step 3: Read block of meta data (according to header) byte[] blockData = new byte[header.MetaDataBlockLength]; data.Read(blockData, 0, (Int32)header.MetaDataBlockLength); // Step 4: Load the meta data into the meta data block instance metaDataBlock.LoadBlockData(blockData); } // Step 5: Return Meta Data Block... return(metaDataBlock); }
protected void ReadMetadata() { bool foundStreamInfo = false; MetadataBlock lastMetaDataBlock = null; do { lastMetaDataBlock = MetadataBlock.Create(this.dataStream); this.Metadata.Add(lastMetaDataBlock); switch (lastMetaDataBlock.Header.Type) { case MetadataBlockHeader.MetadataBlockType.StreamInfo: foundStreamInfo = true; this.streamInfo = (StreamInfo)lastMetaDataBlock; break; case MetadataBlockHeader.MetadataBlockType.Application: this.applicationInfo = (ApplicationInfo)lastMetaDataBlock; break; case MetadataBlockHeader.MetadataBlockType.CueSheet: this.cueSheet = (CueSheet)lastMetaDataBlock; break; case MetadataBlockHeader.MetadataBlockType.Seektable: this.seekTable = (SeekTable)lastMetaDataBlock; break; case MetadataBlockHeader.MetadataBlockType.VorbisComment: this.vorbisComment = (VorbisComment)lastMetaDataBlock; break; case MetadataBlockHeader.MetadataBlockType.Padding: this.padding = (Padding)lastMetaDataBlock; break; } } while (!lastMetaDataBlock.Header.IsLastMetaDataBlock); if (!foundStreamInfo) { throw new Exception("Stream Info missing"); } //throw new Exceptions.FlacLibSharpStreamInfoMissing(); // Remember where the frame data starts frameStart = this.dataStream.Position; }