63 lines
1.8 KiB
C++
63 lines
1.8 KiB
C++
// helper function for implementing the Clone method on DMOs
|
|
|
|
#pragma once
|
|
|
|
#include "dsdmobse.h"
|
|
|
|
template<class TypeOf_CDirectSoundDMO, class TypeOf_ParamsStruct>
|
|
HRESULT StandardDMOClone(TypeOf_CDirectSoundDMO *pThis, IMediaObjectInPlace **ppCloned);
|
|
|
|
// implementation...
|
|
|
|
// The end of StandardDMOClone is the same for all types. Implement it outside the template
|
|
// so that the code isn't duplicated. Copies the input and output types, does the QI for IMediaObjectInPlace,
|
|
// and returns with the correct ref count.
|
|
HRESULT StandardDMOClone_Ending(IMediaObject *pThis, IMediaObject *pCloned, IMediaObjectInPlace **ppCloned);
|
|
|
|
template<class TypeOf_CDirectSoundDMO, class TypeOf_ParamsStruct>
|
|
HRESULT StandardDMOClone(TypeOf_CDirectSoundDMO *pThis, IMediaObjectInPlace **ppCloned)
|
|
{
|
|
if (!ppCloned)
|
|
return E_POINTER;
|
|
|
|
HRESULT hr = S_OK;
|
|
TypeOf_CDirectSoundDMO *pCloned = NULL;
|
|
IUnknown *pUnk = NULL;
|
|
IMediaObject * pClonedMediaObject = NULL;
|
|
|
|
try
|
|
{
|
|
pCloned = new TypeOf_CDirectSoundDMO( NULL, &hr );
|
|
if( SUCCEEDED( hr ) )
|
|
{
|
|
hr = pCloned->NDQueryInterface( IID_IUnknown, (void **) &pUnk );
|
|
if( SUCCEEDED(hr ) )
|
|
{
|
|
hr = pUnk->QueryInterface( IID_IMediaObject, (void **) &pClonedMediaObject );
|
|
pUnk->Release();
|
|
}
|
|
}
|
|
} catch(...) {}
|
|
|
|
if (pCloned == NULL)
|
|
{
|
|
return hr;
|
|
}
|
|
|
|
// Copy parameter control information
|
|
if (SUCCEEDED(hr))
|
|
hr = pCloned->CopyParamsFromSource(pThis);
|
|
|
|
// Copy current parameter values
|
|
TypeOf_ParamsStruct params;
|
|
if (SUCCEEDED(hr))
|
|
hr = pThis->GetAllParameters(¶ms);
|
|
if (SUCCEEDED(hr))
|
|
hr = pCloned->SetAllParameters(¶ms);
|
|
|
|
if (SUCCEEDED(hr))
|
|
hr = StandardDMOClone_Ending(pThis, pClonedMediaObject, ppCloned);
|
|
|
|
return hr;
|
|
}
|