Adds sanity checks related to IAudioCaptureClient::GetBuffer.
Review URL: http://webrtc-codereview.appspot.com/45006 git-svn-id: http://webrtc.googlecode.com/svn/trunk@120 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
parent
a591d3fb41
commit
4bf9c0b123
@ -3602,12 +3602,12 @@ DWORD AudioDeviceWindowsCore::DoCaptureThread()
|
|||||||
|
|
||||||
// Find out how much capture data is available
|
// Find out how much capture data is available
|
||||||
//
|
//
|
||||||
hr = _ptrCaptureClient->GetBuffer(
|
hr = _ptrCaptureClient->GetBuffer(&pData, // packet which is ready to be read by used
|
||||||
&pData, // packet which is ready to be read by used
|
&framesAvailable, // #frames in the captured packet (can be zero)
|
||||||
&framesAvailable, // #frames in the captured packet (can be zero)
|
&flags, // support flags (check)
|
||||||
&flags, // support flags (check)
|
&recPos, // device position of first audio frame in data packet
|
||||||
&recPos, // device position of first audio frame in data packet
|
&recTime); // value of performance counter at the time of recording the first audio frame
|
||||||
&recTime); // value of performance counter at the time of recording the first audio frame
|
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
{
|
{
|
||||||
if (AUDCLNT_S_BUFFER_EMPTY == hr)
|
if (AUDCLNT_S_BUFFER_EMPTY == hr)
|
||||||
@ -3619,12 +3619,21 @@ DWORD AudioDeviceWindowsCore::DoCaptureThread()
|
|||||||
|
|
||||||
if (flags & AUDCLNT_BUFFERFLAGS_SILENT)
|
if (flags & AUDCLNT_BUFFERFLAGS_SILENT)
|
||||||
{
|
{
|
||||||
|
// Treat all of the data in the packet as silence and ignore the actual data values.
|
||||||
WEBRTC_TRACE(kTraceWarning, kTraceAudioDevice, _id, "AUDCLNT_BUFFERFLAGS_SILENT");
|
WEBRTC_TRACE(kTraceWarning, kTraceAudioDevice, _id, "AUDCLNT_BUFFERFLAGS_SILENT");
|
||||||
|
pData = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(framesAvailable != 0);
|
assert(framesAvailable != 0);
|
||||||
|
|
||||||
CopyMemory(&syncBuffer[syncBufIndex*_recAudioFrameSize], pData, framesAvailable*_recAudioFrameSize);
|
if (pData)
|
||||||
|
{
|
||||||
|
CopyMemory(&syncBuffer[syncBufIndex*_recAudioFrameSize], pData, framesAvailable*_recAudioFrameSize);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ZeroMemory(&syncBuffer[syncBufIndex*_recAudioFrameSize], framesAvailable*_recAudioFrameSize);
|
||||||
|
}
|
||||||
assert(syncBufferSize >= (syncBufIndex*_recAudioFrameSize)+framesAvailable*_recAudioFrameSize);
|
assert(syncBufferSize >= (syncBufIndex*_recAudioFrameSize)+framesAvailable*_recAudioFrameSize);
|
||||||
|
|
||||||
// Release the capture buffer
|
// Release the capture buffer
|
||||||
@ -3724,6 +3733,8 @@ DWORD AudioDeviceWindowsCore::DoCaptureThread()
|
|||||||
// of the failed GetBuffer calls. If GetBuffer returns this error repeatedly, the client
|
// of the failed GetBuffer calls. If GetBuffer returns this error repeatedly, the client
|
||||||
// can start a new processing loop after shutting down the current client by calling
|
// can start a new processing loop after shutting down the current client by calling
|
||||||
// IAudioClient::Stop, IAudioClient::Reset, and releasing the audio client.
|
// IAudioClient::Stop, IAudioClient::Reset, and releasing the audio client.
|
||||||
|
WEBRTC_TRACE(kTraceError, kTraceAudioDevice, _id,
|
||||||
|
"IAudioCaptureClient::GetBuffer returned AUDCLNT_E_BUFFER_ERROR, hr = 0x%08X", hr);
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4385,7 +4396,7 @@ void AudioDeviceWindowsCore::_TraceCOMError(HRESULT hr) const
|
|||||||
WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "Core Audio method failed (hr=0x%x)", hr);
|
WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "Core Audio method failed (hr=0x%x)", hr);
|
||||||
StringCchPrintf(buf, MAXERRORLENGTH, TEXT("Error details: "));
|
StringCchPrintf(buf, MAXERRORLENGTH, TEXT("Error details: "));
|
||||||
StringCchCat(buf, MAXERRORLENGTH, errorText);
|
StringCchCat(buf, MAXERRORLENGTH, errorText);
|
||||||
WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "%s", buf);
|
WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "%s", WideToUTF8(buf));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@ -4435,6 +4446,28 @@ void AudioDeviceWindowsCore::_Get44kHzDrift()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// WideToUTF8
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
char* AudioDeviceWindowsCore::WideToUTF8(const TCHAR* src) const {
|
||||||
|
#ifdef UNICODE
|
||||||
|
const size_t kStrLen = sizeof(_str);
|
||||||
|
memset(_str, 0, kStrLen);
|
||||||
|
// Get required size (in bytes) to be able to complete the conversion.
|
||||||
|
int required_size = WideCharToMultiByte(CP_UTF8, 0, src, -1, _str, 0, 0, 0);
|
||||||
|
if (required_size <= kStrLen)
|
||||||
|
{
|
||||||
|
// Process the entire input string, including the terminating null char.
|
||||||
|
if (WideCharToMultiByte(CP_UTF8, 0, src, -1, _str, kStrLen, 0, 0) == 0)
|
||||||
|
memset(_str, 0, kStrLen);
|
||||||
|
}
|
||||||
|
return _str;
|
||||||
|
#else
|
||||||
|
return const_cast<char*>(src);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|
||||||
#endif // WEBRTC_WINDOWS_CORE_AUDIO_BUILD
|
#endif // WEBRTC_WINDOWS_CORE_AUDIO_BUILD
|
||||||
|
@ -162,11 +162,11 @@ public:
|
|||||||
virtual void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer);
|
virtual void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer);
|
||||||
|
|
||||||
private: // avrt function pointers
|
private: // avrt function pointers
|
||||||
PAvRevertMmThreadCharacteristics _PAvRevertMmThreadCharacteristics;
|
PAvRevertMmThreadCharacteristics _PAvRevertMmThreadCharacteristics;
|
||||||
PAvSetMmThreadCharacteristicsA _PAvSetMmThreadCharacteristicsA;
|
PAvSetMmThreadCharacteristicsA _PAvSetMmThreadCharacteristicsA;
|
||||||
PAvSetMmThreadPriority _PAvSetMmThreadPriority;
|
PAvSetMmThreadPriority _PAvSetMmThreadPriority;
|
||||||
HMODULE _avrtLibrary;
|
HMODULE _avrtLibrary;
|
||||||
bool _winSupportAvrt;
|
bool _winSupportAvrt;
|
||||||
|
|
||||||
private: // thread functions
|
private: // thread functions
|
||||||
static DWORD WINAPI WSAPICaptureThread(LPVOID context);
|
static DWORD WINAPI WSAPICaptureThread(LPVOID context);
|
||||||
@ -205,6 +205,10 @@ private:
|
|||||||
|
|
||||||
void _Get44kHzDrift();
|
void _Get44kHzDrift();
|
||||||
|
|
||||||
|
// Converts from wide-char to UTF-8 if UNICODE is defined.
|
||||||
|
// Does nothing if UNICODE is undefined.
|
||||||
|
char* WideToUTF8(const TCHAR* src) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
AudioDeviceBuffer* _ptrAudioBuffer;
|
AudioDeviceBuffer* _ptrAudioBuffer;
|
||||||
CriticalSectionWrapper& _critSect;
|
CriticalSectionWrapper& _critSect;
|
||||||
@ -297,6 +301,8 @@ private:
|
|||||||
WebRtc_UWord16 _playBufDelayFixed;
|
WebRtc_UWord16 _playBufDelayFixed;
|
||||||
|
|
||||||
WebRtc_UWord16 _newMicLevel;
|
WebRtc_UWord16 _newMicLevel;
|
||||||
|
|
||||||
|
mutable char _str[512];
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // #if (_MSC_VER >= 1400)
|
#endif // #if (_MSC_VER >= 1400)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user