Skip to content

Commit

Permalink
ParseSoundBank: Use Offset where possible.
Browse files Browse the repository at this point in the history
This is one step in supporting older versions.
  • Loading branch information
alesliehughes authored and flibitijibibo committed Jun 28, 2023
1 parent 58cf606 commit a011a30
Showing 1 changed file with 46 additions and 31 deletions.
77 changes: 46 additions & 31 deletions src/FACT_internal.c
Original file line number Diff line number Diff line change
Expand Up @@ -2616,6 +2616,7 @@ uint32_t FACT_INTERNAL_ParseSoundBank(

/* WaveBank Name data */
FAudio_assert((ptr - start) == wavebankNameOffset);
ptr = start + wavebankNameOffset;
sb->wavebankNames = (char**) pEngine->pMalloc(
sizeof(char*) *
sb->wavebankCount
Expand Down Expand Up @@ -2818,52 +2819,63 @@ uint32_t FACT_INTERNAL_ParseSoundBank(

/* Simple Cue data */
FAudio_assert(cueSimpleCount == 0 || (ptr - start) == cueSimpleOffset);
for (i = 0; i < cueSimpleCount; i += 1, cur += 1)
if (cueSimpleCount > 0)
{
sb->cues[cur].flags = read_u8(&ptr);
sb->cues[cur].sbCode = read_u32(&ptr, se);
sb->cues[cur].transitionOffset = 0;
sb->cues[cur].instanceLimit = 0xFF;
sb->cues[cur].fadeInMS = 0;
sb->cues[cur].fadeOutMS = 0;
sb->cues[cur].maxInstanceBehavior = 0;
sb->cues[cur].instanceCount = 0;
ptr = start + cueSimpleOffset;

for (i = 0; i < cueSimpleCount; i += 1, cur += 1)
{
sb->cues[cur].flags = read_u8(&ptr);
sb->cues[cur].sbCode = read_u32(&ptr, se);
sb->cues[cur].transitionOffset = 0;
sb->cues[cur].instanceLimit = 0xFF;
sb->cues[cur].fadeInMS = 0;
sb->cues[cur].fadeOutMS = 0;
sb->cues[cur].maxInstanceBehavior = 0;
sb->cues[cur].instanceCount = 0;
}
}

/* Complex Cue data */
FAudio_assert(cueComplexCount == 0 || (ptr - start) == cueComplexOffset);
for (i = 0; i < cueComplexCount; i += 1, cur += 1)
if (cueComplexCount > 0)
{
sb->cues[cur].flags = read_u8(&ptr);
sb->cues[cur].sbCode = read_u32(&ptr, se);
sb->cues[cur].transitionOffset = read_u32(&ptr, se);
if (sb->cues[cur].transitionOffset == 0xFFFFFFFF)
{
/* FIXME: Why */
sb->cues[cur].transitionOffset = 0;
}
sb->cues[cur].instanceLimit = read_u8(&ptr);
sb->cues[cur].fadeInMS = read_u16(&ptr, se);
sb->cues[cur].fadeOutMS = read_u16(&ptr, se);
sb->cues[cur].maxInstanceBehavior = read_u8(&ptr) >> 3;
sb->cues[cur].instanceCount = 0;
ptr = start + cueComplexOffset;

if (!(sb->cues[cur].flags & 0x04))
{
/* FIXME: Is this the only way to get this...? */
sb->variationCount += 1;
}
if (sb->cues[cur].transitionOffset > 0)
for (i = 0; i < cueComplexCount; i += 1, cur += 1)
{
/* FIXME: Is this the only way to get this...? */
sb->transitionCount += 1;
sb->cues[cur].flags = read_u8(&ptr);
sb->cues[cur].sbCode = read_u32(&ptr, se);
sb->cues[cur].transitionOffset = read_u32(&ptr, se);
if (sb->cues[cur].transitionOffset == 0xFFFFFFFF)
{
/* FIXME: Why */
sb->cues[cur].transitionOffset = 0;
}
sb->cues[cur].instanceLimit = read_u8(&ptr);
sb->cues[cur].fadeInMS = read_u16(&ptr, se);
sb->cues[cur].fadeOutMS = read_u16(&ptr, se);
sb->cues[cur].maxInstanceBehavior = read_u8(&ptr) >> 3;
sb->cues[cur].instanceCount = 0;

if (!(sb->cues[cur].flags & 0x04))
{
/* FIXME: Is this the only way to get this...? */
sb->variationCount += 1;
}
if (sb->cues[cur].transitionOffset > 0)
{
/* FIXME: Is this the only way to get this...? */
sb->transitionCount += 1;
}
}
}

/* Variation data */
if (sb->variationCount > 0)
{
FAudio_assert((ptr - start) == variationOffset);
ptr = start + variationOffset;
sb->variations = (FACTVariationTable*) pEngine->pMalloc(
sizeof(FACTVariationTable) *
sb->variationCount
Expand Down Expand Up @@ -2949,6 +2961,7 @@ uint32_t FACT_INTERNAL_ParseSoundBank(
if (sb->transitionCount > 0)
{
FAudio_assert((ptr - start) == transitionOffset);
ptr = start + transitionOffset;
sb->transitions = (FACTTransitionTable*) pEngine->pMalloc(
sizeof(FACTTransitionTable) *
sb->transitionCount
Expand Down Expand Up @@ -2996,13 +3009,15 @@ uint32_t FACT_INTERNAL_ParseSoundBank(
if (cueNameIndexOffset != -1)
{
FAudio_assert((ptr - start) == cueNameIndexOffset);
ptr = start + cueNameIndexOffset;
ptr += 6 * sb->cueCount; /* FIXME: index as assert value? */
}

/* Cue Name data */
if (cueNameOffset != -1)
{
FAudio_assert((ptr - start) == cueNameOffset);
ptr = start + cueNameOffset;
sb->cueNames = (char**) pEngine->pMalloc(
sizeof(char*) *
sb->cueCount
Expand Down

0 comments on commit a011a30

Please sign in to comment.