windows-nt/Source/XPSP1/NT/multimedia/dshow/vidctl/msvidctl/devices.cpp
2020-09-26 16:20:57 +08:00

83 lines
2.6 KiB
C++

//==========================================================================;
//
// Copyright (c) Microsoft Corporation 1998-2000.
//
//--------------------------------------------------------------------------;
//
// Devices.cpp : Implementation of CDevices
//
#include "stdafx.h"
#ifndef TUNING_MODEL_ONLY
#include "Devices.h"
static DWORD dwFetch;
// note: the compiler is generating but never calling the code to construct these initializers so the pointers
// are staying null. we work around this by providing a function which dynamically allocating them on the heap
// and calling it in our dllmain.
typedef enumerator_iterator<PQEnumVARIANT, CComVariant, IEnumVARIANT, VARIANT, std::allocator<VARIANT>::difference_type > EnumVARIANTIterator;
std_arity0pmf<IEnumVARIANT, HRESULT> * EnumVARIANTIterator::Reset = NULL;
std_arity1pmf<IEnumVARIANT, VARIANT *, HRESULT> * EnumVARIANTIterator::Next = NULL;
#define DECLAREPMFS(coll) \
std_arity1pmf<IMSVid##coll, IEnumVARIANT **, HRESULT> * VW##coll::Fetch = NULL
#define INITPMFS(coll) \
VW##coll::Fetch = new std_arity1pmf<IMSVid##coll, IEnumVARIANT **, HRESULT>(&IMSVid##coll::get__NewEnum)
#define DELETEPMFS(coll) \
delete VW##coll::Fetch
DECLAREPMFS(InputDevices);
DECLAREPMFS(OutputDevices);
DECLAREPMFS(VideoRendererDevices);
DECLAREPMFS(AudioRendererDevices);
DECLAREPMFS(Features);
DEFINE_EXTERN_OBJECT_ENTRY(CLSID_MSVidInputDevices, CInputDevices)
DEFINE_EXTERN_OBJECT_ENTRY(CLSID_MSVidOutputDevices, COutputDevices)
DEFINE_EXTERN_OBJECT_ENTRY(CLSID_MSVidVideoRendererDevices, CVideoRendererDevices)
DEFINE_EXTERN_OBJECT_ENTRY(CLSID_MSVidAudioRendererDevices, CAudioRendererDevices)
DEFINE_EXTERN_OBJECT_ENTRY(CLSID_MSVidFeatures, CFeatures)
// work around compiler bug as per above description
void CtorStaticVWDevicesFwdSeqPMFs(void) {
INITPMFS(InputDevices);
INITPMFS(OutputDevices);
INITPMFS(VideoRendererDevices);
INITPMFS(AudioRendererDevices);
INITPMFS(Features);
EnumVARIANTIterator::Reset = new std_arity0pmf<IEnumVARIANT, HRESULT>(&IEnumVARIANT::Reset);
EnumVARIANTIterator::Next = new std_bndr_mf_1_3<std_arity3pmf<IEnumVARIANT, ULONG, VARIANT*, ULONG *, HRESULT> >(std_arity3_member(&IEnumVARIANT::Next), 1, &dwFetch);
}
// work around compiler bug as per above description
void DtorStaticVWDevicesFwdSeqPMFs(void) {
DELETEPMFS(InputDevices);
DELETEPMFS(OutputDevices);
DELETEPMFS(VideoRendererDevices);
DELETEPMFS(AudioRendererDevices);
DELETEPMFS(Features);
delete EnumVARIANTIterator::Reset;
delete EnumVARIANTIterator::Next;
}
/////////////////////////////////////////////////////////////////////////////
// CDevEnum
#endif //TUNING_MODEL_ONLY
// end of file - devices.cpp