示例#1
0
        private void WriteHeadBlock3(BinaryWriter writer)
        {
            writer.Write((byte)ChannelCount);
            writer.Write((byte)0);  //padding
            writer.Write((short)0); //padding

            int baseOffset      = HeadBlockTableSize + HeadBlock1Size + HeadBlock2Size + 4;
            int offsetTableSize = ChannelCount * 8;

            for (int i = 0; i < ChannelCount; i++)
            {
                writer.Write(OffsetMarker);
                writer.Write(baseOffset + offsetTableSize + ChannelInfoSize * i);
            }

            for (int i = 0; i < ChannelCount; i++)
            {
                writer.Write(OffsetMarker);
                if (Codec != NwCodec.GcAdpcm)
                {
                    writer.Write(0);
                    continue;
                }

                GcAdpcmChannel channel     = Adpcm.Channels[i];
                GcAdpcmContext loopContext = Adpcm.Looping ? channel.LoopContext : channel.StartContext;

                writer.Write(baseOffset + offsetTableSize + ChannelInfoSize * i + 8);
                writer.Write(channel.Coefs.ToByteArray(Endianness.BigEndian));
                writer.Write(channel.Gain);
                channel.StartContext.Write(writer);
                loopContext.Write(writer);
                writer.Write((short)0);
            }
        }
示例#2
0
        private void WriteInfoBlock3(BinaryWriter writer)
        {
            int channelTableSize = 4 + 8 * ChannelCount;
            int trackTableSize   = IncludeTrackInformation ? 0x14 * TrackCount : 0;

            writer.Write(ChannelCount);
            for (int i = 0; i < ChannelCount; i++)
            {
                writer.Write((short)ReferenceType.ChannelInfo);
                writer.Write((short)0);
                writer.Write(channelTableSize + trackTableSize + 8 * i);
            }

            if (IncludeTrackInformation && Tracks != null)
            {
                foreach (AudioTrack track in Tracks)
                {
                    writer.Write((byte)track.Volume);
                    writer.Write((byte)track.Panning);
                    writer.Write((short)0);
                    writer.Write((short)ReferenceType.ByteTable);
                    writer.Write((short)0);
                    writer.Write(0xc);
                    writer.Write(track.ChannelCount);
                    writer.Write((byte)track.ChannelLeft);
                    writer.Write((byte)track.ChannelRight);
                    writer.Write((short)0);
                }
            }

            int channelTable2Size = 8 * ChannelCount;

            for (int i = 0; i < ChannelCount; i++)
            {
                if (Codec == NwCodec.GcAdpcm)
                {
                    writer.Write((short)ReferenceType.GcAdpcmInfo);
                    writer.Write((short)0);
                    writer.Write(channelTable2Size - 8 * i + ChannelInfoSize * i);
                }
                else
                {
                    writer.Write(0);
                    writer.Write(-1);
                }
            }

            if (Codec != NwCodec.GcAdpcm)
            {
                return;
            }

            foreach (var channel in Adpcm.Channels)
            {
                GcAdpcmContext loopContext = Adpcm.Looping ? channel.LoopContext : channel.StartContext;

                writer.Write(channel.Coefs.ToByteArray(Endianness));
                channel.StartContext.Write(writer);
                loopContext.Write(writer);
                writer.Write((short)0);
            }
        }