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:
		| @@ -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); | ||||||
|  |  | ||||||
|  |                 if (pData) | ||||||
|  |                 { | ||||||
|                     CopyMemory(&syncBuffer[syncBufIndex*_recAudioFrameSize], pData, framesAvailable*_recAudioFrameSize); |                     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 | ||||||
|   | |||||||
| @@ -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) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 henrika@google.com
					henrika@google.com