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); } }
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); } }