Skip to content

Commit 5e4886a

Browse files
committed
Set BKHD padding upon serialization to properly align DATA chunk
1 parent d607bf1 commit 5e4886a

File tree

3 files changed

+71
-0
lines changed

3 files changed

+71
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
namespace ME3Tweaks.Wwiser.Tests.FormatTests;
2+
3+
public class BankHeaderPaddingTests
4+
{
5+
[TestCase(8)]
6+
[TestCase(24)]
7+
[TestCase(0x158)]
8+
public void DataProperlyAligned_PaddingIsZero(long dataOffset)
9+
{
10+
var padding = new BankHeaderPadding();
11+
padding.SetPadding(dataOffset);
12+
13+
Assert.That(padding.Padding.Length, Is.EqualTo(0));
14+
}
15+
16+
[TestCase(0, 8)]
17+
[TestCase(4, 4)]
18+
[TestCase(33, 7)]
19+
public void DataNotAligned_PaddingAlignsProperly(long dataOffset, long expectedPadding)
20+
{
21+
var padding = new BankHeaderPadding();
22+
padding.SetPadding(dataOffset);
23+
24+
Assert.That(padding.Padding.Length, Is.LessThanOrEqualTo(8));
25+
Assert.That(padding.Padding.Length, Is.EqualTo(expectedPadding));
26+
}
27+
28+
[TestCase(15, 9)]
29+
[TestCase(12, 12)]
30+
[TestCase(0x15E, 10)]
31+
public void DataNotAligned_PaddingProperlyOffsetBy8(long dataOffset, long expectedPadding)
32+
{
33+
var padding = new BankHeaderPadding();
34+
padding.SetPadding(dataOffset);
35+
36+
Assert.That(padding.Padding.Length, Is.GreaterThan(8));
37+
Assert.That(padding.Padding.Length, Is.EqualTo(expectedPadding));
38+
}
39+
}

ME3Tweaks.Wwiser/Model/BankHeaderChunk.cs

+15
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,21 @@ public void Deserialize(Stream stream, Endianness endianness, BinarySerializatio
118118
<= 141 => chunkSize - 0x14,
119119
_ => chunkSize - 0x14 - 0x04 - 0x10
120120
};
121+
122+
/// <summary>
123+
/// Sets the necessary padding for the DATA chunk. DATA must start at a multiple of 16 bytes + 8. IE 8, 24, 40, etc
124+
/// </summary>
125+
/// <param name="dataChunkOffset">Initial offset of the DATA chunk</param>
126+
public void SetPadding(long dataChunkOffset)
127+
{
128+
var initAlignment = dataChunkOffset % 16;
129+
Padding = initAlignment switch
130+
{
131+
< 8 => new byte[8 - initAlignment],
132+
> 8 => new byte[8 + (16 - initAlignment)],
133+
_ => Array.Empty<byte>()
134+
};
135+
}
121136
}
122137

123138
[Flags]

ME3Tweaks.Wwiser/WwiseBankParser.cs

+17
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,8 @@ public async Task SerializeToAsync(Stream stream)
153153
{
154154
throw new InvalidOperationException("Cannot serialize a null WwiseBank");
155155
}
156+
157+
SetBankHeaderPadding();
156158
await _serializer.SerializeAsync(stream,WwiseBank.ToModel(), CreateSerializationContext());
157159
}
158160

@@ -162,9 +164,24 @@ public void SerializeTo(Stream stream)
162164
{
163165
throw new InvalidOperationException("Cannot serialize a null WwiseBank");
164166
}
167+
168+
SetBankHeaderPadding();
165169
_serializer.Serialize(stream,WwiseBank.ToModel(), CreateSerializationContext());
166170
}
167171

172+
private void SetBankHeaderPadding()
173+
{
174+
if (WwiseBank?.DATA is not null)
175+
{
176+
var context = CreateSerializationContext();
177+
var bkhdSize= _serializer.SizeOf(WwiseBank.BKHD, context);
178+
var didxSize = _serializer.SizeOf(WwiseBank.DIDX, context);
179+
var dataOffset = bkhdSize + didxSize;
180+
181+
WwiseBank.BKHD.Padding.SetPadding(dataOffset);
182+
}
183+
}
184+
168185
private BankSerializationContext CreateSerializationContext()
169186
{
170187
return new BankSerializationContext(Version: Version, UseModulator: false, UseFeedback: UseFeedback);

0 commit comments

Comments
 (0)