Changed the buffer type to u8 as the data returned by WinMM is unsigned.
Added a double buffer system which reduces crackling noticeably.
This commit is contained in:
parent
7b0bddf64b
commit
64a4300ba2
|
@ -19,8 +19,11 @@
|
|||
|
||||
BOOL Mic_Inited = FALSE;
|
||||
|
||||
s8 Mic_Buffer[MIC_BUFSIZE];
|
||||
u8 Mic_TempBuf[MIC_BUFSIZE];
|
||||
u8 Mic_Buffer[2][MIC_BUFSIZE];
|
||||
u16 Mic_BufPos;
|
||||
u8 Mic_WriteBuf;
|
||||
u8 Mic_PlayBuf;
|
||||
|
||||
HWAVEIN waveIn;
|
||||
WAVEHDR waveHdr;
|
||||
|
@ -37,6 +40,9 @@ static int CALLBACK waveInProc(HWAVEIN wavein, UINT msg, DWORD instance, DWORD p
|
|||
{
|
||||
lpWaveHdr = (LPWAVEHDR)param1;
|
||||
|
||||
memcpy(Mic_Buffer[Mic_WriteBuf], lpWaveHdr->lpData, MIC_BUFSIZE);
|
||||
Mic_WriteBuf ^= 1;
|
||||
|
||||
hr = waveInAddBuffer(waveIn, lpWaveHdr, sizeof(WAVEHDR));
|
||||
if(hr != MMSYSERR_NOERROR)
|
||||
return 1;
|
||||
|
@ -55,9 +61,14 @@ BOOL Mic_Init()
|
|||
HRESULT hr;
|
||||
WAVEFORMATEX wfx;
|
||||
|
||||
memset(Mic_Buffer, 0, MIC_BUFSIZE);
|
||||
memset(Mic_TempBuf, 0, MIC_BUFSIZE);
|
||||
memset(Mic_Buffer[0], 0, MIC_BUFSIZE);
|
||||
memset(Mic_Buffer[1], 0, MIC_BUFSIZE);
|
||||
Mic_BufPos = 0;
|
||||
|
||||
Mic_WriteBuf = 0;
|
||||
Mic_PlayBuf = 1;
|
||||
|
||||
memset(&wfx, 0, sizeof(wfx));
|
||||
wfx.cbSize = 0;
|
||||
wfx.wFormatTag = WAVE_FORMAT_PCM;
|
||||
|
@ -71,7 +82,7 @@ BOOL Mic_Init()
|
|||
MIC_CHECKERR(hr)
|
||||
|
||||
memset(&waveHdr, 0, sizeof(waveHdr));
|
||||
waveHdr.lpData = (LPSTR)Mic_Buffer;
|
||||
waveHdr.lpData = (LPSTR)Mic_TempBuf;
|
||||
waveHdr.dwBufferLength = MIC_BUFSIZE;
|
||||
|
||||
hr = waveInPrepareHeader(waveIn, &waveHdr, sizeof(WAVEHDR));
|
||||
|
@ -92,8 +103,13 @@ void Mic_Reset()
|
|||
if(!Mic_Inited)
|
||||
return;
|
||||
|
||||
memset(Mic_Buffer, 0, MIC_BUFSIZE);
|
||||
memset(Mic_TempBuf, 0, MIC_BUFSIZE);
|
||||
memset(Mic_Buffer[0], 0, MIC_BUFSIZE);
|
||||
memset(Mic_Buffer[1], 0, MIC_BUFSIZE);
|
||||
Mic_BufPos = 0;
|
||||
|
||||
Mic_WriteBuf = 0;
|
||||
Mic_PlayBuf = 1;
|
||||
}
|
||||
|
||||
void Mic_DeInit()
|
||||
|
@ -112,7 +128,7 @@ u8 Mic_ReadSample()
|
|||
if(!Mic_Inited)
|
||||
return 0;
|
||||
|
||||
u8 tmp = (u8)Mic_Buffer[Mic_BufPos >> 1];
|
||||
u8 tmp = Mic_Buffer[Mic_PlayBuf][Mic_BufPos >> 1];
|
||||
u8 ret;
|
||||
|
||||
if(Mic_BufPos & 0x1)
|
||||
|
@ -125,7 +141,11 @@ u8 Mic_ReadSample()
|
|||
}
|
||||
|
||||
Mic_BufPos++;
|
||||
Mic_BufPos %= (MIC_BUFSIZE << 1);
|
||||
if(Mic_BufPos >= (MIC_BUFSIZE << 1))
|
||||
{
|
||||
Mic_BufPos = 0;
|
||||
Mic_PlayBuf ^= 1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue