[DXDIAGN] Sync with Wine Staging 1.7.55. CORE-10536
authorAmine Khaldi <amine.khaldi@reactos.org>
Tue, 24 Nov 2015 10:59:31 +0000 (10:59 +0000)
committerAmine Khaldi <amine.khaldi@reactos.org>
Tue, 24 Nov 2015 10:59:31 +0000 (10:59 +0000)
svn path=/trunk/; revision=70089

reactos/dll/directx/wine/dxdiagn/CMakeLists.txt
reactos/dll/directx/wine/dxdiagn/container.c
reactos/dll/directx/wine/dxdiagn/fil_data.idl
reactos/dll/directx/wine/dxdiagn/provider.c
reactos/media/doc/README.WINE

index a2c71b3..6795c10 100644 (file)
@@ -19,6 +19,6 @@ add_library(dxdiagn SHARED
 set_module_type(dxdiagn win32dll)
 target_link_libraries(dxdiagn strmiids dxguid uuid wine)
 add_dependencies(dxdiagn dxdiagn_idlheader)
-add_importlibs(dxdiagn d3d9 ddraw version ole32 oleaut32 psapi user32 msvcrt kernel32 ntdll)
+add_importlibs(dxdiagn d3d9 ddraw version ole32 oleaut32 psapi user32 dsound msvcrt kernel32 ntdll)
 add_pch(dxdiagn dxdiag_private.h SOURCE)
 add_cd_file(TARGET dxdiagn DESTINATION reactos/system32 FOR all)
index dd587c3..d13db45 100644 (file)
@@ -155,6 +155,14 @@ static HRESULT WINAPI IDxDiagContainerImpl_GetChildContainer(IDxDiagContainer *i
   if (NULL == tmp) return E_FAIL;
   lstrcpynW(tmp, pwszContainer, tmp_len);
 
+  /* special handling for an empty string and leaf container */
+  if (!tmp[0] && list_empty(&pContainer->subContainers)) {
+    hr = DXDiag_CreateDXDiagContainer(&IID_IDxDiagContainer, pContainer, This->pProv, (void **)ppInstance);
+    if (SUCCEEDED(hr))
+      TRACE("Succeeded in getting the container instance\n");
+    goto out;
+  }
+
   cur = strchrW(tmp, '.');
   while (NULL != cur) {
     *cur = '\0'; /* cut tmp string to '.' */
@@ -162,7 +170,7 @@ static HRESULT WINAPI IDxDiagContainerImpl_GetChildContainer(IDxDiagContainer *i
     TRACE("Trying to get parent container %s\n", debugstr_w(tmp));
     hr = IDxDiagContainerImpl_GetChildContainerInternal(pContainer, tmp, &pContainer);
     if (FAILED(hr))
-      goto on_error;
+      goto out;
     cur++; /* go after '.' (just replaced by \0) */
     tmp = cur;
     cur = strchrW(tmp, '.');
@@ -176,7 +184,7 @@ static HRESULT WINAPI IDxDiagContainerImpl_GetChildContainer(IDxDiagContainer *i
         TRACE("Succeeded in getting the container instance\n");
   }
 
-on_error:
+out:
   HeapFree(GetProcessHeap(), 0, orig_tmp);
   return hr;
 }
index 806c053..7e37a75 100644 (file)
@@ -16,6 +16,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+#pragma makedep header
+
 import "objidl.idl";
 import "strmif.idl";
 import "unknwn.idl";
index 6d2067f..e705e0a 100644 (file)
 
 #include <winver.h>
 #include <uuids.h>
+#include <mmddk.h>
 #include <d3d9.h>
 #include <fil_data.h>
 #include <psapi.h>
 #include <wbemcli.h>
+#include <dsound.h>
 
 static const WCHAR szEmpty[] = {0};
 
@@ -321,7 +323,7 @@ static inline HRESULT add_bool_property(IDxDiagContainerImpl_Container *node, co
         return E_OUTOFMEMORY;
 
     V_VT(&prop->vProp) = VT_BOOL;
-    V_BOOL(&prop->vProp) = data;
+    V_BOOL(&prop->vProp) = data ? VARIANT_TRUE : VARIANT_FALSE;
 
     list_add_tail(&node->properties, &prop->entry);
     ++node->nProperties;
@@ -1175,11 +1177,85 @@ static HRESULT build_displaydevices_tree(IDxDiagContainerImpl_Container *node)
     return fill_display_information_fallback(node);
 }
 
+struct enum_context
+{
+    IDxDiagContainerImpl_Container *cont;
+    HRESULT hr;
+    int index;
+};
+
+static const WCHAR szGUIDFmt[] =
+{
+    '%','0','8','x','-','%','0','4','x','-','%','0','4','x','-','%','0',
+    '2','x','%','0','2','x','-','%','0','2','x','%','0','2','x','%','0','2',
+    'x','%','0','2','x','%','0','2','x','%','0','2','x',0
+};
+
+static LPWSTR guid_to_string(LPWSTR lpwstr, REFGUID lpcguid)
+{
+    wsprintfW(lpwstr, szGUIDFmt, lpcguid->Data1, lpcguid->Data2,
+        lpcguid->Data3, lpcguid->Data4[0], lpcguid->Data4[1],
+        lpcguid->Data4[2], lpcguid->Data4[3], lpcguid->Data4[4],
+        lpcguid->Data4[5], lpcguid->Data4[6], lpcguid->Data4[7]);
+
+    return lpwstr;
+}
+
+BOOL CALLBACK dsound_enum(LPGUID guid, LPCWSTR desc, LPCWSTR module, LPVOID context)
+{
+    static const WCHAR deviceid_fmtW[] = {'%','u',0};
+    static const WCHAR szGuidDeviceID[] = {'s','z','G','u','i','d','D','e','v','i','c','e','I','D',0};
+    static const WCHAR szDriverPath[] = {'s','z','D','r','i','v','e','r','P','a','t','h',0};
+
+    struct enum_context *enum_ctx = context;
+    IDxDiagContainerImpl_Container *device;
+    WCHAR buffer[256];
+    const WCHAR *p, *name;
+
+    /* the default device is enumerated twice, one time without GUID */
+    if (!guid) return TRUE;
+
+    snprintfW(buffer, sizeof(buffer)/sizeof(WCHAR), deviceid_fmtW, enum_ctx->index);
+    device = allocate_information_node(buffer);
+    if (!device)
+    {
+        enum_ctx->hr = E_OUTOFMEMORY;
+        return FALSE;
+    }
+
+    add_subcontainer(enum_ctx->cont, device);
+
+    guid_to_string(buffer, guid);
+    enum_ctx->hr = add_bstr_property(device, szGuidDeviceID, buffer);
+    if (FAILED(enum_ctx->hr))
+        return FALSE;
+
+    enum_ctx->hr = add_bstr_property(device, szDescription, desc);
+    if (FAILED(enum_ctx->hr))
+        return FALSE;
+
+    enum_ctx->hr = add_bstr_property(device, szDriverPath, module);
+    if (FAILED(enum_ctx->hr))
+        return FALSE;
+
+    name = module;
+    if ((p = strrchrW(name, '\\'))) name = p + 1;
+    if ((p = strrchrW(name, '/'))) name = p + 1;
+
+    enum_ctx->hr = add_bstr_property(device, szDriverName, name);
+    if (FAILED(enum_ctx->hr))
+        return FALSE;
+
+    enum_ctx->index++;
+    return TRUE;
+}
+
 static HRESULT build_directsound_tree(IDxDiagContainerImpl_Container *node)
 {
     static const WCHAR DxDiag_SoundDevices[] = {'D','x','D','i','a','g','_','S','o','u','n','d','D','e','v','i','c','e','s',0};
     static const WCHAR DxDiag_SoundCaptureDevices[] = {'D','x','D','i','a','g','_','S','o','u','n','d','C','a','p','t','u','r','e','D','e','v','i','c','e','s',0};
 
+    struct enum_context enum_ctx;
     IDxDiagContainerImpl_Container *cont;
 
     cont = allocate_information_node(DxDiag_SoundDevices);
@@ -1188,12 +1264,28 @@ static HRESULT build_directsound_tree(IDxDiagContainerImpl_Container *node)
 
     add_subcontainer(node, cont);
 
+    enum_ctx.cont = cont;
+    enum_ctx.hr = S_OK;
+    enum_ctx.index = 0;
+
+    DirectSoundEnumerateW(dsound_enum, &enum_ctx);
+    if (FAILED(enum_ctx.hr))
+        return enum_ctx.hr;
+
     cont = allocate_information_node(DxDiag_SoundCaptureDevices);
     if (!cont)
         return E_OUTOFMEMORY;
 
     add_subcontainer(node, cont);
 
+    enum_ctx.cont = cont;
+    enum_ctx.hr = S_OK;
+    enum_ctx.index = 0;
+
+    DirectSoundCaptureEnumerateW(dsound_enum, &enum_ctx);
+    if (FAILED(enum_ctx.hr))
+        return enum_ctx.hr;
+
     return S_OK;
 }
 
index 99b6aa4..4f3ee66 100644 (file)
@@ -36,7 +36,7 @@ reactos/dll/directx/wine/dmusic         # Synced to WineStaging-1.7.47
 reactos/dll/directx/wine/dplay          # Synced to WineStaging-1.7.47
 reactos/dll/directx/wine/dplayx         # Synced to WineStaging-1.7.55
 reactos/dll/directx/wine/dsound         # Synced to Wine-1.3.29
-reactos/dll/directx/wine/dxdiagn        # Synced to WineStaging-1.7.47
+reactos/dll/directx/wine/dxdiagn        # Synced to WineStaging-1.7.55
 reactos/dll/directx/wine/msdmo          # Synced to WineStaging-1.7.47
 reactos/dll/directx/wine/qedit          # Synced to WineStaging-1.7.37
 reactos/dll/directx/wine/quartz         # Synced to WineStaging-1.7.47