33,311
社区成员
发帖
与我相关
我的任务
分享
// 记录捕获数据
HRESULT RecordCapturedData()
{
HRESULT hr = S_FALSE;
do
{
if (NULL == gpoDSCaptureBuffer8 || gpoWaveFile == NULL)
{
hr = E_INVALIDARG;
break;
}
// 获取当前可读到的数据的位置
DWORD dwReadPos;
DWORD dwCapturePos;
hr = gpoDSCaptureBuffer8->GetCurrentPosition(&dwCapturePos, &dwReadPos);
if (S_OK != hr)
break;
// TEST: 会出现这种情况。。。。。所以有问题。。。
if(gdwLastCapPos != dwCapturePos && gdwLastReadPos != dwReadPos)
{
hr = S_FALSE;
break;
}
gdwLastReadPos = dwReadPos;
gdwLastCapPos = dwCapturePos;
// 计算当前要锁定的缓冲大小
LONG lLockSize = dwReadPos - glNextReadOffset;
if( lLockSize < 0 ) lLockSize += gdwCaptureBufferSize;// 出现这种情况,说明缓冲已经至少写完一个环形了
if(lLockSize == 0)
{
hr = S_FALSE;
break;
}
// 锁定缓冲
VOID* pbCaptureData = NULL;
DWORD dwCaptureLength;
VOID* pbCaptureData2 = NULL;
DWORD dwCaptureLength2;
hr = gpoDSCaptureBuffer8->Lock(
glNextReadOffset,lLockSize,&pbCaptureData,&dwCaptureLength,&pbCaptureData2,&dwCaptureLength2,0L);
if (S_OK != hr)
break;
if(lLockSize != (dwCaptureLength + dwCaptureLength2))
break;
// Write the data. This is done in two steps to account for wraparound.
UINT dwDataWrote;
hr = gpoWaveFile->Write( dwCaptureLength, (BYTE*)pbCaptureData, &dwDataWrote);
if (S_OK != hr)
break;
if (pbCaptureData2 != NULL)
{
hr = gpoWaveFile->Write( dwCaptureLength2, (BYTE*)pbCaptureData2, &dwDataWrote);
if (S_OK != hr)
break;
}
// Unlock the capture buffer.
gpoDSCaptureBuffer8->Unlock( pbCaptureData, dwCaptureLength, pbCaptureData2, dwCaptureLength2 );
// Move the capture offset forward.
glNextReadOffset += dwCaptureLength;
glNextReadOffset %= gdwCaptureBufferSize;
glNextReadOffset += dwCaptureLength2;
glNextReadOffset %= gdwCaptureBufferSize;
// TEST:其实最后记住下一次的偏移值应该就是本次readPos指向的位置
if(glNextReadOffset != dwReadPos)
{
hr = S_FALSE;
break;
}
hr = S_OK;
} while (false);
return hr;
}