factor duplicate code in micLoadWav(). also add support for all sorts of WAV formats SDL can support.
This commit is contained in:
parent
bba14b2bb0
commit
c7325469c2
|
@ -195,64 +195,67 @@ void micLoadWav(const char* name)
|
||||||
|
|
||||||
const u64 dstfreq = 44100;
|
const u64 dstfreq = 44100;
|
||||||
|
|
||||||
if (format.format == AUDIO_S16 || format.format == AUDIO_U16)
|
int srcinc = format.channels;
|
||||||
|
len /= ((SDL_AUDIO_BITSIZE(format.format) / 8) * srcinc);
|
||||||
|
|
||||||
|
micWavLength = (len * dstfreq) / format.freq;
|
||||||
|
if (micWavLength < 735) micWavLength = 735;
|
||||||
|
micWavBuffer = new s16[micWavLength];
|
||||||
|
|
||||||
|
float res_incr = len / (float)micWavLength;
|
||||||
|
float res_timer = 0;
|
||||||
|
int res_pos = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < micWavLength; i++)
|
||||||
{
|
{
|
||||||
int srcinc = format.channels;
|
u16 val;
|
||||||
len /= (2 * srcinc);
|
|
||||||
|
|
||||||
micWavLength = (len * dstfreq) / format.freq;
|
switch (SDL_AUDIO_BITSIZE(format.format))
|
||||||
if (micWavLength < 735) micWavLength = 735;
|
|
||||||
micWavBuffer = new s16[micWavLength];
|
|
||||||
|
|
||||||
float res_incr = len / (float)micWavLength;
|
|
||||||
float res_timer = 0;
|
|
||||||
int res_pos = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < micWavLength; i++)
|
|
||||||
{
|
{
|
||||||
u16 val = ((u16*)buf)[res_pos];
|
case 8:
|
||||||
if (SDL_AUDIO_ISUNSIGNED(format.format)) val ^= 0x8000;
|
val = buf[res_pos] << 8;
|
||||||
|
break;
|
||||||
|
|
||||||
micWavBuffer[i] = val;
|
case 16:
|
||||||
|
if (SDL_AUDIO_ISBIGENDIAN(format.format))
|
||||||
|
val = (buf[res_pos*2] << 8) | buf[res_pos*2 + 1];
|
||||||
|
else
|
||||||
|
val = (buf[res_pos*2 + 1] << 8) | buf[res_pos*2];
|
||||||
|
break;
|
||||||
|
|
||||||
res_timer += res_incr;
|
case 32:
|
||||||
while (res_timer >= 1.0)
|
if (SDL_AUDIO_ISFLOAT(format.format))
|
||||||
{
|
{
|
||||||
res_timer -= 1.0;
|
u32 rawval;
|
||||||
res_pos += srcinc;
|
if (SDL_AUDIO_ISBIGENDIAN(format.format))
|
||||||
|
rawval = (buf[res_pos*4] << 24) | (buf[res_pos*4 + 1] << 16) | (buf[res_pos*4 + 2] << 8) | buf[res_pos * 4 + 3];
|
||||||
|
else
|
||||||
|
rawval = (buf[res_pos*4 + 3] << 24) | (buf[res_pos*4 + 2] << 16) | (buf[res_pos*4 + 1] << 8) | buf[res_pos * 4];
|
||||||
|
|
||||||
|
float fval = *(float*)&rawval;
|
||||||
|
s32 ival = (s32)(fval * 0x8000);
|
||||||
|
ival = std::clamp(ival, -0x8000, 0x7FFF);
|
||||||
|
val = (s16)ival;
|
||||||
}
|
}
|
||||||
|
else if (SDL_AUDIO_ISBIGENDIAN(format.format))
|
||||||
|
val = (buf[res_pos*4] << 8) | buf[res_pos*4 + 1];
|
||||||
|
else
|
||||||
|
val = (buf[res_pos*4 + 3] << 8) | buf[res_pos*4 + 2];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SDL_AUDIO_ISUNSIGNED(format.format))
|
||||||
|
val ^= 0x8000;
|
||||||
|
|
||||||
|
micWavBuffer[i] = val;
|
||||||
|
|
||||||
|
res_timer += res_incr;
|
||||||
|
while (res_timer >= 1.0)
|
||||||
|
{
|
||||||
|
res_timer -= 1.0;
|
||||||
|
res_pos += srcinc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (format.format == AUDIO_S8 || format.format == AUDIO_U8)
|
|
||||||
{
|
|
||||||
int srcinc = format.channels;
|
|
||||||
len /= srcinc;
|
|
||||||
|
|
||||||
micWavLength = (len * dstfreq) / format.freq;
|
|
||||||
if (micWavLength < 735) micWavLength = 735;
|
|
||||||
micWavBuffer = new s16[micWavLength];
|
|
||||||
|
|
||||||
float res_incr = len / (float)micWavLength;
|
|
||||||
float res_timer = 0;
|
|
||||||
int res_pos = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < micWavLength; i++)
|
|
||||||
{
|
|
||||||
u16 val = buf[res_pos] << 8;
|
|
||||||
if (SDL_AUDIO_ISUNSIGNED(format.format)) val ^= 0x8000;
|
|
||||||
|
|
||||||
micWavBuffer[i] = val;
|
|
||||||
|
|
||||||
res_timer += res_incr;
|
|
||||||
while (res_timer >= 1.0)
|
|
||||||
{
|
|
||||||
res_timer -= 1.0;
|
|
||||||
res_pos += srcinc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
printf("bad WAV format %08X\n", format.format);
|
|
||||||
|
|
||||||
SDL_FreeWAV(buf);
|
SDL_FreeWAV(buf);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue