forked from Mirrors/wine-wine
devenum: Use wide string literals.
Signed-off-by: Zebediah Figura <z.figura12@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>feature/deterministic
parent
90a99806ac
commit
b6f2e9b130
|
@ -40,17 +40,6 @@
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(devenum);
|
WINE_DEFAULT_DEBUG_CHANNEL(devenum);
|
||||||
|
|
||||||
static const WCHAR wszFilterKeyName[] = {'F','i','l','t','e','r',0};
|
|
||||||
static const WCHAR wszMeritName[] = {'M','e','r','i','t',0};
|
|
||||||
static const WCHAR wszPins[] = {'P','i','n','s',0};
|
|
||||||
static const WCHAR wszAllowedMany[] = {'A','l','l','o','w','e','d','M','a','n','y',0};
|
|
||||||
static const WCHAR wszAllowedZero[] = {'A','l','l','o','w','e','d','Z','e','r','o',0};
|
|
||||||
static const WCHAR wszDirection[] = {'D','i','r','e','c','t','i','o','n',0};
|
|
||||||
static const WCHAR wszIsRendered[] = {'I','s','R','e','n','d','e','r','e','d',0};
|
|
||||||
static const WCHAR wszTypes[] = {'T','y','p','e','s',0};
|
|
||||||
static const WCHAR wszFriendlyName[] = {'F','r','i','e','n','d','l','y','N','a','m','e',0};
|
|
||||||
static const WCHAR wszFilterData[] = {'F','i','l','t','e','r','D','a','t','a',0};
|
|
||||||
|
|
||||||
static HRESULT WINAPI devenum_factory_QueryInterface(ICreateDevEnum *iface, REFIID riid, void **ppv)
|
static HRESULT WINAPI devenum_factory_QueryInterface(ICreateDevEnum *iface, REFIID riid, void **ppv)
|
||||||
{
|
{
|
||||||
TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv);
|
TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv);
|
||||||
|
@ -92,7 +81,6 @@ static ULONG WINAPI devenum_factory_Release(ICreateDevEnum *iface)
|
||||||
static HRESULT register_codec(const GUID *class, const WCHAR *name,
|
static HRESULT register_codec(const GUID *class, const WCHAR *name,
|
||||||
const GUID *clsid, const WCHAR *friendly_name, IPropertyBag **ret)
|
const GUID *clsid, const WCHAR *friendly_name, IPropertyBag **ret)
|
||||||
{
|
{
|
||||||
static const WCHAR deviceW[] = {'@','d','e','v','i','c','e',':','c','m',':',0};
|
|
||||||
WCHAR guidstr[CHARS_IN_GUID];
|
WCHAR guidstr[CHARS_IN_GUID];
|
||||||
IParseDisplayName *parser;
|
IParseDisplayName *parser;
|
||||||
IPropertyBag *propbag;
|
IPropertyBag *propbag;
|
||||||
|
@ -106,17 +94,16 @@ static HRESULT register_codec(const GUID *class, const WCHAR *name,
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
buffer = heap_alloc((lstrlenW(deviceW) + CHARS_IN_GUID + lstrlenW(name) + 1) * sizeof(WCHAR));
|
if (!(buffer = heap_alloc((wcslen(L"@device:cm:") + CHARS_IN_GUID + wcslen(name) + 1) * sizeof(WCHAR))))
|
||||||
if (!buffer)
|
|
||||||
{
|
{
|
||||||
IParseDisplayName_Release(parser);
|
IParseDisplayName_Release(parser);
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
lstrcpyW(buffer, deviceW);
|
wcscpy(buffer, L"@device:cm:");
|
||||||
StringFromGUID2(class, buffer + lstrlenW(buffer), CHARS_IN_GUID);
|
StringFromGUID2(class, buffer + wcslen(buffer), CHARS_IN_GUID);
|
||||||
lstrcatW(buffer, backslashW);
|
wcscat(buffer, L"\\");
|
||||||
lstrcatW(buffer, name);
|
wcscat(buffer, name);
|
||||||
|
|
||||||
IParseDisplayName_ParseDisplayName(parser, NULL, buffer, &eaten, &mon);
|
IParseDisplayName_ParseDisplayName(parser, NULL, buffer, &eaten, &mon);
|
||||||
IParseDisplayName_Release(parser);
|
IParseDisplayName_Release(parser);
|
||||||
|
@ -127,7 +114,7 @@ static HRESULT register_codec(const GUID *class, const WCHAR *name,
|
||||||
|
|
||||||
V_VT(&var) = VT_BSTR;
|
V_VT(&var) = VT_BSTR;
|
||||||
V_BSTR(&var) = SysAllocString(friendly_name);
|
V_BSTR(&var) = SysAllocString(friendly_name);
|
||||||
hr = IPropertyBag_Write(propbag, wszFriendlyName, &var);
|
hr = IPropertyBag_Write(propbag, L"FriendlyName", &var);
|
||||||
VariantClear(&var);
|
VariantClear(&var);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
|
@ -138,7 +125,7 @@ static HRESULT register_codec(const GUID *class, const WCHAR *name,
|
||||||
V_VT(&var) = VT_BSTR;
|
V_VT(&var) = VT_BSTR;
|
||||||
StringFromGUID2(clsid, guidstr, ARRAY_SIZE(guidstr));
|
StringFromGUID2(clsid, guidstr, ARRAY_SIZE(guidstr));
|
||||||
V_BSTR(&var) = SysAllocString(guidstr);
|
V_BSTR(&var) = SysAllocString(guidstr);
|
||||||
hr = IPropertyBag_Write(propbag, clsidW, &var);
|
hr = IPropertyBag_Write(propbag, L"CLSID", &var);
|
||||||
VariantClear(&var);
|
VariantClear(&var);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
|
@ -157,7 +144,7 @@ static void DEVENUM_ReadPinTypes(HKEY hkeyPinKey, REGFILTERPINS2 *rgPin)
|
||||||
REGPINTYPES *lpMediaType = NULL;
|
REGPINTYPES *lpMediaType = NULL;
|
||||||
DWORD dwMediaTypeSize = 0;
|
DWORD dwMediaTypeSize = 0;
|
||||||
|
|
||||||
if (RegOpenKeyExW(hkeyPinKey, wszTypes, 0, KEY_READ, &hkeyTypes) != ERROR_SUCCESS)
|
if (RegOpenKeyExW(hkeyPinKey, L"Types", 0, KEY_READ, &hkeyTypes) != ERROR_SUCCESS)
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
if (RegQueryInfoKeyW(hkeyTypes, NULL, NULL, NULL, &dwMajorTypes, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
|
if (RegQueryInfoKeyW(hkeyTypes, NULL, NULL, NULL, &dwMajorTypes, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
|
||||||
|
@ -253,7 +240,7 @@ static void DEVENUM_ReadPins(HKEY hkeyFilterClass, REGFILTER2 *rgf2)
|
||||||
rgf2->u.s2.cPins2 = 0;
|
rgf2->u.s2.cPins2 = 0;
|
||||||
rgf2->u.s2.rgPins2 = NULL;
|
rgf2->u.s2.rgPins2 = NULL;
|
||||||
|
|
||||||
if (RegOpenKeyExW(hkeyFilterClass, wszPins, 0, KEY_READ, &hkeyPins) != ERROR_SUCCESS)
|
if (RegOpenKeyExW(hkeyFilterClass, L"Pins", 0, KEY_READ, &hkeyPins) != ERROR_SUCCESS)
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
if (RegQueryInfoKeyW(hkeyPins, NULL, NULL, NULL, &dwPinsSubkeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
|
if (RegQueryInfoKeyW(hkeyPins, NULL, NULL, NULL, &dwPinsSubkeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
|
||||||
|
@ -289,21 +276,21 @@ static void DEVENUM_ReadPins(HKEY hkeyFilterClass, REGFILTER2 *rgf2)
|
||||||
if (RegOpenKeyExW(hkeyPins, wszPinName, 0, KEY_READ, &hkeyPinKey) != ERROR_SUCCESS) continue;
|
if (RegOpenKeyExW(hkeyPins, wszPinName, 0, KEY_READ, &hkeyPinKey) != ERROR_SUCCESS) continue;
|
||||||
|
|
||||||
size = sizeof(DWORD);
|
size = sizeof(DWORD);
|
||||||
lRet = RegQueryValueExW(hkeyPinKey, wszAllowedMany, NULL, &Type, (BYTE *)&value, &size);
|
lRet = RegQueryValueExW(hkeyPinKey, L"AllowedMany", NULL, &Type, (BYTE *)&value, &size);
|
||||||
if (lRet != ERROR_SUCCESS || Type != REG_DWORD)
|
if (lRet != ERROR_SUCCESS || Type != REG_DWORD)
|
||||||
goto error_cleanup;
|
goto error_cleanup;
|
||||||
if (value)
|
if (value)
|
||||||
rgPin->dwFlags |= REG_PINFLAG_B_MANY;
|
rgPin->dwFlags |= REG_PINFLAG_B_MANY;
|
||||||
|
|
||||||
size = sizeof(DWORD);
|
size = sizeof(DWORD);
|
||||||
lRet = RegQueryValueExW(hkeyPinKey, wszAllowedZero, NULL, &Type, (BYTE *)&value, &size);
|
lRet = RegQueryValueExW(hkeyPinKey, L"AllowedZero", NULL, &Type, (BYTE *)&value, &size);
|
||||||
if (lRet != ERROR_SUCCESS || Type != REG_DWORD)
|
if (lRet != ERROR_SUCCESS || Type != REG_DWORD)
|
||||||
goto error_cleanup;
|
goto error_cleanup;
|
||||||
if (value)
|
if (value)
|
||||||
rgPin->dwFlags |= REG_PINFLAG_B_ZERO;
|
rgPin->dwFlags |= REG_PINFLAG_B_ZERO;
|
||||||
|
|
||||||
size = sizeof(DWORD);
|
size = sizeof(DWORD);
|
||||||
lRet = RegQueryValueExW(hkeyPinKey, wszDirection, NULL, &Type, (BYTE *)&value, &size);
|
lRet = RegQueryValueExW(hkeyPinKey, L"Direction", NULL, &Type, (BYTE *)&value, &size);
|
||||||
if (lRet != ERROR_SUCCESS || Type != REG_DWORD)
|
if (lRet != ERROR_SUCCESS || Type != REG_DWORD)
|
||||||
goto error_cleanup;
|
goto error_cleanup;
|
||||||
if (value)
|
if (value)
|
||||||
|
@ -311,7 +298,7 @@ static void DEVENUM_ReadPins(HKEY hkeyFilterClass, REGFILTER2 *rgf2)
|
||||||
|
|
||||||
|
|
||||||
size = sizeof(DWORD);
|
size = sizeof(DWORD);
|
||||||
lRet = RegQueryValueExW(hkeyPinKey, wszIsRendered, NULL, &Type, (BYTE *)&value, &size);
|
lRet = RegQueryValueExW(hkeyPinKey, L"IsRendered", NULL, &Type, (BYTE *)&value, &size);
|
||||||
if (lRet != ERROR_SUCCESS || Type != REG_DWORD)
|
if (lRet != ERROR_SUCCESS || Type != REG_DWORD)
|
||||||
goto error_cleanup;
|
goto error_cleanup;
|
||||||
if (value)
|
if (value)
|
||||||
|
@ -391,7 +378,7 @@ static void write_filter_data(IPropertyBag *prop_bag, REGFILTER2 *rgf)
|
||||||
hr = SafeArrayUnaccessData(V_ARRAY(&var));
|
hr = SafeArrayUnaccessData(V_ARRAY(&var));
|
||||||
if (FAILED(hr)) goto cleanup;
|
if (FAILED(hr)) goto cleanup;
|
||||||
|
|
||||||
hr = IPropertyBag_Write(prop_bag, wszFilterData, &var);
|
hr = IPropertyBag_Write(prop_bag, L"FilterData", &var);
|
||||||
if (FAILED(hr)) goto cleanup;
|
if (FAILED(hr)) goto cleanup;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
@ -407,7 +394,7 @@ static void register_legacy_filters(void)
|
||||||
LONG lRet;
|
LONG lRet;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
lRet = RegOpenKeyExW(HKEY_CLASSES_ROOT, wszFilterKeyName, 0, KEY_READ, &hkeyFilter);
|
lRet = RegOpenKeyExW(HKEY_CLASSES_ROOT, L"Filter", 0, KEY_READ, &hkeyFilter);
|
||||||
hr = HRESULT_FROM_WIN32(lRet);
|
hr = HRESULT_FROM_WIN32(lRet);
|
||||||
|
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
|
@ -437,10 +424,7 @@ static void register_legacy_filters(void)
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
lstrcpyW(wszRegKey, clsidW);
|
swprintf(wszRegKey, ARRAY_SIZE(wszRegKey), L"CLSID\\%s", wszFilterSubkeyName);
|
||||||
lstrcatW(wszRegKey, backslashW);
|
|
||||||
lstrcatW(wszRegKey, wszFilterSubkeyName);
|
|
||||||
|
|
||||||
if (RegOpenKeyExW(HKEY_CLASSES_ROOT, wszRegKey, 0, KEY_READ, &classkey) != ERROR_SUCCESS)
|
if (RegOpenKeyExW(HKEY_CLASSES_ROOT, wszRegKey, 0, KEY_READ, &classkey) != ERROR_SUCCESS)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -473,7 +457,7 @@ static void register_legacy_filters(void)
|
||||||
rgf2.dwMerit = MERIT_NORMAL;
|
rgf2.dwMerit = MERIT_NORMAL;
|
||||||
|
|
||||||
len = sizeof(rgf2.dwMerit);
|
len = sizeof(rgf2.dwMerit);
|
||||||
RegQueryValueExW(classkey, wszMeritName, NULL, &Type, (BYTE *)&rgf2.dwMerit, &len);
|
RegQueryValueExW(classkey, L"Merit", NULL, &Type, (BYTE *)&rgf2.dwMerit, &len);
|
||||||
|
|
||||||
DEVENUM_ReadPins(classkey, &rgf2);
|
DEVENUM_ReadPins(classkey, &rgf2);
|
||||||
|
|
||||||
|
@ -490,9 +474,7 @@ static void register_legacy_filters(void)
|
||||||
|
|
||||||
static BOOL CALLBACK register_dsound_devices(GUID *guid, const WCHAR *desc, const WCHAR *module, void *context)
|
static BOOL CALLBACK register_dsound_devices(GUID *guid, const WCHAR *desc, const WCHAR *module, void *context)
|
||||||
{
|
{
|
||||||
static const WCHAR defaultW[] = {'D','e','f','a','u','l','t',' ','D','i','r','e','c','t','S','o','u','n','d',' ','D','e','v','i','c','e',0};
|
static const WCHAR defaultW[] = L"Default DirectSound Device";
|
||||||
static const WCHAR directsoundW[] = {'D','i','r','e','c','t','S','o','u','n','d',':',' ',0};
|
|
||||||
static const WCHAR dsguidW[] = {'D','S','G','u','i','d',0};
|
|
||||||
IPropertyBag *prop_bag = NULL;
|
IPropertyBag *prop_bag = NULL;
|
||||||
REGFILTERPINS2 rgpins = {0};
|
REGFILTERPINS2 rgpins = {0};
|
||||||
REGPINTYPES rgtypes = {0};
|
REGPINTYPES rgtypes = {0};
|
||||||
|
@ -503,11 +485,11 @@ static BOOL CALLBACK register_dsound_devices(GUID *guid, const WCHAR *desc, cons
|
||||||
|
|
||||||
if (guid)
|
if (guid)
|
||||||
{
|
{
|
||||||
WCHAR *name = heap_alloc(sizeof(defaultW) + lstrlenW(desc) * sizeof(WCHAR));
|
WCHAR *name = heap_alloc(sizeof(defaultW) + wcslen(desc) * sizeof(WCHAR));
|
||||||
if (!name)
|
if (!name)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
lstrcpyW(name, directsoundW);
|
wcscpy(name, L"DirectSound: ");
|
||||||
lstrcatW(name, desc);
|
wcscat(name, desc);
|
||||||
|
|
||||||
hr = register_codec(&CLSID_AudioRendererCategory, name,
|
hr = register_codec(&CLSID_AudioRendererCategory, name,
|
||||||
&CLSID_DSoundRender, name, &prop_bag);
|
&CLSID_DSoundRender, name, &prop_bag);
|
||||||
|
@ -537,7 +519,7 @@ static BOOL CALLBACK register_dsound_devices(GUID *guid, const WCHAR *desc, cons
|
||||||
V_VT(&var) = VT_BSTR;
|
V_VT(&var) = VT_BSTR;
|
||||||
StringFromGUID2(guid ? guid : &GUID_NULL, clsid, CHARS_IN_GUID);
|
StringFromGUID2(guid ? guid : &GUID_NULL, clsid, CHARS_IN_GUID);
|
||||||
if ((V_BSTR(&var) = SysAllocString(clsid)))
|
if ((V_BSTR(&var) = SysAllocString(clsid)))
|
||||||
hr = IPropertyBag_Write(prop_bag, dsguidW, &var);
|
hr = IPropertyBag_Write(prop_bag, L"DSGuid", &var);
|
||||||
|
|
||||||
VariantClear(&var);
|
VariantClear(&var);
|
||||||
IPropertyBag_Release(prop_bag);
|
IPropertyBag_Release(prop_bag);
|
||||||
|
@ -546,8 +528,6 @@ static BOOL CALLBACK register_dsound_devices(GUID *guid, const WCHAR *desc, cons
|
||||||
|
|
||||||
static void register_waveout_devices(void)
|
static void register_waveout_devices(void)
|
||||||
{
|
{
|
||||||
static const WCHAR defaultW[] = {'D','e','f','a','u','l','t',' ','W','a','v','e','O','u','t',' ','D','e','v','i','c','e',0};
|
|
||||||
static const WCHAR waveoutidW[] = {'W','a','v','e','O','u','t','I','d',0};
|
|
||||||
IPropertyBag *prop_bag = NULL;
|
IPropertyBag *prop_bag = NULL;
|
||||||
REGFILTERPINS2 rgpins = {0};
|
REGFILTERPINS2 rgpins = {0};
|
||||||
REGPINTYPES rgtypes = {0};
|
REGPINTYPES rgtypes = {0};
|
||||||
|
@ -564,7 +544,7 @@ static void register_waveout_devices(void)
|
||||||
{
|
{
|
||||||
waveOutGetDevCapsW(i, &caps, sizeof(caps));
|
waveOutGetDevCapsW(i, &caps, sizeof(caps));
|
||||||
|
|
||||||
name = (i == -1) ? defaultW : caps.szPname;
|
name = (i == -1) ? L"Default WaveOut Device" : caps.szPname;
|
||||||
|
|
||||||
hr = register_codec(&CLSID_AudioRendererCategory, name,
|
hr = register_codec(&CLSID_AudioRendererCategory, name,
|
||||||
&CLSID_AudioRender, name, &prop_bag);
|
&CLSID_AudioRender, name, &prop_bag);
|
||||||
|
@ -587,7 +567,7 @@ static void register_waveout_devices(void)
|
||||||
/* write WaveOutId */
|
/* write WaveOutId */
|
||||||
V_VT(&var) = VT_I4;
|
V_VT(&var) = VT_I4;
|
||||||
V_I4(&var) = i;
|
V_I4(&var) = i;
|
||||||
IPropertyBag_Write(prop_bag, waveoutidW, &var);
|
IPropertyBag_Write(prop_bag, L"WaveOutId", &var);
|
||||||
|
|
||||||
VariantClear(&var);
|
VariantClear(&var);
|
||||||
if (prop_bag) IPropertyBag_Release(prop_bag);
|
if (prop_bag) IPropertyBag_Release(prop_bag);
|
||||||
|
@ -596,7 +576,6 @@ static void register_waveout_devices(void)
|
||||||
|
|
||||||
static void register_wavein_devices(void)
|
static void register_wavein_devices(void)
|
||||||
{
|
{
|
||||||
static const WCHAR waveinidW[] = {'W','a','v','e','I','n','I','d',0};
|
|
||||||
IPropertyBag *prop_bag = NULL;
|
IPropertyBag *prop_bag = NULL;
|
||||||
REGFILTER2 rgf = {0};
|
REGFILTER2 rgf = {0};
|
||||||
WAVEINCAPSW caps;
|
WAVEINCAPSW caps;
|
||||||
|
@ -624,7 +603,7 @@ static void register_wavein_devices(void)
|
||||||
/* write WaveInId */
|
/* write WaveInId */
|
||||||
V_VT(&var) = VT_I4;
|
V_VT(&var) = VT_I4;
|
||||||
V_I4(&var) = i;
|
V_I4(&var) = i;
|
||||||
IPropertyBag_Write(prop_bag, waveinidW, &var);
|
IPropertyBag_Write(prop_bag, L"WaveInId", &var);
|
||||||
|
|
||||||
VariantClear(&var);
|
VariantClear(&var);
|
||||||
IPropertyBag_Release(prop_bag);
|
IPropertyBag_Release(prop_bag);
|
||||||
|
@ -633,8 +612,6 @@ static void register_wavein_devices(void)
|
||||||
|
|
||||||
static void register_midiout_devices(void)
|
static void register_midiout_devices(void)
|
||||||
{
|
{
|
||||||
static const WCHAR defaultW[] = {'D','e','f','a','u','l','t',' ','M','i','d','i','O','u','t',' ','D','e','v','i','c','e',0};
|
|
||||||
static const WCHAR midioutidW[] = {'M','i','d','i','O','u','t','I','d',0};
|
|
||||||
IPropertyBag *prop_bag = NULL;
|
IPropertyBag *prop_bag = NULL;
|
||||||
REGFILTERPINS2 rgpins = {0};
|
REGFILTERPINS2 rgpins = {0};
|
||||||
REGPINTYPES rgtypes = {0};
|
REGPINTYPES rgtypes = {0};
|
||||||
|
@ -651,7 +628,7 @@ static void register_midiout_devices(void)
|
||||||
{
|
{
|
||||||
midiOutGetDevCapsW(i, &caps, sizeof(caps));
|
midiOutGetDevCapsW(i, &caps, sizeof(caps));
|
||||||
|
|
||||||
name = (i == -1) ? defaultW : caps.szPname;
|
name = (i == -1) ? L"Default MidiOut Device" : caps.szPname;
|
||||||
|
|
||||||
hr = register_codec(&CLSID_MidiRendererCategory, name,
|
hr = register_codec(&CLSID_MidiRendererCategory, name,
|
||||||
&CLSID_AVIMIDIRender, name, &prop_bag);
|
&CLSID_AVIMIDIRender, name, &prop_bag);
|
||||||
|
@ -674,7 +651,7 @@ static void register_midiout_devices(void)
|
||||||
/* write MidiOutId */
|
/* write MidiOutId */
|
||||||
V_VT(&var) = VT_I4;
|
V_VT(&var) = VT_I4;
|
||||||
V_I4(&var) = i;
|
V_I4(&var) = i;
|
||||||
IPropertyBag_Write(prop_bag, midioutidW, &var);
|
IPropertyBag_Write(prop_bag, L"MidiOutId", &var);
|
||||||
|
|
||||||
VariantClear(&var);
|
VariantClear(&var);
|
||||||
IPropertyBag_Release(prop_bag);
|
IPropertyBag_Release(prop_bag);
|
||||||
|
@ -683,7 +660,6 @@ static void register_midiout_devices(void)
|
||||||
|
|
||||||
static void register_vfw_codecs(void)
|
static void register_vfw_codecs(void)
|
||||||
{
|
{
|
||||||
static const WCHAR fcchandlerW[] = {'F','c','c','H','a','n','d','l','e','r',0};
|
|
||||||
REGFILTERPINS2 rgpins[2] = {};
|
REGFILTERPINS2 rgpins[2] = {};
|
||||||
IPropertyBag *prop_bag = NULL;
|
IPropertyBag *prop_bag = NULL;
|
||||||
REGPINTYPES rgtypes[2];
|
REGPINTYPES rgtypes[2];
|
||||||
|
@ -732,7 +708,7 @@ static void register_vfw_codecs(void)
|
||||||
/* write WaveInId */
|
/* write WaveInId */
|
||||||
V_VT(&var) = VT_BSTR;
|
V_VT(&var) = VT_BSTR;
|
||||||
V_BSTR(&var) = SysAllocString(name);
|
V_BSTR(&var) = SysAllocString(name);
|
||||||
IPropertyBag_Write(prop_bag, fcchandlerW, &var);
|
IPropertyBag_Write(prop_bag, L"FccHandler", &var);
|
||||||
|
|
||||||
VariantClear(&var);
|
VariantClear(&var);
|
||||||
IPropertyBag_Release(prop_bag);
|
IPropertyBag_Release(prop_bag);
|
||||||
|
@ -741,13 +717,12 @@ static void register_vfw_codecs(void)
|
||||||
|
|
||||||
static void register_avicap_devices(void)
|
static void register_avicap_devices(void)
|
||||||
{
|
{
|
||||||
static const WCHAR vfwindexW[] = {'V','F','W','I','n','d','e','x',0};
|
|
||||||
WCHAR name[] = {'v','i','d','e','o','0',0};
|
|
||||||
WCHAR friendlyname[32], version[32];
|
WCHAR friendlyname[32], version[32];
|
||||||
IPropertyBag *prop_bag = NULL;
|
IPropertyBag *prop_bag = NULL;
|
||||||
REGFILTERPINS2 rgpins = {0};
|
REGFILTERPINS2 rgpins = {0};
|
||||||
REGPINTYPES rgtypes;
|
REGPINTYPES rgtypes;
|
||||||
REGFILTER2 rgf;
|
REGFILTER2 rgf;
|
||||||
|
WCHAR name[6];
|
||||||
VARIANT var;
|
VARIANT var;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
@ -758,7 +733,7 @@ static void register_avicap_devices(void)
|
||||||
version, ARRAY_SIZE(version)))
|
version, ARRAY_SIZE(version)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
name[5] = '0' + i;
|
swprintf(name, ARRAY_SIZE(name), L"video%d", i);
|
||||||
|
|
||||||
hr = register_codec(&CLSID_VideoInputDeviceCategory, name,
|
hr = register_codec(&CLSID_VideoInputDeviceCategory, name,
|
||||||
&CLSID_VfwCapture, friendlyname, &prop_bag);
|
&CLSID_VfwCapture, friendlyname, &prop_bag);
|
||||||
|
@ -780,7 +755,7 @@ static void register_avicap_devices(void)
|
||||||
/* write VFWIndex */
|
/* write VFWIndex */
|
||||||
V_VT(&var) = VT_I4;
|
V_VT(&var) = VT_I4;
|
||||||
V_I4(&var) = i;
|
V_I4(&var) = i;
|
||||||
IPropertyBag_Write(prop_bag, vfwindexW, &var);
|
IPropertyBag_Write(prop_bag, L"VFWIndex", &var);
|
||||||
|
|
||||||
VariantClear(&var);
|
VariantClear(&var);
|
||||||
IPropertyBag_Release(prop_bag);
|
IPropertyBag_Release(prop_bag);
|
||||||
|
@ -801,7 +776,7 @@ static HRESULT WINAPI devenum_factory_CreateClassEnumerator(ICreateDevEnum *ifac
|
||||||
|
|
||||||
*out = NULL;
|
*out = NULL;
|
||||||
|
|
||||||
if (!RegOpenKeyW(HKEY_CURRENT_USER, wszActiveMovieKey, &key))
|
if (!RegOpenKeyW(HKEY_CURRENT_USER, L"Software\\Microsoft\\ActiveMovie\\devenum", &key))
|
||||||
{
|
{
|
||||||
StringFromGUID2(class, guidstr, ARRAY_SIZE(guidstr));
|
StringFromGUID2(class, guidstr, ARRAY_SIZE(guidstr));
|
||||||
RegDeleteTreeW(key, guidstr);
|
RegDeleteTreeW(key, guidstr);
|
||||||
|
|
|
@ -162,27 +162,17 @@ HRESULT WINAPI DllRegisterServer(void)
|
||||||
&IID_IFilterMapper2, &mapvptr);
|
&IID_IFilterMapper2, &mapvptr);
|
||||||
if (SUCCEEDED(res))
|
if (SUCCEEDED(res))
|
||||||
{
|
{
|
||||||
static const WCHAR friendlyvidcap[] = {'V','i','d','e','o',' ','C','a','p','t','u','r','e',' ','S','o','u','r','c','e','s',0};
|
|
||||||
static const WCHAR friendlydshow[] = {'D','i','r','e','c','t','S','h','o','w',' ','F','i','l','t','e','r','s',0};
|
|
||||||
static const WCHAR friendlyvidcomp[] = {'V','i','d','e','o',' ','C','o','m','p','r','e','s','s','o','r','s',0};
|
|
||||||
static const WCHAR friendlyaudcap[] = {'A','u','d','i','o',' ','C','a','p','t','u','r','e',' ','S','o','u','r','c','e','s',0};
|
|
||||||
static const WCHAR friendlyaudcomp[] = {'A','u','d','i','o',' ','C','o','m','p','r','e','s','s','o','r','s',0};
|
|
||||||
static const WCHAR friendlyaudrend[] = {'A','u','d','i','o',' ','R','e','n','d','e','r','e','r','s',0};
|
|
||||||
static const WCHAR friendlymidirend[] = {'M','i','d','i',' ','R','e','n','d','e','r','e','r','s',0};
|
|
||||||
static const WCHAR friendlyextrend[] = {'E','x','t','e','r','n','a','l',' ','R','e','n','d','e','r','e','r','s',0};
|
|
||||||
static const WCHAR friendlydevctrl[] = {'D','e','v','i','c','e',' ','C','o','n','t','r','o','l',' ','F','i','l','t','e','r','s',0};
|
|
||||||
|
|
||||||
pMapper = mapvptr;
|
pMapper = mapvptr;
|
||||||
|
|
||||||
IFilterMapper2_CreateCategory(pMapper, &CLSID_VideoInputDeviceCategory, MERIT_DO_NOT_USE, friendlyvidcap);
|
IFilterMapper2_CreateCategory(pMapper, &CLSID_AudioCompressorCategory, MERIT_DO_NOT_USE, L"Audio Compressors");
|
||||||
IFilterMapper2_CreateCategory(pMapper, &CLSID_LegacyAmFilterCategory, MERIT_NORMAL, friendlydshow);
|
IFilterMapper2_CreateCategory(pMapper, &CLSID_AudioInputDeviceCategory, MERIT_DO_NOT_USE, L"Audio Capture Sources");
|
||||||
IFilterMapper2_CreateCategory(pMapper, &CLSID_VideoCompressorCategory, MERIT_DO_NOT_USE, friendlyvidcomp);
|
IFilterMapper2_CreateCategory(pMapper, &CLSID_AudioRendererCategory, MERIT_NORMAL, L"Audio Renderers");
|
||||||
IFilterMapper2_CreateCategory(pMapper, &CLSID_AudioInputDeviceCategory, MERIT_DO_NOT_USE, friendlyaudcap);
|
IFilterMapper2_CreateCategory(pMapper, &CLSID_DeviceControlCategory, MERIT_DO_NOT_USE, L"Device Control Filters");
|
||||||
IFilterMapper2_CreateCategory(pMapper, &CLSID_AudioCompressorCategory, MERIT_DO_NOT_USE, friendlyaudcomp);
|
IFilterMapper2_CreateCategory(pMapper, &CLSID_LegacyAmFilterCategory, MERIT_NORMAL, L"DirectShow Filters");
|
||||||
IFilterMapper2_CreateCategory(pMapper, &CLSID_AudioRendererCategory, MERIT_NORMAL, friendlyaudrend);
|
IFilterMapper2_CreateCategory(pMapper, &CLSID_MidiRendererCategory, MERIT_NORMAL, L"Midi Renderers");
|
||||||
IFilterMapper2_CreateCategory(pMapper, &CLSID_MidiRendererCategory, MERIT_NORMAL, friendlymidirend);
|
IFilterMapper2_CreateCategory(pMapper, &CLSID_TransmitCategory, MERIT_DO_NOT_USE, L"External Renderers");
|
||||||
IFilterMapper2_CreateCategory(pMapper, &CLSID_TransmitCategory, MERIT_DO_NOT_USE, friendlyextrend);
|
IFilterMapper2_CreateCategory(pMapper, &CLSID_VideoInputDeviceCategory, MERIT_DO_NOT_USE, L"Video Capture Sources");
|
||||||
IFilterMapper2_CreateCategory(pMapper, &CLSID_DeviceControlCategory, MERIT_DO_NOT_USE, friendlydevctrl);
|
IFilterMapper2_CreateCategory(pMapper, &CLSID_VideoCompressorCategory, MERIT_DO_NOT_USE, L"Video Compressors");
|
||||||
|
|
||||||
IFilterMapper2_Release(pMapper);
|
IFilterMapper2_Release(pMapper);
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,19 +61,3 @@ HRESULT enum_moniker_create(REFCLSID class, IEnumMoniker **enum_mon) DECLSPEC_HI
|
||||||
|
|
||||||
extern ICreateDevEnum devenum_factory DECLSPEC_HIDDEN;
|
extern ICreateDevEnum devenum_factory DECLSPEC_HIDDEN;
|
||||||
extern IParseDisplayName devenum_parser DECLSPEC_HIDDEN;
|
extern IParseDisplayName devenum_parser DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
/**********************************************************************
|
|
||||||
* Global string constant declarations
|
|
||||||
*/
|
|
||||||
|
|
||||||
static const WCHAR backslashW[] = {'\\',0};
|
|
||||||
static const WCHAR clsidW[] = {'C','L','S','I','D',0};
|
|
||||||
static const WCHAR instanceW[] = {'\\','I','n','s','t','a','n','c','e',0};
|
|
||||||
static const WCHAR wszActiveMovieKey[] = {'S','o','f','t','w','a','r','e','\\',
|
|
||||||
'M','i','c','r','o','s','o','f','t','\\',
|
|
||||||
'A','c','t','i','v','e','M','o','v','i','e','\\',
|
|
||||||
'd','e','v','e','n','u','m','\\',0};
|
|
||||||
static const WCHAR deviceW[] = {'@','d','e','v','i','c','e',':',0};
|
|
||||||
static const WCHAR dmoW[] = {'d','m','o',':',0};
|
|
||||||
static const WCHAR swW[] = {'s','w',':',0};
|
|
||||||
static const WCHAR cmW[] = {'c','m',':',0};
|
|
||||||
|
|
|
@ -524,7 +524,7 @@ static HRESULT WINAPI moniker_IsEqual(IMoniker *iface, IMoniker *pmkOtherMoniker
|
||||||
if (SUCCEEDED(IMoniker_GetDisplayName(iface, bind, NULL, &this_name)) &&
|
if (SUCCEEDED(IMoniker_GetDisplayName(iface, bind, NULL, &this_name)) &&
|
||||||
SUCCEEDED(IMoniker_GetDisplayName(pmkOtherMoniker, bind, NULL, &other_name)))
|
SUCCEEDED(IMoniker_GetDisplayName(pmkOtherMoniker, bind, NULL, &other_name)))
|
||||||
{
|
{
|
||||||
int result = lstrcmpiW(this_name, other_name);
|
int result = wcsicmp(this_name, other_name);
|
||||||
CoTaskMemFree(this_name);
|
CoTaskMemFree(this_name);
|
||||||
CoTaskMemFree(other_name);
|
CoTaskMemFree(other_name);
|
||||||
if (!result)
|
if (!result)
|
||||||
|
@ -603,33 +603,30 @@ static HRESULT WINAPI moniker_GetDisplayName(IMoniker *iface, IBindCtx *pbc,
|
||||||
|
|
||||||
if (This->type == DEVICE_DMO)
|
if (This->type == DEVICE_DMO)
|
||||||
{
|
{
|
||||||
buffer = CoTaskMemAlloc((lstrlenW(deviceW) + lstrlenW(dmoW)
|
buffer = CoTaskMemAlloc((12 + 2 * CHARS_IN_GUID + 1) * sizeof(WCHAR));
|
||||||
+ 2 * CHARS_IN_GUID + 1) * sizeof(WCHAR));
|
|
||||||
if (!buffer) return E_OUTOFMEMORY;
|
if (!buffer) return E_OUTOFMEMORY;
|
||||||
|
|
||||||
lstrcpyW(buffer, deviceW);
|
wcscpy(buffer, L"@device:dmo:");
|
||||||
lstrcatW(buffer, dmoW);
|
StringFromGUID2(&This->clsid, buffer + wcslen(buffer), CHARS_IN_GUID);
|
||||||
StringFromGUID2(&This->clsid, buffer + lstrlenW(buffer), CHARS_IN_GUID);
|
StringFromGUID2(&This->class, buffer + wcslen(buffer), CHARS_IN_GUID);
|
||||||
StringFromGUID2(&This->class, buffer + lstrlenW(buffer), CHARS_IN_GUID);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
buffer = CoTaskMemAlloc((lstrlenW(deviceW) + 3 + (This->has_class ? CHARS_IN_GUID : 0)
|
buffer = CoTaskMemAlloc((11 + (This->has_class ? CHARS_IN_GUID : 0)
|
||||||
+ lstrlenW(This->name) + 1) * sizeof(WCHAR));
|
+ wcslen(This->name) + 1) * sizeof(WCHAR));
|
||||||
if (!buffer) return E_OUTOFMEMORY;
|
if (!buffer) return E_OUTOFMEMORY;
|
||||||
|
|
||||||
lstrcpyW(buffer, deviceW);
|
|
||||||
if (This->type == DEVICE_FILTER)
|
if (This->type == DEVICE_FILTER)
|
||||||
lstrcatW(buffer, swW);
|
wcscpy(buffer, L"@device:sw:");
|
||||||
else if (This->type == DEVICE_CODEC)
|
else if (This->type == DEVICE_CODEC)
|
||||||
lstrcatW(buffer, cmW);
|
wcscpy(buffer, L"@device:cm:");
|
||||||
|
|
||||||
if (This->has_class)
|
if (This->has_class)
|
||||||
{
|
{
|
||||||
StringFromGUID2(&This->class, buffer + lstrlenW(buffer), CHARS_IN_GUID);
|
StringFromGUID2(&This->class, buffer + wcslen(buffer), CHARS_IN_GUID);
|
||||||
lstrcatW(buffer, backslashW);
|
wcscat(buffer, L"\\");
|
||||||
}
|
}
|
||||||
lstrcatW(buffer, This->name);
|
wcscat(buffer, This->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
*ppszDisplayName = buffer;
|
*ppszDisplayName = buffer;
|
||||||
|
@ -958,15 +955,14 @@ HRESULT enum_moniker_create(REFCLSID class, IEnumMoniker **out)
|
||||||
object->ref = 1;
|
object->ref = 1;
|
||||||
object->class = *class;
|
object->class = *class;
|
||||||
|
|
||||||
lstrcpyW(buffer, clsidW);
|
wcscpy(buffer, L"CLSID\\");
|
||||||
lstrcatW(buffer, backslashW);
|
StringFromGUID2(class, buffer + wcslen(buffer), CHARS_IN_GUID);
|
||||||
StringFromGUID2(class, buffer + lstrlenW(buffer), CHARS_IN_GUID);
|
wcscat(buffer, L"\\Instance");
|
||||||
lstrcatW(buffer, instanceW);
|
|
||||||
if (RegOpenKeyExW(HKEY_CLASSES_ROOT, buffer, 0, KEY_ENUMERATE_SUB_KEYS, &object->sw_key))
|
if (RegOpenKeyExW(HKEY_CLASSES_ROOT, buffer, 0, KEY_ENUMERATE_SUB_KEYS, &object->sw_key))
|
||||||
object->sw_key = NULL;
|
object->sw_key = NULL;
|
||||||
|
|
||||||
lstrcpyW(buffer, wszActiveMovieKey);
|
wcscpy(buffer, L"Software\\Microsoft\\ActiveMovie\\devenum\\");
|
||||||
StringFromGUID2(class, buffer + lstrlenW(buffer), CHARS_IN_GUID);
|
StringFromGUID2(class, buffer + wcslen(buffer), CHARS_IN_GUID);
|
||||||
if (RegOpenKeyExW(HKEY_CURRENT_USER, buffer, 0, KEY_ENUMERATE_SUB_KEYS, &object->cm_key))
|
if (RegOpenKeyExW(HKEY_CURRENT_USER, buffer, 0, KEY_ENUMERATE_SUB_KEYS, &object->cm_key))
|
||||||
object->cm_key = NULL;
|
object->cm_key = NULL;
|
||||||
|
|
||||||
|
|
|
@ -77,21 +77,21 @@ static HRESULT WINAPI devenum_parser_ParseDisplayName(IParseDisplayName *iface,
|
||||||
|
|
||||||
*ret = NULL;
|
*ret = NULL;
|
||||||
if (eaten)
|
if (eaten)
|
||||||
*eaten = lstrlenW(name);
|
*eaten = wcslen(name);
|
||||||
|
|
||||||
name = wcschr(name, ':') + 1;
|
name = wcschr(name, ':') + 1;
|
||||||
|
|
||||||
if (!wcsncmp(name, swW, 3))
|
if (!wcsncmp(name, L"sw:", 3))
|
||||||
{
|
{
|
||||||
type = DEVICE_FILTER;
|
type = DEVICE_FILTER;
|
||||||
name += 3;
|
name += 3;
|
||||||
}
|
}
|
||||||
else if (!wcsncmp(name, cmW, 3))
|
else if (!wcsncmp(name, L"cm:", 3))
|
||||||
{
|
{
|
||||||
type = DEVICE_CODEC;
|
type = DEVICE_CODEC;
|
||||||
name += 3;
|
name += 3;
|
||||||
}
|
}
|
||||||
else if (!wcsncmp(name, dmoW, 4))
|
else if (!wcsncmp(name, L"dmo:", 4))
|
||||||
{
|
{
|
||||||
type = DEVICE_DMO;
|
type = DEVICE_DMO;
|
||||||
name += 4;
|
name += 4;
|
||||||
|
|
Loading…
Reference in New Issue