AWC/XML conversion bugfixes

This commit is contained in:
dexy 2020-02-11 00:15:57 +11:00
parent 6df258225e
commit 86d01a4528

View File

@ -306,7 +306,7 @@ namespace CodeWalker.GameFiles
hasUshorts = hasUshorts || stream.UnkUshort.HasValue; hasUshorts = hasUshorts || stream.UnkUshort.HasValue;
unkUshorts.Add(stream.UnkUshort ?? 0); unkUshorts.Add(stream.UnkUshort ?? 0);
if (MultiChannelFlag && (stream.StreamFormatChunk != null)) if (MultiChannelFlag && (stream.StreamFormatChunk != null) && (stream.Hash == 0))
{ {
MultiChannelSource = stream; MultiChannelSource = stream;
} }
@ -663,7 +663,7 @@ namespace CodeWalker.GameFiles
public void WriteXml(StringBuilder sb, int indent, string wavfolder) public void WriteXml(StringBuilder sb, int indent, string wavfolder)
{ {
AwcXml.StringTag(sb, indent, "Name", AwcXml.HashString(HashAdjusted)); AwcXml.StringTag(sb, indent, "Name", AwcXml.HashString(HashAdjusted));
if (StreamFormatChunk == null) //skip the wave file output for multichannel sources if (Hash != 0) //skip the wave file output for multichannel sources
{ {
var export = !string.IsNullOrEmpty(wavfolder); var export = !string.IsNullOrEmpty(wavfolder);
var fname = Name?.Replace("/", "")?.Replace("\\", "") ?? "0x0"; var fname = Name?.Replace("/", "")?.Replace("\\", "") ?? "0x0";
@ -921,6 +921,7 @@ namespace CodeWalker.GameFiles
var chansmpoffs = new List<int>(); var chansmpoffs = new List<int>();
for (int c = 0; c < chancount; c++) for (int c = 0; c < chancount; c++)
{ {
var chaninfo = chanlist[c];
var chandata = chandatas[c]; var chandata = chandatas[c];
var cdlen = chandata?.Length ?? 0; var cdlen = chandata?.Length ?? 0;
var totsmblockcount = (cdlen / 2048) + (((cdlen % 2048) != 0) ? 1 : 0); var totsmblockcount = (cdlen / 2048) + (((cdlen % 2048) != 0) ? 1 : 0);
@ -937,6 +938,7 @@ namespace CodeWalker.GameFiles
} }
chansmpoffs.Clear(); chansmpoffs.Clear();
var samplesrem = (int)chaninfo.Samples+1;
for (int i = 0; i < totsmblockcount; i++) for (int i = 0; i < totsmblockcount; i++)
{ {
@ -948,6 +950,7 @@ namespace CodeWalker.GameFiles
var blkstart = lgblockind * smblockcount; var blkstart = lgblockind * smblockcount;
var blk = streamblocks[lgblockind]; var blk = streamblocks[lgblockind];
var chan = new AwcStreamDataChannel(); var chan = new AwcStreamDataChannel();
var smpcnt = blkcnt * 4088;
var bytcnt = blkcnt * 2048; var bytcnt = blkcnt * 2048;
var srcoff = blkstart * 2048; var srcoff = blkstart * 2048;
var srccnt = Math.Min(bytcnt, cdlen - srcoff); var srccnt = Math.Min(bytcnt, cdlen - srcoff);
@ -955,12 +958,13 @@ namespace CodeWalker.GameFiles
Buffer.BlockCopy(chandata, srcoff, data, 0, srccnt); Buffer.BlockCopy(chandata, srcoff, data, 0, srccnt);
chan.Data = data; chan.Data = data;
chan.SampleOffsets = chansmpoffs.ToArray(); chan.SampleOffsets = chansmpoffs.ToArray();
chan.SampleCount = blkcnt * 4088; chan.SampleCount = Math.Min(smpcnt, samplesrem);
chan.BlockCount = blkcnt; chan.BlockCount = blkcnt;
chan.StartBlock = (c * smblockcount); chan.StartBlock = (c * smblockcount);
blk.Channels[c] = chan; blk.Channels[c] = chan;
chansmpoffs.Clear(); chansmpoffs.Clear();
samplesrem -= smpcnt;
} }
} }
@ -971,9 +975,22 @@ namespace CodeWalker.GameFiles
StreamFormatChunk.BlockCount = (uint)streamblocks.Count; StreamFormatChunk.BlockCount = (uint)streamblocks.Count;
if (SeekTableChunk != null) if (streams != null)
{ {
SeekTableChunk.SeekTable = seektable.ToArray(); foreach (var stream in streams)
{
if (stream.SeekTableChunk != null)
{
stream.SeekTableChunk.SeekTable = seektable.ToArray();
}
if (stream.StreamFormatChunk != null)
{
stream.StreamFormatChunk.BlockCount = StreamFormatChunk.BlockCount;
stream.StreamFormatChunk.BlockSize = StreamFormatChunk.BlockSize;
stream.StreamFormatChunk.ChannelCount = StreamFormatChunk.ChannelCount;
stream.StreamFormatChunk.Channels = StreamFormatChunk.Channels;
}
}
} }