音频信息的采集和播放,但是不可以播放

xusenxs 2012-09-23 08:57:38
我想实现的是:一边录音,一边播放,但是现在没有声音,跟踪了一下,除了第一次进入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;

}
...全文
65 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xusenxs 2012-09-25
  • 打赏
  • 举报
回复
虽然不对,但是感谢你的回答,给分了,搞好了
zsb_xt 2012-09-24
  • 打赏
  • 举报
回复
DoPlay线程只执行了一次啊

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧