Make DMO init safe when not supported.

BUG=issue133
TEST=voe_auto_test

Review URL: http://webrtc-codereview.appspot.com/284001

git-svn-id: http://webrtc.googlecode.com/svn/trunk@990 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
andrew@webrtc.org 2011-11-22 18:04:26 +00:00
parent 91617ff948
commit 5a529395aa

View File

@ -359,6 +359,8 @@ AudioDeviceWindowsCore::AudioDeviceWindowsCore(const WebRtc_Word32 id) :
_ptrCaptureClient(NULL), _ptrCaptureClient(NULL),
_ptrCaptureVolume(NULL), _ptrCaptureVolume(NULL),
_ptrRenderSimpleVolume(NULL), _ptrRenderSimpleVolume(NULL),
_dmo(NULL),
_mediaBuffer(NULL),
_builtInAecEnabled(false), _builtInAecEnabled(false),
_playAudioFrameSize(0), _playAudioFrameSize(0),
_playSampleRate(0), _playSampleRate(0),
@ -491,15 +493,16 @@ AudioDeviceWindowsCore::AudioDeviceWindowsCore(const WebRtc_Word32 id) :
CLSCTX_INPROC_SERVER, CLSCTX_INPROC_SERVER,
IID_IMediaObject, IID_IMediaObject,
reinterpret_cast<void**>(&ptrDMO)); reinterpret_cast<void**>(&ptrDMO));
if (FAILED(hr) || ptrDMO == NULL)
{
// Since we check that _dmo is non-NULL in EnableBuiltInAEC(), the
// feature is prevented from being enabled.
_builtInAecEnabled = false;
_TraceCOMError(hr);
}
_dmo = ptrDMO; _dmo = ptrDMO;
ptrDMO->Release(); SAFE_RELEASE(ptrDMO);
} }
if (FAILED(hr))
{
_TraceCOMError(hr);
assert(false);
}
assert(_dmo != NULL);
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@ -3778,7 +3781,7 @@ DWORD AudioDeviceWindowsCore::DoCaptureThreadPollDMO()
// copy available data to |dmoBuffer|, and should only return // copy available data to |dmoBuffer|, and should only return
// 10 ms frames. The value of |dwStatus| should be ignored. // 10 ms frames. The value of |dwStatus| should be ignored.
hr = _dmo->ProcessOutput(0, 1, &dmoBuffer, &dwStatus); hr = _dmo->ProcessOutput(0, 1, &dmoBuffer, &dwStatus);
dmoBuffer.pBuffer->Release(); SAFE_RELEASE(dmoBuffer.pBuffer);
dwStatus = dmoBuffer.dwStatus; dwStatus = dmoBuffer.dwStatus;
} }
if (FAILED(hr)) if (FAILED(hr))
@ -4052,7 +4055,7 @@ DWORD AudioDeviceWindowsCore::DoCaptureThread()
clock->GetPosition(&pos, NULL); clock->GetPosition(&pos, NULL);
clock->GetFrequency(&freq); clock->GetFrequency(&freq);
_sndCardPlayDelay = ROUND((double(_writtenSamples) / _devicePlaySampleRate - double(pos) / freq) * 1000.0); _sndCardPlayDelay = ROUND((double(_writtenSamples) / _devicePlaySampleRate - double(pos) / freq) * 1000.0);
clock->Release(); SAFE_RELEASE(clock);
} }
// Send the captured data to the registered consumer // Send the captured data to the registered consumer
@ -4217,15 +4220,14 @@ int AudioDeviceWindowsCore::SetDMOProperties()
IPropertyStore* ptrPS = NULL; IPropertyStore* ptrPS = NULL;
hr = _dmo->QueryInterface(IID_IPropertyStore, hr = _dmo->QueryInterface(IID_IPropertyStore,
reinterpret_cast<void**>(&ptrPS)); reinterpret_cast<void**>(&ptrPS));
if (FAILED(hr) || ptrPS == NULL)
{
_TraceCOMError(hr);
return -1;
}
ps = ptrPS; ps = ptrPS;
ptrPS->Release(); SAFE_RELEASE(ptrPS);
} }
if (FAILED(hr))
{
_TraceCOMError(hr);
return -1;
}
assert(ps != NULL);
// Set the AEC system mode. // Set the AEC system mode.
// SINGLE_CHANNEL_AEC - AEC processing only. // SINGLE_CHANNEL_AEC - AEC processing only.
@ -4650,13 +4652,13 @@ WebRtc_Word32 AudioDeviceWindowsCore::_GetDefaultDeviceIndex(EDataFlow dir,
{ {
IMMDevice* ptrDevice = NULL; IMMDevice* ptrDevice = NULL;
hr = collection->Item(i, &ptrDevice); hr = collection->Item(i, &ptrDevice);
if (FAILED(hr) || ptrDevice == NULL)
{
_TraceCOMError(hr);
return -1;
}
device = ptrDevice; device = ptrDevice;
ptrDevice->Release(); SAFE_RELEASE(ptrDevice);
}
if (FAILED(hr))
{
_TraceCOMError(hr);
return -1;
} }
if (_GetDeviceID(device, szDeviceID, kDeviceIDLength) == -1) if (_GetDeviceID(device, szDeviceID, kDeviceIDLength) == -1)