C++ AUDCLNT\u BUFFERFLAGS\u DATA\u不连续性有时设置,有时不设置
我尝试使用WASAPI为WindowsPhone8制作一个简单的VoIP应用程序C++ AUDCLNT\u BUFFERFLAGS\u DATA\u不连续性有时设置,有时不设置,c++,audio,windows-phone-8,wasapi,C++,Audio,Windows Phone 8,Wasapi,我尝试使用WASAPI为WindowsPhone8制作一个简单的VoIP应用程序 hr = m_pCaptureClient->GetBuffer(&pbData, &nFrames, &dwFlags, nullptr, nullptr) 几分钟后,dwFlags重复设置为1 AUDCLNT\u BUFFERFLAGS\u DATA\u中断,返回的数据包越来越小,口吃越来越多,但在项目的某些运行过程中,一切正常,声音完全清晰 有人能帮忙吗 //MAX_RAW
hr = m_pCaptureClient->GetBuffer(&pbData, &nFrames, &dwFlags, nullptr, nullptr)
几分钟后,dwFlags重复设置为1 AUDCLNT\u BUFFERFLAGS\u DATA\u中断,返回的数据包越来越小,口吃越来越多,但在项目的某些运行过程中,一切正常,声音完全清晰
有人能帮忙吗
//MAX_RAW_BUFFER_SIZE 320
void BackEndAudio::CaptureThread(Windows::Foundation::IAsyncAction^ operation)
{
uint8_t amrEncodedData[13];
uint8_t SendingData[14];
HRESULT hr = m_pDefaultCaptureDevice->Start();
BYTE *pLocalBuffer = new BYTE[MAX_RAW_BUFFER_SIZE];
HANDLE eventHandles[] = {
hCaptureEvent, // WAIT_OBJECT0
hShutdownEvent // WAIT_OBJECT0 + 1
};
if (SUCCEEDED(hr) && pLocalBuffer)
{
unsigned int uAccumulatedBytes = 0;
while (SUCCEEDED(hr))
{
DWORD waitResult = WaitForMultipleObjectsEx(SIZEOF_ARRAY(eventHandles), eventHandles, FALSE, INFINITE, FALSE);
if (WAIT_OBJECT_0 == waitResult)
{
BYTE* pbData = nullptr;
UINT32 nFrames = 0;
DWORD dwFlags = 0;
if (SUCCEEDED(hr))
{
hr = m_pCaptureClient->GetBuffer(&pbData, &nFrames, &dwFlags, nullptr, nullptr);//Retrieves a pointer to the next available packet of data in the capture endpoint buffer.
unsigned int incomingBufferSize = nFrames * m_sourceFrameSizeInBytes;
if (*SendFrameNo==(uint8_t)256)
*SendFrameNo=0;
if(dwFlags==1)
glitch++;
while(MAX_RAW_BUFFER_SIZE - uAccumulatedBytes < incomingBufferSize)
{
memcpy(pLocalBuffer + uAccumulatedBytes, pbData,MAX_RAW_BUFFER_SIZE-uAccumulatedBytes);
if (transportController)
{
short *tempbuffer=new short[160];
for(int i=0;i<160;i++)
{
BToS.buf[0]=pLocalBuffer[i*2];
BToS.buf[1]=pLocalBuffer[i*2+1];
tempbuffer[i]=BToS.shbuf;
}
bool bRet = EasyVAD_IsSilence(hVAD,tempbuffer,160);
if(!bRet)
{
Encoder_Interface_Encode(amren, MR475, (const short *)pLocalBuffer, amrEncodedData, 0);
memcpy(SendingData,SendFrameNo,1);
memcpy(SendingData+1,amrEncodedData,13);
transportController->Write(SendingData, 14);
(*SendFrameNo)++;
}
}
pbData+=(MAX_RAW_BUFFER_SIZE-uAccumulatedBytes);
incomingBufferSize-=(MAX_RAW_BUFFER_SIZE-uAccumulatedBytes);
uAccumulatedBytes=0;
}
if(MAX_RAW_BUFFER_SIZE - uAccumulatedBytes == incomingBufferSize)
{
memcpy(pLocalBuffer + uAccumulatedBytes, pbData, incomingBufferSize);
if (transportController)
{
short *tempbuffer=new short[160];
for(int i=0;i<160;i++)
{
BToS.buf[0]=pLocalBuffer[i*2];
BToS.buf[1]=pLocalBuffer[i*2+1];
tempbuffer[i]=BToS.shbuf;
}
bool bRet = EasyVAD_IsSilence(hVAD,tempbuffer,160);
if(!bRet)
{
Encoder_Interface_Encode(amren, MR475, (const short *)pLocalBuffer, amrEncodedData, 0);
memcpy(SendingData,SendFrameNo,1);
memcpy(SendingData+1,amrEncodedData,13);
transportController->Write(SendingData, 14);
(*SendFrameNo)++;
}
}
// Reset our counter
uAccumulatedBytes = 0;
}
else if(MAX_RAW_BUFFER_SIZE - uAccumulatedBytes > incomingBufferSize)
{
memcpy(pLocalBuffer + uAccumulatedBytes, pbData, incomingBufferSize);
uAccumulatedBytes += incomingBufferSize;
}
}
if (SUCCEEDED(hr))
{
hr = m_pCaptureClient->ReleaseBuffer(nFrames);
}
}
else if (WAIT_OBJECT_0 + 1 == waitResult)
{
// We're being asked to shutdown
break;
}
else
{
// Unknown return value
DbgRaiseAssertionFailure();
}
}
}
delete[] pLocalBuffer;
}
我知道代码在每次GetBuffer调用之间做了很多工作,这可能是时间故障的主要问题,但我的问题是为什么有时会发生,有时不会 我怀疑的是,您从捕获客户端获取缓冲区的速度太慢。它在某个地方有一个内部溢出,因此您在捕获会话期间会遇到标志和数据损坏。注释掉您的EasyVAD_u u IsSilence和transportController->写一些东西来运行一个干净的捕获会话,看看您是否可以正常工作。这可能也解释了您之前的问题。我注意到,8KHz/1通道/16位格式通过向AudioClient initialize发送未记录的参数出现的时间故障比48KHz/2通道/32位格式发生的时间故障要多得多。我正在尝试使用48KHz格式,然后对其进行重新采样以进行编码。我会尽快对结果进行评论。我最终选择48KHz采样,并使用libsamplerate将其重新采样到8KHz。现在时间故障比以前小得多。我不知道为什么,但它是。1这支持了我的上述怀疑2应该有Microsoft MFT用于重采样,也不确定Windows Phone 8,但我希望它会在那里。