103 lines
4.0 KiB
C++
103 lines
4.0 KiB
C++
#include <com/com.hpp>
|
|
#include <com/variant.hpp>
|
|
#include <com/comptr.hpp>
|
|
#include <dvcap/DeviceEnumerator.hpp>
|
|
|
|
bool DeviceEnumerator::enumerateCategory(DeviceDescriptors &descriptors,DevCat devCat)
|
|
{
|
|
switch(devCat)
|
|
{
|
|
case AudioCaptureSources :
|
|
return enumerateCategory(descriptors,CLSID_AudioInputDeviceCategory);
|
|
case AudioCompressors :
|
|
return enumerateCategory(descriptors,CLSID_AudioCompressorCategory);
|
|
case AudioRenderers :
|
|
return enumerateCategory(descriptors,CLSID_AudioRendererCategory);
|
|
case DeviceControlFilters :
|
|
return enumerateCategory(descriptors,CLSID_DeviceControlCategory);
|
|
case DirectShowFilters :
|
|
return enumerateCategory(descriptors,CLSID_LegacyAmFilterCategory);
|
|
case ExternalRenderers :
|
|
return enumerateCategory(descriptors,CLSID_TransmitCategory);
|
|
case MidiRenderers :
|
|
return enumerateCategory(descriptors,CLSID_MidiRendererCategory);
|
|
case VideoCaptureSources :
|
|
return enumerateCategory(descriptors,CLSID_VideoInputDeviceCategory);
|
|
case VideoCompressors :
|
|
return enumerateCategory(descriptors,CLSID_VideoCompressorCategory);
|
|
case VideoEffects1 :
|
|
return enumerateCategory(descriptors,CLSID_VideoEffects1Category);
|
|
case VideoEffects2 :
|
|
return enumerateCategory(descriptors,CLSID_VideoEffects2Category);
|
|
case WDMStreamingDecompressionDevices :
|
|
return enumerateCategory(descriptors,KSCATEGORY_DATADECOMPRESSOR);
|
|
case WDMStreamingCaptureDevices :
|
|
return enumerateCategory(descriptors,AM_KSCATEGORY_CAPTURE);
|
|
case WDMStreamingCommunicationTransforms :
|
|
return enumerateCategory(descriptors,KSCATEGORY_COMMUNICATIONSTRANSFORM);
|
|
case WDMStreamingCrossbarDevices :
|
|
return enumerateCategory(descriptors,AM_KSCATEGORY_CROSSBAR);
|
|
case WDMStreamingDataTransforms :
|
|
return enumerateCategory(descriptors,KSCATEGORY_DATATRANSFORM);
|
|
case WDMStreamingInterfaceTransforms :
|
|
return enumerateCategory(descriptors,KSCATEGORY_INTERFACETRANSFORM);
|
|
case WDMStreamingMixerDevices :
|
|
return enumerateCategory(descriptors,KSCATEGORY_MIXER);
|
|
case WDMRenderingDevices :
|
|
return enumerateCategory(descriptors,AM_KSCATEGORY_RENDER);
|
|
case WDMStreamingSystemAudioDevices :
|
|
return enumerateCategory(descriptors,KSCATEGORY_AUDIO_DEVICE);
|
|
case WDMStreamingTeeSplitterDevices :
|
|
return enumerateCategory(descriptors,AM_KSCATEGORY_SPLITTER);
|
|
case WDMStreamingTVAudioDevices :
|
|
return enumerateCategory(descriptors,AM_KSCATEGORY_TVAUDIO);
|
|
case WDMStreamingTVTunerDevices :
|
|
return enumerateCategory(descriptors,AM_KSCATEGORY_TVTUNER);
|
|
case WDMStreamingVBICodes :
|
|
return enumerateCategory(descriptors,AM_KSCATEGORY_VBICODEC);
|
|
case ActiveMovieFilterCategories :
|
|
return enumerateCategory(descriptors,CLSID_ActiveMovieCategories);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool DeviceEnumerator::enumerateCategory(DeviceDescriptors &descriptors,GUID classID)
|
|
{
|
|
ComInitializer comInit;
|
|
ComPointer<ICreateDevEnum> sysDevEnum;
|
|
ComPointer<IEnumMoniker> enumMoniker;
|
|
ComPointer<IMoniker> moniker;
|
|
ComObj comObj;
|
|
ComResult comResult;
|
|
BString bstring;
|
|
DeviceDescriptor descriptor;
|
|
ULONG cFetched;
|
|
|
|
descriptors.remove();
|
|
comResult=sysDevEnum.createInstance(CLSID_SystemDeviceEnum,IID_ICreateDevEnum);
|
|
if(comResult.error())return false;
|
|
comResult=sysDevEnum->CreateClassEnumerator(classID,(IEnumMoniker**)enumMoniker,0);
|
|
if(comResult.error())return false;
|
|
while(S_OK==enumMoniker->Next(1,(IMoniker**)moniker,&cFetched))
|
|
{
|
|
ComPointer<IPropertyBag> propertyBag;
|
|
moniker->BindToStorage(0,0,IID_IPropertyBag,(void**)(IPropertyBag**)propertyBag);
|
|
Variant varName;
|
|
comResult=propertyBag->Read(L"FriendlyName", &varName.getVARIANT(), 0);
|
|
if(comResult.success())
|
|
{
|
|
varName.getData(bstring);
|
|
descriptor.setName(bstring.toString());
|
|
}
|
|
comResult=propertyBag->Read(L"Description",&varName.getVARIANT(), 0);
|
|
if(comResult.success())
|
|
{
|
|
varName.getData(bstring);
|
|
descriptor.setDescription(bstring.toString());
|
|
}
|
|
if(descriptor.getName().isNull()&&descriptor.getDescription().isNull())continue;
|
|
descriptors.insert(&descriptor);
|
|
}
|
|
return true;
|
|
}
|