dxdiagn: Enumerate DirectSound devices and add some basic properties.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=32613 Signed-off-by: Gijs Vermeulen <gijsvrm@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
74f95d9ff2
commit
b1eedc7b6f
|
@ -1,5 +1,5 @@
|
||||||
MODULE = dxdiagn.dll
|
MODULE = dxdiagn.dll
|
||||||
IMPORTS = strmiids dxguid uuid d3d9 ddraw version ole32 oleaut32 user32 advapi32
|
IMPORTS = strmiids dxguid uuid d3d9 ddraw dsound version ole32 oleaut32 user32 advapi32
|
||||||
|
|
||||||
EXTRADLLFLAGS = -mno-cygwin
|
EXTRADLLFLAGS = -mno-cygwin
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include "wine/fil_data.h"
|
#include "wine/fil_data.h"
|
||||||
#include "psapi.h"
|
#include "psapi.h"
|
||||||
#include "wbemcli.h"
|
#include "wbemcli.h"
|
||||||
|
#include "dsound.h"
|
||||||
|
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
|
||||||
|
@ -1364,11 +1365,73 @@ static HRESULT build_displaydevices_tree(IDxDiagContainerImpl_Container *node)
|
||||||
return fill_display_information_fallback(node);
|
return fill_display_information_fallback(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct enum_context
|
||||||
|
{
|
||||||
|
IDxDiagContainerImpl_Container *cont;
|
||||||
|
HRESULT hr;
|
||||||
|
int index;
|
||||||
|
};
|
||||||
|
|
||||||
|
static LPWSTR guid_to_string(LPWSTR lpwstr, REFGUID lpcguid)
|
||||||
|
{
|
||||||
|
wsprintfW(lpwstr, L"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", 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)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
|
||||||
|
swprintf(buffer, ARRAY_SIZE(buffer), L"%u", 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, L"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, L"szDriverPath", module);
|
||||||
|
if (FAILED(enum_ctx->hr))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
name = module;
|
||||||
|
if ((p = wcsrchr(name, '\\'))) name = p + 1;
|
||||||
|
if ((p = wcsrchr(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 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_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};
|
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;
|
IDxDiagContainerImpl_Container *cont;
|
||||||
|
|
||||||
cont = allocate_information_node(DxDiag_SoundDevices);
|
cont = allocate_information_node(DxDiag_SoundDevices);
|
||||||
|
@ -1377,12 +1440,28 @@ static HRESULT build_directsound_tree(IDxDiagContainerImpl_Container *node)
|
||||||
|
|
||||||
add_subcontainer(node, cont);
|
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);
|
cont = allocate_information_node(DxDiag_SoundCaptureDevices);
|
||||||
if (!cont)
|
if (!cont)
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
|
|
||||||
add_subcontainer(node, cont);
|
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;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -922,6 +922,110 @@ cleanup:
|
||||||
IDxDiagProvider_Release(pddp);
|
IDxDiagProvider_Release(pddp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_DxDiag_SoundDevices(void)
|
||||||
|
{
|
||||||
|
static const struct property_test property_tests[] =
|
||||||
|
{
|
||||||
|
{L"szDescription", VT_BSTR},
|
||||||
|
{L"szGuidDeviceID", VT_BSTR},
|
||||||
|
{L"szDriverName", VT_BSTR},
|
||||||
|
{L"szDriverPath", VT_BSTR},
|
||||||
|
};
|
||||||
|
|
||||||
|
IDxDiagContainer *sound_cont = NULL;
|
||||||
|
DWORD count, i;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
if (!create_root_IDxDiagContainer())
|
||||||
|
{
|
||||||
|
skip("Unable to create the root IDxDiagContainer\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = IDxDiagContainer_GetChildContainer(pddc, L"DxDiag_DirectSound.DxDiag_SoundDevices", &sound_cont);
|
||||||
|
ok(hr == S_OK, "Expected IDxDiagContainer::GetChildContainer to return S_OK, got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
hr = IDxDiagContainer_GetNumberOfProps(sound_cont, &count);
|
||||||
|
ok(hr == S_OK, "Expected IDxDiagContainer::GetNumberOfProps to return S_OK, got 0x%08x\n", hr);
|
||||||
|
ok(count == 0, "Expected count to be 0, got %u\n", count);
|
||||||
|
|
||||||
|
hr = IDxDiagContainer_GetNumberOfChildContainers(sound_cont, &count);
|
||||||
|
ok(hr == S_OK, "Expected IDxDiagContainer::GetNumberOfChildContainers to return S_OK, got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
WCHAR child_container[256];
|
||||||
|
IDxDiagContainer *child;
|
||||||
|
|
||||||
|
hr = IDxDiagContainer_EnumChildContainerNames(sound_cont, i, child_container, ARRAY_SIZE(child_container));
|
||||||
|
ok(hr == S_OK, "Expected IDxDiagContainer::EnumChildContainerNames to return S_OK, got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
hr = IDxDiagContainer_GetChildContainer(sound_cont, child_container, &child);
|
||||||
|
ok(hr == S_OK, "Expected IDxDiagContainer::GetChildContainer to return S_OK, got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
trace("Testing container %s\n", wine_dbgstr_w(child_container));
|
||||||
|
test_container_properties(child, property_tests, ARRAY_SIZE(property_tests));
|
||||||
|
|
||||||
|
IDxDiagContainer_Release(child);
|
||||||
|
}
|
||||||
|
|
||||||
|
IDxDiagContainer_Release(sound_cont);
|
||||||
|
IDxDiagContainer_Release(pddc);
|
||||||
|
IDxDiagProvider_Release(pddp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_DxDiag_SoundCaptureDevices(void)
|
||||||
|
{
|
||||||
|
static const struct property_test property_tests[] =
|
||||||
|
{
|
||||||
|
{L"szDescription", VT_BSTR},
|
||||||
|
{L"szGuidDeviceID", VT_BSTR},
|
||||||
|
{L"szDriverName", VT_BSTR},
|
||||||
|
{L"szDriverPath", VT_BSTR},
|
||||||
|
};
|
||||||
|
|
||||||
|
IDxDiagContainer *sound_cont = NULL;
|
||||||
|
DWORD count, i;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
if (!create_root_IDxDiagContainer())
|
||||||
|
{
|
||||||
|
skip("Unable to create the root IDxDiagContainer\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = IDxDiagContainer_GetChildContainer(pddc, L"DxDiag_DirectSound.DxDiag_SoundCaptureDevices", &sound_cont);
|
||||||
|
ok(hr == S_OK, "Expected IDxDiagContainer::GetChildContainer to return S_OK, got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
hr = IDxDiagContainer_GetNumberOfProps(sound_cont, &count);
|
||||||
|
ok(hr == S_OK, "Expected IDxDiagContainer::GetNumberOfProps to return S_OK, got 0x%08x\n", hr);
|
||||||
|
ok(count == 0, "Expected count to be 0, got %u\n", count);
|
||||||
|
|
||||||
|
hr = IDxDiagContainer_GetNumberOfChildContainers(sound_cont, &count);
|
||||||
|
ok(hr == S_OK, "Expected IDxDiagContainer::GetNumberOfChildContainers to return S_OK, got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
WCHAR child_container[256];
|
||||||
|
IDxDiagContainer *child;
|
||||||
|
|
||||||
|
hr = IDxDiagContainer_EnumChildContainerNames(sound_cont, i, child_container, ARRAY_SIZE(child_container));
|
||||||
|
ok(hr == S_OK, "Expected IDxDiagContainer::EnumChildContainerNames to return S_OK, got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
hr = IDxDiagContainer_GetChildContainer(sound_cont, child_container, &child);
|
||||||
|
ok(hr == S_OK, "Expected IDxDiagContainer::GetChildContainer to return S_OK, got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
trace("Testing container %s\n", wine_dbgstr_w(child_container));
|
||||||
|
test_container_properties(child, property_tests, ARRAY_SIZE(property_tests));
|
||||||
|
|
||||||
|
IDxDiagContainer_Release(child);
|
||||||
|
}
|
||||||
|
|
||||||
|
IDxDiagContainer_Release(sound_cont);
|
||||||
|
IDxDiagContainer_Release(pddc);
|
||||||
|
IDxDiagProvider_Release(pddp);
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(container)
|
START_TEST(container)
|
||||||
{
|
{
|
||||||
CoInitialize(NULL);
|
CoInitialize(NULL);
|
||||||
|
@ -936,5 +1040,7 @@ START_TEST(container)
|
||||||
test_root_children();
|
test_root_children();
|
||||||
test_DxDiag_SystemInfo();
|
test_DxDiag_SystemInfo();
|
||||||
test_DxDiag_DisplayDevices();
|
test_DxDiag_DisplayDevices();
|
||||||
|
test_DxDiag_SoundDevices();
|
||||||
|
test_DxDiag_SoundCaptureDevices();
|
||||||
CoUninitialize();
|
CoUninitialize();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue