Example #1
0
        /// <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);
        }
Example #2
0
        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;
        }