Module: wine Branch: master Commit: 604172dd986a6ff1da89cd6682ef9b8ceac639d3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=604172dd986a6ff1da89cd6682...
Author: Maarten Lankhorst m.b.lankhorst@gmail.com Date: Fri May 10 10:07:09 2013 +0200
devenum: Set FriendlyName and wave*ID for devices.
---
dlls/devenum/createdevenum.c | 54 +++++++++++++++++++++++++++++++++++------- dlls/devenum/mediacatenum.c | 1 + 2 files changed, 46 insertions(+), 9 deletions(-)
diff --git a/dlls/devenum/createdevenum.c b/dlls/devenum/createdevenum.c index 625ff62..b7e288b 100644 --- a/dlls/devenum/createdevenum.c +++ b/dlls/devenum/createdevenum.c @@ -52,6 +52,9 @@ static const WCHAR wszAllowedZero[] = {'A','l','l','o','w','e','d','Z','e','r',' 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 wszWaveInID[] = {'W','a','v','e','I','n','I','D',0}; +static const WCHAR wszWaveOutID[] = {'W','a','v','e','O','u','t','I','D',0};
static ULONG WINAPI DEVENUM_ICreateDevEnum_AddRef(ICreateDevEnum * iface); static HRESULT DEVENUM_CreateSpecialCategories(void); @@ -629,6 +632,7 @@ static HRESULT DEVENUM_CreateSpecialCategories(void) WAVEINCAPSW wicaps; MIDIOUTCAPSW mocaps; REGPINTYPES * pTypes; + IPropertyBag * pPropBag = NULL;
numDevs = waveOutGetNumDevs();
@@ -666,10 +670,24 @@ static HRESULT DEVENUM_CreateSpecialCategories(void) wocaps.szPname, &rf2);
- /* FIXME: do additional stuff with IMoniker here, depending on what RegisterFilter does */ - if (pMoniker) { + VARIANT var; + + V_VT(&var) = VT_I4; + V_UNION(&var, ulVal) = i; + res = IMoniker_BindToStorage(pMoniker, NULL, NULL, &IID_IPropertyBag, (LPVOID)&pPropBag); + if (SUCCEEDED(res)) + res = IPropertyBag_Write(pPropBag, wszWaveOutID, &var); + else + pPropBag = NULL; + + V_VT(&var) = VT_LPWSTR; + V_UNION(&var, bstrVal) = wocaps.szPname; + if (SUCCEEDED(res)) + res = IPropertyBag_Write(pPropBag, wszFriendlyName, &var); + if (pPropBag) + IPropertyBag_Release(pPropBag); IMoniker_Release(pMoniker); pMoniker = NULL; } @@ -725,7 +743,7 @@ static HRESULT DEVENUM_CreateSpecialCategories(void)
rfp2.lpMediaType = pTypes;
- res = IFilterMapper2_RegisterFilter(pMapper, + res = IFilterMapper2_RegisterFilter(pMapper, &CLSID_AudioRecord, wicaps.szPname, &pMoniker, @@ -733,10 +751,27 @@ static HRESULT DEVENUM_CreateSpecialCategories(void) wicaps.szPname, &rf2);
- /* FIXME: do additional stuff with IMoniker here, depending on what RegisterFilter does */
- if (pMoniker) - IMoniker_Release(pMoniker); + if (pMoniker) { + VARIANT var; + + V_VT(&var) = VT_I4; + V_UNION(&var, ulVal) = i; + res = IMoniker_BindToStorage(pMoniker, NULL, NULL, &IID_IPropertyBag, (LPVOID)&pPropBag); + if (SUCCEEDED(res)) + res = IPropertyBag_Write(pPropBag, wszWaveInID, &var); + else + pPropBag = NULL; + + V_VT(&var) = VT_LPWSTR; + V_UNION(&var, bstrVal) = wicaps.szPname; + if (SUCCEEDED(res)) + res = IPropertyBag_Write(pPropBag, wszFriendlyName, &var); + + if (pPropBag) + IPropertyBag_Release(pPropBag); + IMoniker_Release(pMoniker); + }
CoTaskMemFree(pTypes); } @@ -803,7 +838,6 @@ static HRESULT DEVENUM_CreateSpecialCategories(void) szDeviceVersion, sizeof(szDeviceVersion)/sizeof(WCHAR))) { IMoniker * pMoniker = NULL; - IPropertyBag * pPropBag = NULL; WCHAR dprintf[] = { 'v','i','d','e','o','%','d',0 }; snprintfW(szDevicePath, sizeof(szDevicePath)/sizeof(WCHAR), dprintf, i); /* The above code prevents 1 device with a different ID overwriting another */ @@ -834,8 +868,10 @@ static HRESULT DEVENUM_CreateSpecialCategories(void) V_VT(&var) = VT_I4; V_UNION(&var, ulVal) = i; res = IMoniker_BindToStorage(pMoniker, NULL, NULL, &IID_IPropertyBag, (LPVOID)&pPropBag); - if (SUCCEEDED(res)) - res = IPropertyBag_Write(pPropBag, wszVfwIndex, &var); + if (SUCCEEDED(res)) { + res = IPropertyBag_Write(pPropBag, wszVfwIndex, &var); + IPropertyBag_Release(pPropBag); + } IMoniker_Release(pMoniker); }
diff --git a/dlls/devenum/mediacatenum.c b/dlls/devenum/mediacatenum.c index 24d236d..60ba110 100644 --- a/dlls/devenum/mediacatenum.c +++ b/dlls/devenum/mediacatenum.c @@ -232,6 +232,7 @@ static HRESULT WINAPI DEVENUM_IPropertyBag_Write( switch (V_VT(pVar)) { case VT_BSTR: + case VT_LPWSTR: TRACE("writing %s\n", debugstr_w(V_UNION(pVar, bstrVal))); lpData = V_UNION(pVar, bstrVal); dwType = REG_SZ;