📄 ctlutil.cpp
字号:
HRESULT hr = S_OK;
if(SUCCEEDED(hr) && StopPosBits) {
hr = ChangeStop();
}
if(StartPosBits) {
hr = ChangeStart();
}
return hr;
}
HRESULT CSourceSeeking::GetPositions( LONGLONG * pCurrent, LONGLONG * pStop )
{
if(pCurrent) {
*pCurrent = m_rtStart;
}
if(pStop) {
*pStop = m_rtStop;
}
return S_OK;;
}
HRESULT CSourceSeeking::GetAvailable( LONGLONG * pEarliest, LONGLONG * pLatest )
{
if(pEarliest) {
*pEarliest = 0;
}
if(pLatest) {
CAutoLock lock(m_pLock);
*pLatest = m_rtDuration;
}
return S_OK;
}
HRESULT CSourceSeeking::SetRate( double dRate)
{
{
CAutoLock lock(m_pLock);
m_dRateSeeking = dRate;
}
return ChangeRate();
}
HRESULT CSourceSeeking::GetRate( double * pdRate)
{
CheckPointer(pdRate, E_POINTER);
CAutoLock lock(m_pLock);
*pdRate = m_dRateSeeking;
return S_OK;
}
HRESULT CSourceSeeking::GetPreroll(LONGLONG *pPreroll)
{
CheckPointer(pPreroll, E_POINTER);
*pPreroll = 0;
return S_OK;
}
// --- CSourcePosition implementation ----------
CSourcePosition::CSourcePosition(const TCHAR * pName,
LPUNKNOWN pUnk,
HRESULT* phr,
CCritSec * pLock) :
CMediaPosition(pName, pUnk),
m_pLock(pLock),
m_Start(CRefTime((LONGLONG)0))
{
m_Stop = _I64_MAX;
m_Rate = 1.0;
}
STDMETHODIMP
CSourcePosition::get_Duration(REFTIME * plength)
{
CheckPointer(plength,E_POINTER);
ValidateReadWritePtr(plength,sizeof(REFTIME));
CAutoLock lock(m_pLock);
*plength = m_Duration;
return S_OK;
}
STDMETHODIMP
CSourcePosition::put_CurrentPosition(REFTIME llTime)
{
m_pLock->Lock();
m_Start = llTime;
m_pLock->Unlock();
return ChangeStart();
}
STDMETHODIMP
CSourcePosition::get_StopTime(REFTIME * pllTime)
{
CheckPointer(pllTime,E_POINTER);
ValidateReadWritePtr(pllTime,sizeof(REFTIME));
CAutoLock lock(m_pLock);
*pllTime = m_Stop;
return S_OK;
}
STDMETHODIMP
CSourcePosition::put_StopTime(REFTIME llTime)
{
m_pLock->Lock();
m_Stop = llTime;
m_pLock->Unlock();
return ChangeStop();
}
STDMETHODIMP
CSourcePosition::get_PrerollTime(REFTIME * pllTime)
{
CheckPointer(pllTime,E_POINTER);
ValidateReadWritePtr(pllTime,sizeof(REFTIME));
return E_NOTIMPL;
}
STDMETHODIMP
CSourcePosition::put_PrerollTime(REFTIME llTime)
{
return E_NOTIMPL;
}
STDMETHODIMP
CSourcePosition::get_Rate(double * pdRate)
{
CheckPointer(pdRate,E_POINTER);
ValidateReadWritePtr(pdRate,sizeof(double));
CAutoLock lock(m_pLock);
*pdRate = m_Rate;
return S_OK;
}
STDMETHODIMP
CSourcePosition::put_Rate(double dRate)
{
m_pLock->Lock();
m_Rate = dRate;
m_pLock->Unlock();
return ChangeRate();
}
// By default we can seek forwards
STDMETHODIMP
CSourcePosition::CanSeekForward(LONG *pCanSeekForward)
{
CheckPointer(pCanSeekForward,E_POINTER);
*pCanSeekForward = OATRUE;
return S_OK;
}
// By default we can seek backwards
STDMETHODIMP
CSourcePosition::CanSeekBackward(LONG *pCanSeekBackward)
{
CheckPointer(pCanSeekBackward,E_POINTER);
*pCanSeekBackward = OATRUE;
return S_OK;
}
// --- Implementation of CBasicAudio class ----------
CBasicAudio::CBasicAudio(const TCHAR * pName,LPUNKNOWN punk) :
CUnknown(pName, punk)
{
}
// overriden to publicise our interfaces
STDMETHODIMP
CBasicAudio::NonDelegatingQueryInterface(REFIID riid, void **ppv)
{
ValidateReadWritePtr(ppv,sizeof(PVOID));
if (riid == IID_IBasicAudio) {
return GetInterface( (IBasicAudio *) this, ppv);
} else {
return CUnknown::NonDelegatingQueryInterface(riid, ppv);
}
}
STDMETHODIMP
CBasicAudio::GetTypeInfoCount(UINT * pctinfo)
{
return m_basedisp.GetTypeInfoCount(pctinfo);
}
STDMETHODIMP
CBasicAudio::GetTypeInfo(
UINT itinfo,
LCID lcid,
ITypeInfo ** pptinfo)
{
return m_basedisp.GetTypeInfo(
IID_IBasicAudio,
itinfo,
lcid,
pptinfo);
}
STDMETHODIMP
CBasicAudio::GetIDsOfNames(
REFIID riid,
OLECHAR ** rgszNames,
UINT cNames,
LCID lcid,
DISPID * rgdispid)
{
return m_basedisp.GetIDsOfNames(
IID_IBasicAudio,
rgszNames,
cNames,
lcid,
rgdispid);
}
STDMETHODIMP
CBasicAudio::Invoke(
DISPID dispidMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS * pdispparams,
VARIANT * pvarResult,
EXCEPINFO * pexcepinfo,
UINT * puArgErr)
{
// this parameter is a dead leftover from an earlier interface
if (IID_NULL != riid) {
return DISP_E_UNKNOWNINTERFACE;
}
ITypeInfo * pti;
HRESULT hr = GetTypeInfo(0, lcid, &pti);
if (FAILED(hr)) {
return hr;
}
hr = pti->Invoke(
(IBasicAudio *)this,
dispidMember,
wFlags,
pdispparams,
pvarResult,
pexcepinfo,
puArgErr);
pti->Release();
return hr;
}
// --- IVideoWindow implementation ----------
CBaseVideoWindow::CBaseVideoWindow(const TCHAR * pName,LPUNKNOWN punk) :
CUnknown(pName, punk)
{
}
// overriden to publicise our interfaces
STDMETHODIMP
CBaseVideoWindow::NonDelegatingQueryInterface(REFIID riid, void **ppv)
{
ValidateReadWritePtr(ppv,sizeof(PVOID));
if (riid == IID_IVideoWindow) {
return GetInterface( (IVideoWindow *) this, ppv);
} else {
return CUnknown::NonDelegatingQueryInterface(riid, ppv);
}
}
STDMETHODIMP
CBaseVideoWindow::GetTypeInfoCount(UINT * pctinfo)
{
return m_basedisp.GetTypeInfoCount(pctinfo);
}
STDMETHODIMP
CBaseVideoWindow::GetTypeInfo(
UINT itinfo,
LCID lcid,
ITypeInfo ** pptinfo)
{
return m_basedisp.GetTypeInfo(
IID_IVideoWindow,
itinfo,
lcid,
pptinfo);
}
STDMETHODIMP
CBaseVideoWindow::GetIDsOfNames(
REFIID riid,
OLECHAR ** rgszNames,
UINT cNames,
LCID lcid,
DISPID * rgdispid)
{
return m_basedisp.GetIDsOfNames(
IID_IVideoWindow,
rgszNames,
cNames,
lcid,
rgdispid);
}
STDMETHODIMP
CBaseVideoWindow::Invoke(
DISPID dispidMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS * pdispparams,
VARIANT * pvarResult,
EXCEPINFO * pexcepinfo,
UINT * puArgErr)
{
// this parameter is a dead leftover from an earlier interface
if (IID_NULL != riid) {
return DISP_E_UNKNOWNINTERFACE;
}
ITypeInfo * pti;
HRESULT hr = GetTypeInfo(0, lcid, &pti);
if (FAILED(hr)) {
return hr;
}
hr = pti->Invoke(
(IVideoWindow *)this,
dispidMember,
wFlags,
pdispparams,
pvarResult,
pexcepinfo,
puArgErr);
pti->Release();
return hr;
}
// --- IBasicVideo implementation ----------
CBaseBasicVideo::CBaseBasicVideo(const TCHAR * pName,LPUNKNOWN punk) :
CUnknown(pName, punk)
{
}
// overriden to publicise our interfaces
STDMETHODIMP
CBaseBasicVideo::NonDelegatingQueryInterface(REFIID riid, void **ppv)
{
ValidateReadWritePtr(ppv,sizeof(PVOID));
if (riid == IID_IBasicVideo || riid == IID_IBasicVideo2) {
return GetInterface( static_cast<IBasicVideo2 *>(this), ppv);
} else {
return CUnknown::NonDelegatingQueryInterface(riid, ppv);
}
}
STDMETHODIMP
CBaseBasicVideo::GetTypeInfoCount(UINT * pctinfo)
{
return m_basedisp.GetTypeInfoCount(pctinfo);
}
STDMETHODIMP
CBaseBasicVideo::GetTypeInfo(
UINT itinfo,
LCID lcid,
ITypeInfo ** pptinfo)
{
return m_basedisp.GetTypeInfo(
IID_IBasicVideo,
itinfo,
lcid,
pptinfo);
}
STDMETHODIMP
CBaseBasicVideo::GetIDsOfNames(
REFIID riid,
OLECHAR ** rgszNames,
UINT cNames,
LCID lcid,
DISPID * rgdispid)
{
return m_basedisp.GetIDsOfNames(
IID_IBasicVideo,
rgszNames,
cNames,
lcid,
rgdispid);
}
STDMETHODIMP
CBaseBasicVideo::Invoke(
DISPID dispidMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS * pdispparams,
VARIANT * pvarResult,
EXCEPINFO * pexcepinfo,
UINT * puArgErr)
{
// this parameter is a dead leftover from an earlier interface
if (IID_NULL != riid) {
return DISP_E_UNKNOWNINTERFACE;
}
ITypeInfo * pti;
HRESULT hr = GetTypeInfo(0, lcid, &pti);
if (FAILED(hr)) {
return hr;
}
hr = pti->Invoke(
(IBasicVideo *)this,
dispidMember,
wFlags,
pdispparams,
pvarResult,
pexcepinfo,
puArgErr);
pti->Release();
return hr;
}
// --- Implementation of Deferred Commands ----------
CDispParams::CDispParams(UINT nArgs, VARIANT* pArgs, HRESULT *phr)
{
cNamedArgs = 0;
rgdispidNamedArgs = NULL;
cArgs = nArgs;
if (cArgs) {
rgvarg = new VARIANT[cArgs];
if (NULL == rgvarg) {
cArgs = 0;
if (phr) {
*phr = E_OUTOFMEMORY;
}
return;
}
for (UINT i = 0; i < cArgs; i++) {
VARIANT * pDest = &rgvarg[i];
VARIANT * pSrc = &pArgs[i];
pDest->vt = pSrc->vt;
switch(pDest->vt) {
case VT_I4:
pDest->lVal = pSrc->lVal;
break;
case VT_UI1:
pDest->bVal = pSrc->bVal;
break;
case VT_I2:
pDest->iVal = pSrc->iVal;
break;
case VT_R4:
pDest->fltVal = pSrc->fltVal;
break;
case VT_R8:
pDest->dblVal = pSrc->dblVal;
break;
case VT_BOOL:
pDest->boolVal = pSrc->boolVal;
break;
case VT_ERROR:
pDest->scode = pSrc->scode;
break;
case VT_CY:
pDest->cyVal = pSrc->cyVal;
break;
case VT_DATE:
pDest->date = pSrc->date;
break;
case VT_BSTR:
if (pSrc->bstrVal == NULL) {
pDest->bstrVal = NULL;
} else {
// a BSTR is a WORD followed by a UNICODE string.
// the pointer points just after the WORD
WORD len = * (WORD*) (pSrc->bstrVal - (sizeof(WORD) / sizeof(OLECHAR)));
OLECHAR* pch = new OLECHAR[len + (sizeof(WORD)/sizeof(OLECHAR))];
if (pch) {
WORD *pui = (WORD*)pch;
*pui = len;
pDest->bstrVal = pch + (sizeof(WORD)/sizeof(OLECHAR));
CopyMemory(pDest->bstrVal, pSrc->bstrVal, len*sizeof(OLECHAR));
} else {
cArgs = i;
if (phr) {
*phr = E_OUTOFMEMORY;
}
}
}
pDest->bstrVal = pSrc->bstrVal;
break;
case VT_UNKNOWN:
pDest->punkVal = pSrc->punkVal;
pDest->punkVal->AddRef();
break;
case VT_DISPATCH:
pDest->pdispVal = pSrc->pdispVal;
pDest->pdispVal->AddRef();
break;
default:
// a type we haven't got round to adding yet!
ASSERT(0);
break;
}
}
} else {
rgvarg = NULL;
}
}
CDispParams::~CDispParams()
{
for (UINT i = 0; i < cArgs; i++) {
switch(rgvarg[i].vt) {
case VT_BSTR:
if (rgvarg[i].bstrVal != NULL) {
OLECHAR * pch = rgvarg[i].bstrVal - (sizeof(WORD)/sizeof(OLECHAR));
delete pch;
}
break;
case VT_UNKNOWN:
rgvarg[i].punkVal->Release();
break;
case VT_DISPATCH:
rgvarg[i].pdispVal->Release();
break;
}
}
delete[] rgvarg;
}
// lifetime is controlled by refcounts (see defer.h)
CDeferredCommand::CDeferredCommand(
CCmdQueue * pQ,
LPUNKNOWN pUnk,
HRESULT * phr,
LPUNKNOWN pUnkExecutor,
REFTIME time,
GUID* iid,
long dispidMethod,
short wFlags,
long nArgs,
VARIANT* pDispParams,
VARIANT* pvarResult,
short* puArgErr,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -