程序中使用了一个线程播放已经保存在list中的数据
节点结构体是包含:
nLen; \\ 音频数据长度
Data[640]; \\ 音频数据
UINT PlaySoundProc(LPVOID lpParam)
{
HWAVEOUT hwo;
WAVEHDR wh;
WAVEFORMATEX wfx;
CEvent wait;
unsigned long frames = 0;
unsigned long pos = 0;
unsigned long playTimes = 0;
int ret = 0 ;
HI_U8 buf[1 << 16];
HI_U8 tempBuf[1 << 16];
memset(buf, 0, sizeof(buf));
memset(tempBuf, 0 ,sizeof(tempBuf));
wfx.cbSize = ((WAVEFORMATEX*)lpParam)->cbSize;
wfx.nAvgBytesPerSec = ((WAVEFORMATEX*)lpParam)->nAvgBytesPerSec;
wfx.nBlockAlign = ((WAVEFORMATEX*)lpParam)->nBlockAlign;
wfx.nChannels = ((WAVEFORMATEX*)lpParam)->nChannels;
wfx.nSamplesPerSec = ((WAVEFORMATEX*)lpParam)->nSamplesPerSec;
wfx.wBitsPerSample = ((WAVEFORMATEX*)lpParam)->wBitsPerSample;
wfx.wFormatTag = ((WAVEFORMATEX*)lpParam)->wFormatTag;
ret = waveOutOpen(&hwo, WAVE_MAPPER, &wfx, (ULONG)(wait.m_hObject), 0L, CALLBACK_EVENT);
BOOL bPlay = FALSE;
list<G711u_FrameData>::iterator iter = g_lstFrameData.begin();
while ( !g_lstFrameData.empty())
{
memcpy(tempBuf + pos, iter->Data, iter->nLen);
pos += iter->nLen;
frames ++;
if ((pos + iter->nLen) > sizeof(tempBuf) || 1 == g_lstFrameData.size())
{
// 播放一次数据
memcpy(buf, tempBuf, pos);
wh.lpData = (LPSTR)buf;
wh.dwBufferLength = pos;
wh.dwFlags = 0L;
wh.dwLoops = 1L;
bPlay = TRUE;
waveOutPrepareHeader(hwo, &wh, sizeof(WAVEHDR));
waveOutWrite(hwo, &wh, sizeof(WAVEHDR));
WaitForSingleObject(wait.m_hObject, INFINITE);
playTimes ++;
frames = 0;
pos = 0;
}
// 删除list上头结点那一帧数据
g_lstFrameData.pop_front();
iter = g_lstFrameData.begin();
}
if (bPlay)
{
waveOutUnprepareHeader(hwo, &wh,sizeof(WAVEHDR));
}
waveOutClose(hwo);
return 0;
}