public bool Read(BinaryReader source, AudioDataManager.SizeInfo sizeInfo, MetaDataIO.ReadTagParams readTagParams) { this.sizeInfo = sizeInfo; bool result = false; resetData(); source.BaseStream.Seek(0, SeekOrigin.Begin); if (DSD_ID.Equals(Utils.Latin1Encoding.GetString(source.ReadBytes(4)))) { source.BaseStream.Seek(16, SeekOrigin.Current); // Chunk size and file size id3v2Offset = source.ReadInt64(); if (FMT_ID.Equals(Utils.Latin1Encoding.GetString(source.ReadBytes(4)))) { source.BaseStream.Seek(8, SeekOrigin.Current); // Chunk size formatVersion = source.ReadInt32(); if (formatVersion > 1) { LogDelegator.GetLogDelegate()(Log.LV_ERROR, "DSF format version " + formatVersion + " not supported"); return(result); } isValid = true; source.BaseStream.Seek(8, SeekOrigin.Current); // Format ID (4), Channel type (4) uint channels = source.ReadUInt32(); switch (channels) { case 1: channelsArrangement = MONO; break; case 2: channelsArrangement = STEREO; break; case 3: channelsArrangement = ISO_3_0_0; break; case 4: channelsArrangement = QUAD; break; case 5: channelsArrangement = LRCLFE; break; case 6: channelsArrangement = ISO_3_2_0; break; case 7: channelsArrangement = ISO_3_2_1; break; default: channelsArrangement = UNKNOWN; break; } sampleRate = source.ReadUInt32(); bits = source.ReadUInt32(); ulong sampleCount = source.ReadUInt64(); duration = (double)sampleCount * 1000.0 / sampleRate; bitrate = Math.Round(((double)(sizeInfo.FileSize - source.BaseStream.Position)) * 8 / duration); //time to calculate average bitrate result = true; } // Load tag if exists if (id3v2Offset > 0) { if (readTagParams.PrepareForWriting) { id3v2StructureHelper.AddZone(id3v2Offset, (int)(source.BaseStream.Length - id3v2Offset)); id3v2StructureHelper.AddSize(12, source.BaseStream.Length); id3v2StructureHelper.AddIndex(20, id3v2Offset); } } else { id3v2Offset = 0; // Switch status to "tried to read, but nothing found" if (readTagParams.PrepareForWriting) { // Add EOF zone for future tag writing id3v2StructureHelper.AddZone(source.BaseStream.Length, 0); id3v2StructureHelper.AddSize(12, source.BaseStream.Length); id3v2StructureHelper.AddIndex(20, source.BaseStream.Length); } } } return(result); }
public Boolean Read(BinaryReader source, SizeInfo sizeInfo, MetaDataIO.ReadTagParams readTagParams) { this.sizeInfo = sizeInfo; var result = false; resetData(); source.BaseStream.Seek(0, SeekOrigin.Begin); if (DSD_ID.Equals(Utils.Latin1Encoding.GetString(source.ReadBytes(4)))) { source.BaseStream.Seek(16, SeekOrigin.Current); // Chunk size and file size id3v2Offset = source.ReadInt64(); if (FMT_ID.Equals(Utils.Latin1Encoding.GetString(source.ReadBytes(4)))) { source.BaseStream.Seek(8, SeekOrigin.Current); // Chunk size formatVersion = source.ReadInt32(); if (formatVersion > 1) { LogDelegator.GetLogDelegate()(Log.LV_ERROR, "DSF format version " + formatVersion + " not supported"); return(result); } isValid = true; source.BaseStream.Seek(8, SeekOrigin.Current); // Format ID (4), Channel type (4) channels = source.ReadUInt32(); sampleRate = source.ReadUInt32(); bits = source.ReadUInt32(); var sampleCount = source.ReadUInt64(); duration = (Double)sampleCount * 1000.0 / sampleRate; bitrate = Math.Round(((Double)(sizeInfo.FileSize - source.BaseStream.Position)) * 8 / duration); //time to calculate average bitrate result = true; } // Load tag if exists if (id3v2Offset > 0) { if (readTagParams.PrepareForWriting) { id3v2StructureHelper.AddZone(id3v2Offset, (Int32)(source.BaseStream.Length - id3v2Offset)); id3v2StructureHelper.AddSize(12, source.BaseStream.Length); id3v2StructureHelper.AddIndex(20, id3v2Offset); } } else { id3v2Offset = 0; // Switch status to "tried to read, but nothing found" if (readTagParams.PrepareForWriting) { // Add EOF zone for future tag writing id3v2StructureHelper.AddZone(source.BaseStream.Length, 0); id3v2StructureHelper.AddSize(12, source.BaseStream.Length); id3v2StructureHelper.AddIndex(20, source.BaseStream.Length); } } } return(result); }