[PATCH 3/4] devenum: Only scan for devices for the requested filter category.
Zebediah Figura
z.figura12 at gmail.com
Sat Sep 22 20:31:57 CDT 2018
This matches native behaviour, and greatly reduces the overhead of
IFilterMapper2_EnumMatchingFilters().
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/devenum/createdevenum.c | 70 ++++++++++++++++++--------------------------
1 file changed, 28 insertions(+), 42 deletions(-)
diff --git a/dlls/devenum/createdevenum.c b/dlls/devenum/createdevenum.c
index fa096be..9b7ee3f 100644
--- a/dlls/devenum/createdevenum.c
+++ b/dlls/devenum/createdevenum.c
@@ -53,7 +53,6 @@ static const WCHAR wszFriendlyName[] = {'F','r','i','e','n','d','l','y','N','a',
static const WCHAR wszFilterData[] = {'F','i','l','t','e','r','D','a','t','a',0};
static ULONG WINAPI DEVENUM_ICreateDevEnum_AddRef(ICreateDevEnum * iface);
-static void register_codecs(void);
static HRESULT DEVENUM_CreateAMCategoryKey(const CLSID * clsidCategory);
/**********************************************************************
@@ -828,31 +827,42 @@ static void register_avicap_devices(void)
* DEVENUM_ICreateDevEnum_CreateClassEnumerator
*/
static HRESULT WINAPI DEVENUM_ICreateDevEnum_CreateClassEnumerator(
- ICreateDevEnum * iface,
- REFCLSID clsidDeviceClass,
- IEnumMoniker **ppEnumMoniker,
- DWORD dwFlags)
+ ICreateDevEnum *iface, REFCLSID class, IEnumMoniker **out, DWORD flags)
{
+ WCHAR guidstr[CHARS_IN_GUID];
HRESULT hr;
+ HKEY key;
- TRACE("(%p)->(%s, %p, %x)\n", iface, debugstr_guid(clsidDeviceClass), ppEnumMoniker, dwFlags);
+ TRACE("iface %p, class %s, out %p, flags %#x.\n", iface, debugstr_guid(class), out, flags);
- if (!ppEnumMoniker)
+ if (!out)
return E_POINTER;
- *ppEnumMoniker = NULL;
+ *out = NULL;
- register_codecs();
- register_legacy_filters();
- hr = DirectSoundEnumerateW(®ister_dsound_devices, NULL);
- if (FAILED(hr)) return hr;
- register_waveout_devices();
- register_wavein_devices();
- register_midiout_devices();
- register_vfw_codecs();
- register_avicap_devices();
+ if (!RegOpenKeyW(HKEY_CURRENT_USER, wszActiveMovieKey, &key))
+ {
+ StringFromGUID2(class, guidstr, ARRAY_SIZE(guidstr));
+ RegDeleteTreeW(key, guidstr);
+ }
- return create_EnumMoniker(clsidDeviceClass, ppEnumMoniker);
+ if (IsEqualGUID(class, &CLSID_LegacyAmFilterCategory))
+ register_legacy_filters();
+ else if (IsEqualGUID(class, &CLSID_AudioRendererCategory))
+ {
+ hr = DirectSoundEnumerateW(®ister_dsound_devices, NULL);
+ if (FAILED(hr)) return hr;
+ register_waveout_devices();
+ register_midiout_devices();
+ }
+ else if (IsEqualGUID(class, &CLSID_AudioInputDeviceCategory))
+ register_wavein_devices();
+ else if (IsEqualGUID(class, &CLSID_VideoCompressorCategory))
+ register_vfw_codecs();
+ else if (IsEqualGUID(class, &CLSID_VideoInputDeviceCategory))
+ register_avicap_devices();
+
+ return create_EnumMoniker(class, out);
}
/**********************************************************************
@@ -902,27 +912,3 @@ static HRESULT DEVENUM_CreateAMCategoryKey(const CLSID * clsidCategory)
return res;
}
-
-static void register_codecs(void)
-{
- WCHAR class[CHARS_IN_GUID];
- HKEY basekey;
-
- /* Since devices can change between session, for example because you just plugged in a webcam
- * or switched from pulseaudio to alsa, delete all old devices first
- */
- RegOpenKeyW(HKEY_CURRENT_USER, wszActiveMovieKey, &basekey);
- StringFromGUID2(&CLSID_LegacyAmFilterCategory, class, CHARS_IN_GUID);
- RegDeleteTreeW(basekey, class);
- StringFromGUID2(&CLSID_AudioRendererCategory, class, CHARS_IN_GUID);
- RegDeleteTreeW(basekey, class);
- StringFromGUID2(&CLSID_AudioInputDeviceCategory, class, CHARS_IN_GUID);
- RegDeleteTreeW(basekey, class);
- StringFromGUID2(&CLSID_VideoInputDeviceCategory, class, CHARS_IN_GUID);
- RegDeleteTreeW(basekey, class);
- StringFromGUID2(&CLSID_MidiRendererCategory, class, CHARS_IN_GUID);
- RegDeleteTreeW(basekey, class);
- StringFromGUID2(&CLSID_VideoCompressorCategory, class, CHARS_IN_GUID);
- RegDeleteTreeW(basekey, class);
- RegCloseKey(basekey);
-}
--
2.7.4
More information about the wine-devel
mailing list