コード例 #1
0
        /// <summary>
        /// Returns a VBRData structure from an index in a byte array
        /// </summary>
        /// <param name="index">Index</param>
        /// <param name="data">Byte array</param>
        /// <returns>VBRData structure</returns>
        private static VBRData FindVBR(int index, Byte[] data)
        {
            VBRData result;

            String id = String.Format("{0}{1}{2}{3}", (Char)data[index], (Char)data[index + 1], (Char)data[index + 2], (Char)data[index + 3]);

            // Check for VBR header at given position
            if (id == VBRHeaderID.Xing)
            {
                result = GetXingInfo(index, data);
            }
            else if (id == VBRHeaderID.FhG)
            {
                result = GetFhGInfo(index, data);
            }
            else
            {
                result = new VBRData();
            }

            return(result);
        }
コード例 #2
0
        /// <summary>
        /// Returns VBRData structure from an FhG info tag
        /// </summary>
        /// <param name="index">Index in array</param>
        /// <param name="data">Data byte array</param>
        /// <returns>VBRData structure</returns>
        private static VBRData GetFhGInfo(int index, Byte[] data)
        {
            VBRData result = new VBRData();

            // Extract FhG VBR info at given position

            result.Found = true;
            result.ID    = Encoding.ASCII.GetBytes(VBRHeaderID.FhG);
            result.Scale = data[index + 9];
            result.Bytes =
                data[index + 10] * 0x1000000 +
                data[index + 11] * 0x10000 +
                data[index + 12] * 0x100 +
                data[index + 13];
            result.Frames =
                data[index + 14] * 0x1000000 +
                data[index + 15] * 0x10000 +
                data[index + 16] * 0x100 +
                data[index + 17];

            return(result);
        }
コード例 #3
0
        /// <summary>
        /// Find a valid MP3 frame in a byte array.  Sets "m_Frame.Found = true"
        /// </summary>
        /// <param name="data">Byte array of data from MP3 file</param>
        /// <param name="vbrHeader">Method sets this variable to a VBRData struct, if frame found</param>
        private void FindFrame(Byte[] data, ref VBRData vbrHeader)
        {
            Byte[] headerData = new Byte[4];

            // Search for valid frame
            Buffer.BlockCopy(data, 0, headerData, 0, 4);

            int size = data.Length - 4;

            for (int i = 0; i < size; i++)
            {
                // Decode data if frame header found
                if (IsFrameHeader(headerData))
                {
                    DecodeHeader(headerData);
                    int nextHeader = i + GetFrameLength(m_Frame);
                    if (nextHeader < size)
                    {
                        // Check for next frame and try to find VBR header
                        if (ValidFrameAt(nextHeader, data))
                        {
                            m_Frame.Found    = true;
                            m_Frame.Position = i;
                            m_Frame.Size     = GetFrameLength(m_Frame);
                            m_Frame.Xing     = IsXing(i + headerData.Length, data);
                            vbrHeader        = FindVBR(i + GetVBRFrameOffset(m_Frame), data);
                            break;
                        }
                    }
                }

                // Prepare next data block
                headerData[0] = headerData[1];
                headerData[1] = headerData[2];
                headerData[2] = headerData[3];
                headerData[3] = data[4 + i];
            }
        }