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:
henrika@google.com 2011-06-23 09:44:59 +00:00
parent a591d3fb41
commit 4bf9c0b123
2 changed files with 51 additions and 12 deletions

View File

@ -3602,12 +3602,12 @@ DWORD AudioDeviceWindowsCore::DoCaptureThread()
// Find out how much capture data is available
//
hr = _ptrCaptureClient->GetBuffer(
&pData, // packet which is ready to be read by used
&framesAvailable, // #frames in the captured packet (can be zero)
&flags, // support flags (check)
&recPos, // device position of first audio frame in data packet
&recTime); // value of performance counter at the time of recording the first audio frame
hr = _ptrCaptureClient->GetBuffer(&pData, // packet which is ready to be read by used
&framesAvailable, // #frames in the captured packet (can be zero)
&flags, // support flags (check)
&recPos, // device position of first audio frame in data packet
&recTime); // value of performance counter at the time of recording the first audio frame
if (SUCCEEDED(hr))
{
if (AUDCLNT_S_BUFFER_EMPTY == hr)
@ -3619,12 +3619,21 @@ DWORD AudioDeviceWindowsCore::DoCaptureThread()
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");
pData = NULL;
}
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);
// Release the capture buffer
@ -3724,6 +3733,8 @@ DWORD AudioDeviceWindowsCore::DoCaptureThread()
// 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
// 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;
}
@ -4385,7 +4396,7 @@ void AudioDeviceWindowsCore::_TraceCOMError(HRESULT hr) const
WEBRTC_TRACE(kTraceInfo, kTraceAudioDevice, _id, "Core Audio method failed (hr=0x%x)", hr);
StringCchPrintf(buf, MAXERRORLENGTH, TEXT("Error details: "));
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
#endif // WEBRTC_WINDOWS_CORE_AUDIO_BUILD

View File

@ -162,11 +162,11 @@ public:
virtual void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer);
private: // avrt function pointers
PAvRevertMmThreadCharacteristics _PAvRevertMmThreadCharacteristics;
PAvSetMmThreadCharacteristicsA _PAvSetMmThreadCharacteristicsA;
PAvSetMmThreadPriority _PAvSetMmThreadPriority;
PAvRevertMmThreadCharacteristics _PAvRevertMmThreadCharacteristics;
PAvSetMmThreadCharacteristicsA _PAvSetMmThreadCharacteristicsA;
PAvSetMmThreadPriority _PAvSetMmThreadPriority;
HMODULE _avrtLibrary;
bool _winSupportAvrt;
bool _winSupportAvrt;
private: // thread functions
static DWORD WINAPI WSAPICaptureThread(LPVOID context);
@ -205,6 +205,10 @@ private:
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:
AudioDeviceBuffer* _ptrAudioBuffer;
CriticalSectionWrapper& _critSect;
@ -297,6 +301,8 @@ private:
WebRtc_UWord16 _playBufDelayFixed;
WebRtc_UWord16 _newMicLevel;
mutable char _str[512];
};
#endif // #if (_MSC_VER >= 1400)