public override bool ReadFromStream(FileStream fStream, bool throwExceptions) { /* +-----------------------------+ | Header (10 bytes) | +-----------------------------+ | Extended Header | | (variable length, OPTIONAL) | +-----------------------------+ | Frames (variable length) | +-----------------------------+ | Padding | | (variable length, OPTIONAL) | +-----------------------------+ | Footer (10 bytes, OPTIONAL) | +-----------------------------+ ID3v2/file identifier "ID3" ID3v2 version $04 00 ID3v2 flags %abcd0000 ID3v2 size 4 * %0xxxxxxx */ try { Clear(); Loaded = false; Active = false; Changed = false; Logger.Logger.WriteToLog(String.Format("Reading TAG v2 ...")); if (fStream.Length<HeaderByteLength) { throw new Exception(String.Format("File length < {0}",HeaderByteLength)); } OriginalHeader = new byte[HeaderByteLength]; fStream.Seek(0,0); fStream.Read(OriginalHeader,0,HeaderByteLength); byte[] id3tag2Indication = new byte[] {OriginalHeader[0],OriginalHeader[1],OriginalHeader[2]}; VersionMajor = OriginalHeader[3]; VersionRevision = OriginalHeader[4]; var totalTagSize = new byte[] {0,0,0,0}; for (var i=0;i<4;i++) totalTagSize[i] = OriginalHeader[6+i]; if (!IsValid) { Logger.Logger.WriteToLog("TAG v2 not found (or invalid header)"); return false; } TotalByteLength = Convert.ToInt32(TAG2Frame.MakeID3v2Size(totalTagSize,7)); if (FlagUnsynchronisation) { throw new Exception("TAG v2 Unsynchronisation not supported yet"); } if (FlagExtendedHeader) { throw new Exception("Extended header not supported yet"); } if (FlagFooter) { throw new Exception("Usage of footer - not supported yet"); } long actSize = 0; while(actSize<TotalByteLength-HeaderByteLength) { var frame = new TAG2Frame(); var ok = frame.ReadFromOpenedStream(fStream,VersionMajor,false); if (!ok) { //if (throwExceptions) throw new Exception("Error reading frame"); if (Frames.Count == 0) Logger.Logger.WriteToLog("First Invalid frame found"); break; } actSize+=TAG2Frame.HeaderByteLength+frame.Size; /* Logger.Logger.WriteToLog(String.Format("Adding frame {0}",frame.Name)); Logger.Logger.WriteToLog("Name:"+frame.Name); Logger.Logger.WriteToLog("Size:"+frame.Size); Logger.Logger.WriteToLog("Value:"+frame.Value); if (frame.Name != "APIC") Logger.Logger.WriteToLog("Data:"+TAG2Frame.ByteArrayToDecimalStrings(frame.OriginalData)); Logger.Logger.WriteToLog("-------------"); */ AddFrame(frame); } ParseBaseValues(); Logger.Logger.WriteToLog(String.Format("TAG found: (Title:{0}, Artist:{1}, ...)",Title,Artist)); Active = true; Loaded = true; Changed = false; return true; } catch (Exception ex) { Logger.Logger.WriteToLog(String.Format("Error while reading TAG v2"),ex); if (throwExceptions) throw; return false; } }