preliminary microphone code. requires an actual microphone. resulting audio is farty and blargy as fuck.

This commit is contained in:
StapleButter
2018-12-12 16:33:40 +01:00
parent 24d6bd2786
commit 758bed93bc
5 changed files with 108 additions and 5 deletions

View File

@ -109,6 +109,10 @@ bool Touching = false;
u32 KeyInputMask;
SDL_Joystick* Joystick;
const u32 kMicBufferSize = 2048; // must be power of two
s16 MicBuffer[kMicBufferSize];
u32 MicBufferReadPos, MicBufferWritePos;
void SetupScreenRects(int width, int height);
@ -147,7 +151,6 @@ void AudioCallback(void* data, Uint8* stream, int len)
// buffer length is 1024 samples
// which is 710 samples at the original sample rate
//SPU::ReadOutput((s16*)stream, len>>2);
s16 buf_in[710*2];
s16* buf_out = (s16*)stream;
@ -185,6 +188,23 @@ void AudioCallback(void* data, Uint8* stream, int len)
}
}
void MicCallback(void* data, Uint8* stream, int len)
{
s16* input = (s16*)stream;
len /= sizeof(s16);
if ((MicBufferWritePos + len) > kMicBufferSize)
{
u32 len1 = kMicBufferSize-MicBufferWritePos;
memcpy(&MicBuffer[MicBufferWritePos], &input[0], len1*sizeof(s16));
memcpy(&MicBuffer[0], &input[len1], (len-len1)*sizeof(s16));
}
else
memcpy(&MicBuffer[MicBufferWritePos], input, len*sizeof(s16));
MicBufferWritePos += len;
MicBufferWritePos &= (kMicBufferSize-1);
}
int EmuThreadFunc(void* burp)
{
NDS::Init();
@ -254,6 +274,20 @@ int EmuThreadFunc(void* burp)
}
NDS::SetKeyMask(keymask & joymask);
// microphone input
if ((MicBufferReadPos + 735) > kMicBufferSize)
{
s16 tmp[735];
u32 len1 = kMicBufferSize-MicBufferReadPos;
memcpy(&tmp[0], &MicBuffer[MicBufferReadPos], len1*sizeof(s16));
memcpy(&tmp[len1], &MicBuffer[0], (735-len1)*sizeof(s16));
NDS::MicInputFrame(tmp, 735);
}
else
NDS::MicInputFrame(&MicBuffer[MicBufferReadPos], 735);
MicBufferReadPos += 735;
MicBufferReadPos &= (kMicBufferSize-1);
// emulate
u32 nlines = NDS::RunFrame();
@ -1594,6 +1628,26 @@ int main(int argc, char** argv)
SDL_PauseAudioDevice(audio, 0);
}
memset(&whatIwant, 0, sizeof(SDL_AudioSpec));
whatIwant.freq = 44100;
whatIwant.format = AUDIO_S16LSB;
whatIwant.channels = 1;
whatIwant.samples = 1024;
whatIwant.callback = MicCallback;
audio = SDL_OpenAudioDevice(NULL, 1, &whatIwant, &whatIget, 0);
if (!audio)
{
printf("Mic init failed: %s\n", SDL_GetError());
}
else
{
SDL_PauseAudioDevice(audio, 0);
}
memset(MicBuffer, 0, sizeof(MicBuffer));
MicBufferReadPos = 0;
MicBufferWritePos = 0;
// TODO: support more joysticks
if (SDL_NumJoysticks() > 0)
Joystick = SDL_JoystickOpen(0);