protected override At9Structure ReadFile(Stream stream, bool readAudioData = true) { var structure = new At9Structure(); var parser = new RiffParser { ReadDataChunk = readAudioData }; parser.RegisterSubChunk("fact", At9FactChunk.ParseAt9); parser.RegisterSubChunk("data", At9DataChunk.ParseAt9); parser.FormatExtensibleParser = At9WaveExtensible.ParseAt9; parser.ParseRiff(stream); ValidateAt9File(parser); var fmt = parser.GetSubChunk <WaveFmtChunk>("fmt "); var ext = (At9WaveExtensible)fmt.Ext; var fact = parser.GetSubChunk <At9FactChunk>("fact"); var data = parser.GetSubChunk <At9DataChunk>("data"); var smpl = parser.GetSubChunk <WaveSmplChunk>("smpl"); structure.Config = new Atrac9Config(ext.ConfigData); structure.SampleCount = fact.SampleCount; structure.EncoderDelay = fact.EncoderDelaySamples; structure.Version = ext.VersionInfo; structure.AudioData = data.AudioData; structure.SuperframeCount = data.FrameCount; if (smpl?.Loops?.FirstOrDefault() != null) { structure.LoopStart = smpl.Loops[0].Start - structure.EncoderDelay; structure.LoopEnd = smpl.Loops[0].End - structure.EncoderDelay; structure.Looping = structure.LoopEnd > structure.LoopStart; } return(structure); }