音频信息的采集和播放,但是不可以播放
我想实现的是:一边录音,一边播放,但是现在没有声音,跟踪了一下,除了第一次进入writeaudioblock,进不去了,
void writeAudioBlock(HWAVEOUT hWaveOut, LPSTR block, DWORD size)
{
WAVEHDR header;
ZeroMemory(&header, sizeof(WAVEHDR));
header.dwBufferLength = size; //length, in bytes, of the buffer.
header.lpData = block; // pointer to waveform buffer.
waveOutPrepareHeader(hWaveOut, &header, sizeof(WAVEHDR));
waveOutWrite(hWaveOut, &header, sizeof(WAVEHDR));
Sleep(500);
while(waveOutUnprepareHeader(hWaveOut, &header, sizeof(WAVEHDR)) == WAVERR_STILLPLAYING)//release buffer
Sleep(100);
}
void CALLBACK waveInProc(HWAVEIN hwi,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2) //反馈函数
{
if (uMsg == WIM_OPEN)
{
}
else
if (uMsg == WIM_DATA)
{
//realloc buffer for record ,and delete it when after playing
lpNewBuffer = (char *)realloc(lpSaveBuffer,dwDataLength + ((PWAVEHDR)dwParam1)->dwBytesRecorded);
if (lpNewBuffer ==NULL)
{
// waveInClose(hWaveIn);
MessageBox(NULL,"error with lpNewBuffer",NULL,MB_OK);
}
lpSaveBuffer = lpNewBuffer;
CopyMemory(lpSaveBuffer + dwDataLength, ((PWAVEHDR)dwParam1)->lpData,((PWAVEHDR)dwParam1)->dwBufferLength );
dwDataLength +=((PWAVEHDR)dwParam1)->dwBytesRecorded ;
MMRESULT i4 = waveInAddBuffer(hWaveIn,(PWAVEHDR)dwParam1,sizeof(WAVEHDR));
return;
}
else if (uMsg == WIM_CLOSE)
{
//waveInUnprepareHeader(hWaveIn,pWaveHdr1,sizeof(WAVEHDR));
free (lpBuffer1);
}
}
int DoRecord()
{
pWaveHdr1 = (PWAVEHDR)malloc(sizeof(WAVEHDR));
lpBuffer1 = (char*)malloc(16384);
//open waveform audio for input
waveform.wFormatTag = WAVE_FORMAT_PCM;
waveform.nChannels = 1;
waveform.nSamplesPerSec = 8000;
waveform.wBitsPerSample = 16;
waveform.cbSize = 0;
waveform.nBlockAlign = (waveform.nChannels * waveform.wBitsPerSample)/8;
waveform.nAvgBytesPerSec = (waveform.nSamplesPerSec*waveform.nBlockAlign);
MMRESULT inflag = waveInOpen(&hWaveIn,WAVE_MAPPER,&waveform,(DWORD)waveInProc,0,
CALLBACK_FUNCTION); //open input device
//setup the headers and prepare them
pWaveHdr1->lpData = lpBuffer1;
pWaveHdr1->dwBufferLength = INP_BUFFER_SIZE;
pWaveHdr1->dwBytesRecorded = 0;
pWaveHdr1->dwUser = 0;
pWaveHdr1->dwFlags = 0;
pWaveHdr1->dwLoops = 1;
pWaveHdr1->lpNext = NULL;
pWaveHdr1->reserved = 0;
MMRESULT inpreflag= waveInPrepareHeader(hWaveIn,pWaveHdr1,sizeof(WAVEHDR));
lpSaveBuffer = (char*)malloc(1);
//add the record buffers
MMRESULT inaddflag = waveInAddBuffer(hWaveIn,pWaveHdr1,sizeof(WAVEHDR));
dwDataLength = 0;
//begin sampling(开始采样)
MMRESULT instartflag = waveInStart(hWaveIn);
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)DoPlay,0,0,0);
return 0;
}
UINT DoPlay()
{
MMRESULT outmark = waveOutOpen(&hWaveOut,WAVE_MAPPER,&waveform,0,0,
CALLBACK_NULL);
block = lpSaveBuffer;
blockSize=dwDataLength;
writeAudioBlock(hWaveOut,block,blockSize);
//waveOutClose(hWaveOut);
return 0;
}