sm64coopdx/tools/sdk-tools/adpcm/util.c

107 lines
2 KiB
C
Raw Permalink Normal View History

2019-08-25 04:46:40 +00:00
#include <stdio.h>
#include <stdlib.h>
#include "vadpcm.h"
static s32 input_word = 0;
static s32 in_bit_pos = -1;
static u32 getshort(FILE *ifile)
{
u32 c1;
u32 c2;
if ((c1 = (u32)getc(ifile)) == (u32)-1)
2019-08-25 04:46:40 +00:00
{
return 0;
}
if ((c2 = (u32)getc(ifile)) == (u32)-1)
2019-08-25 04:46:40 +00:00
{
return 0;
}
return (c1 << 8) | c2;
}
u32 readbits(u32 nbits, FILE *ifile)
{
u32 c;
u32 b;
u32 left;
u32 mask;
if (nbits <= (u32)(in_bit_pos + 1))
2019-08-25 04:46:40 +00:00
{
mask = (1U << nbits) - 1;
b = ((u32) input_word >> (in_bit_pos - nbits + 1)) & mask;
in_bit_pos -= nbits;
if (in_bit_pos < 0)
{
c = getshort(ifile);
input_word = c;
in_bit_pos = 15;
}
return b;
}
else
{
b = input_word & ((1U << (in_bit_pos + 1)) - 1);
left = nbits - in_bit_pos - 1;
c = getshort(ifile);
input_word = c;
in_bit_pos = 15;
b = readbits(left, ifile) | (b << left);
return b;
}
}
char *ReadPString(FILE *ifile)
{
u8 c;
char *st;
fread(&c, 1, 1, ifile);
st = malloc(c + 1);
fread(st, c, 1, ifile);
st[c] = '\0';
if ((c & 1) == 0)
{
fread(&c, 1, 1, ifile);
}
return st;
}
s32 lookupMarker(u32 *sample, s16 loopPoint, Marker *markers, s32 nmarkers)
{
s32 i;
for (i = 0; i < nmarkers; i++)
{
if (markers[i].MarkerID == loopPoint)
{
*sample = (markers[i].positionH << 16) + markers[i].positionL;
return 0;
}
}
return 1;
}
ALADPCMloop *readlooppoints(FILE *ifile, s16 *nloops)
{
s32 i;
ALADPCMloop *al;
fread(nloops, sizeof(s16), 1, ifile);
BSWAP16(*nloops)
al = malloc(*nloops * sizeof(ALADPCMloop));
for (i = 0; i < *nloops; i++)
{
fread(&al[i], sizeof(ALADPCMloop), 1, ifile);
BSWAP32(al[i].start)
BSWAP32(al[i].end)
BSWAP32(al[i].count)
BSWAP16_MANY(al[i].state, 16)
}
return al;
}