我基于DirectSound写了一个即录即放的程序,经测试我的播放有很大延时(半秒),我的录音类采用了消息通知16分之一秒拷贝一次数据,拷贝之后直接调用播放类的播放函数,高手指点一下吧。困扰很久了。播放函数HRESULT CSoundPlay::FillBufferWithSound(char* pBuff, DWORD dwBuffSize)
{
HRESULT hr = S_FALSE;
VOID*   pDSLockedBuffer = NULL; 
DWORD   dwDSLockedBufferSize = 0;  
DWORD dwWritePos = 0;
DWORD dwPlayPos = 0; if (NULL == m_pDSBuffer8 || NULL == pBuff)
{
TRACE("CSoundPlay::FillBufferWithSound----Buffer is NULL\n");
return hr;
} //- 获取当前播放和写入的位置
hr = m_pDSBuffer8->GetCurrentPosition(&dwPlayPos, &dwWritePos);
if (S_OK != hr)
{
TRACE("CSoundPlay::FillBufferWithSound----GetCurrentPosition Error %d\n", hr);
return hr;
}
//- 获取播放缓冲区
hr = m_pDSBuffer8->Lock(m_dwNextPlayOffset, dwBuffSize, &pDSLockedBuffer, &dwDSLockedBufferSize, NULL, NULL, 0);
if (S_OK != hr)
{
TRACE("CSoundPlay::FillBufferWithSound----Lock Error %d\n", hr);
return hr;
} //- 将需要播放的数据复制到播放缓冲区
::memcpy(pDSLockedBuffer, pBuff, dwBuffSize); // 移动偏移标志,循环移动
m_dwNextPlayOffset += dwDSLockedBufferSize;
m_dwNextPlayOffset %= m_dwBufferSize; 
//- 归还播放缓冲区,使其播放
hr = m_pDSBuffer8->Unlock(pDSLockedBuffer, dwDSLockedBufferSize, NULL, 0);
if (S_OK != hr)
{
TRACE("CSoundPlay::FillBufferWithSound----Unlock Error %d\n", hr);
return hr;
} return S_OK;
}