/// <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); }
/// <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); }
/// <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]; } }