Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }