public static TrackInfo ReadBfstm(BinaryReader reader) { var info = new TrackInfo(); int baseOffset = (int)reader.BaseStream.Position; var table = new ReferenceTable(reader, baseOffset); foreach (Reference trackInfo in table.References) { reader.BaseStream.Position = trackInfo.AbsoluteOffset; var track = new AudioTrack(); track.Volume = reader.ReadByte(); track.Panning = reader.ReadByte(); track.SurroundPanning = reader.ReadByte(); track.Flags = reader.ReadByte(); var trackRef = new Reference(reader, trackInfo.AbsoluteOffset); reader.BaseStream.Position = trackRef.AbsoluteOffset; track.ChannelCount = reader.ReadInt32(); track.ChannelLeft = reader.ReadByte(); track.ChannelRight = reader.ReadByte(); info.Tracks.Add(track); } return(info); }
public static ChannelInfo ReadBfstm(BinaryReader reader) { var info = new ChannelInfo(); int baseOffset = (int)reader.BaseStream.Position; var table = new ReferenceTable(reader, baseOffset); foreach (Reference channelInfo in table.References) { reader.BaseStream.Position = channelInfo.AbsoluteOffset; if (channelInfo.IsType(ReferenceType.WaveChannelInfo)) { var audioData = new Reference(reader); info.WaveAudioOffsets.Add(audioData.Offset); } var adpcmInfo = new Reference(reader, channelInfo.AbsoluteOffset); if (adpcmInfo.IsType(ReferenceType.GcAdpcmInfo)) { reader.BaseStream.Position = adpcmInfo.AbsoluteOffset; var channel = new GcAdpcmChannelInfo { Coefs = Enumerable.Range(0, 16).Select(x => reader.ReadInt16()).ToArray(), Start = new GcAdpcmContext(reader), Loop = new GcAdpcmContext(reader) }; info.Channels.Add(channel); } } return(info); }