proof-of-concept code for feeding a WAV to microphone input.
this eventually needs a proper UI.
This commit is contained in:
parent
4d71da04ec
commit
ef79cc06f3
|
@ -113,6 +113,9 @@ const u32 kMicBufferSize = 2048; // must be power of two
|
||||||
s16 MicBuffer[kMicBufferSize];
|
s16 MicBuffer[kMicBufferSize];
|
||||||
u32 MicBufferReadPos, MicBufferWritePos;
|
u32 MicBufferReadPos, MicBufferWritePos;
|
||||||
|
|
||||||
|
u32 MicWavLength;
|
||||||
|
s16* MicWavBuffer;
|
||||||
|
|
||||||
|
|
||||||
void SetupScreenRects(int width, int height);
|
void SetupScreenRects(int width, int height);
|
||||||
|
|
||||||
|
@ -140,6 +143,75 @@ bool LocalFileExists(const char* name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MicLoadWav(char* name)
|
||||||
|
{
|
||||||
|
SDL_AudioSpec format;
|
||||||
|
memset(&format, 0, sizeof(SDL_AudioSpec));
|
||||||
|
|
||||||
|
u8* buf;
|
||||||
|
u32 len;
|
||||||
|
SDL_LoadWAV(name, &format, &buf, &len);
|
||||||
|
|
||||||
|
const int dstfreq = 44100;
|
||||||
|
|
||||||
|
if (format.format == AUDIO_S16 || format.format == AUDIO_U16)
|
||||||
|
{
|
||||||
|
int srcinc = format.channels;
|
||||||
|
len /= 2;
|
||||||
|
|
||||||
|
MicWavLength = (len * dstfreq) / format.freq;
|
||||||
|
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];
|
||||||
|
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;
|
||||||
|
|
||||||
|
MicWavLength = (len * dstfreq) / format.freq;
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void UpdateWindowTitle(void* data)
|
void UpdateWindowTitle(void* data)
|
||||||
{
|
{
|
||||||
uiWindowSetTitle(MainWindow, (const char*)data);
|
uiWindowSetTitle(MainWindow, (const char*)data);
|
||||||
|
@ -287,6 +359,18 @@ int EmuThreadFunc(void* burp)
|
||||||
NDS::MicInputFrame(&MicBuffer[MicBufferReadPos], 735);
|
NDS::MicInputFrame(&MicBuffer[MicBufferReadPos], 735);
|
||||||
MicBufferReadPos += 735;
|
MicBufferReadPos += 735;
|
||||||
MicBufferReadPos &= (kMicBufferSize-1);
|
MicBufferReadPos &= (kMicBufferSize-1);
|
||||||
|
/*if ((MicBufferReadPos + 735) > MicWavLength)
|
||||||
|
{
|
||||||
|
s16 tmp[735];
|
||||||
|
u32 len1 = MicWavLength-MicBufferReadPos;
|
||||||
|
memcpy(&tmp[0], &MicWavBuffer[MicBufferReadPos], len1*sizeof(s16));
|
||||||
|
memcpy(&tmp[len1], &MicWavBuffer[0], (735-len1)*sizeof(s16));
|
||||||
|
NDS::MicInputFrame(tmp, 735);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
NDS::MicInputFrame(&MicWavBuffer[MicBufferReadPos], 735);
|
||||||
|
MicBufferReadPos += 735;
|
||||||
|
MicBufferReadPos %= MicWavLength;*/
|
||||||
|
|
||||||
// emulate
|
// emulate
|
||||||
u32 nlines = NDS::RunFrame();
|
u32 nlines = NDS::RunFrame();
|
||||||
|
@ -1648,6 +1732,8 @@ int main(int argc, char** argv)
|
||||||
MicBufferReadPos = 0;
|
MicBufferReadPos = 0;
|
||||||
MicBufferWritePos = 0;
|
MicBufferWritePos = 0;
|
||||||
|
|
||||||
|
//MicLoadWav("blorp.wav");
|
||||||
|
|
||||||
// TODO: support more joysticks
|
// TODO: support more joysticks
|
||||||
if (SDL_NumJoysticks() > 0)
|
if (SDL_NumJoysticks() > 0)
|
||||||
Joystick = SDL_JoystickOpen(0);
|
Joystick = SDL_JoystickOpen(0);
|
||||||
|
|
Loading…
Reference in New Issue