[PATCH v2 0/2] MR11083: mmdevapi: Reverse load_devices_from_reg() as outputs then inputs
https://bugs.winehq.org/show_bug.cgi?id=59830 -- v2: mmdevapi/tests: Check EnumAudioEndpoints eAll lists eRender first when exists same as MS https://gitlab.winehq.org/wine/wine/-/merge_requests/11083
From: Stian Low <wineryyyyy@gmail.com> https://bugs.winehq.org/show_bug.cgi?id=59830 --- dlls/mmdevapi/devenum.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/dlls/mmdevapi/devenum.c b/dlls/mmdevapi/devenum.c index 11d20f29957..409307a56ea 100644 --- a/dlls/mmdevapi/devenum.c +++ b/dlls/mmdevapi/devenum.c @@ -588,8 +588,8 @@ HRESULT load_devices_from_reg(void) if (ret == ERROR_SUCCESS) ret = RegCreateKeyExW(root, L"Render", 0, NULL, 0, KEY_READ|KEY_WRITE|KEY_WOW64_64KEY, NULL, &key_render, NULL); RegCloseKey(root); - cur = key_capture; - curflow = eCapture; + cur = key_render; + curflow = eRender; if (ret != ERROR_SUCCESS) { RegCloseKey(key_capture); @@ -608,10 +608,10 @@ HRESULT load_devices_from_reg(void) ret = RegEnumKeyExW(cur, i++, guidvalue, &len, NULL, NULL, NULL, NULL); if (ret == ERROR_NO_MORE_ITEMS) { - if (cur == key_capture) + if (cur == key_render) { - cur = key_render; - curflow = eRender; + cur = key_capture; + curflow = eCapture; i = 0; continue; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11083
From: Stian Low <wineryyyyy@gmail.com> https://bugs.winehq.org/show_bug.cgi?id=59830 --- dlls/mmdevapi/tests/propstore.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/dlls/mmdevapi/tests/propstore.c b/dlls/mmdevapi/tests/propstore.c index 2ed2afa4b58..cd1ea9d9d77 100644 --- a/dlls/mmdevapi/tests/propstore.c +++ b/dlls/mmdevapi/tests/propstore.c @@ -38,7 +38,7 @@ static const WCHAR software_renderW[] = L"Software\\Microsoft\\Windows\\CurrentVersion\\MMDevices\\Audio\\Render"; -static void test_propertystore(IPropertyStore *store) +static void test_propertystore(IPropertyStore *store, IMMDeviceEnumerator *mme, int i) { const WAVEFORMATEXTENSIBLE *format; WCHAR temp[256]; @@ -56,11 +56,28 @@ static void test_propertystore(IPropertyStore *store) hr = IPropertyStore_GetValue(store, (const PROPERTYKEY*)&DEVPKEY_DeviceInterface_FriendlyName, &pv); ok(hr == S_OK, "Failed with %08lx\n", hr); ok(pv.vt == VT_LPWSTR && pv.pwszVal, "FriendlyName value had wrong type: 0x%x or was NULL\n", pv.vt); + trace("FriendlyName: %s\n", debugstr_w(pv.pwszVal)); pv2.vt = VT_EMPTY; hr = IPropertyStore_GetValue(store, (const PROPERTYKEY*)&DEVPKEY_Device_DeviceDesc, &pv2); ok(hr == S_OK, "Failed with %#lx\n", hr); ok(pv2.vt == VT_LPWSTR && pv2.pwszVal, "Device_DeviceDesc value had wrong type: %#x or was NULL\n", pv2.vt); + trace("DeviceDesc...: %s\n", debugstr_w(pv2.pwszVal)); + + if (i == 0) + { + IMMDeviceCollection *collection; + unsigned count; + trace("EnumAudioEndpoints eAll[0] eRender listed first?\n"); + hr = IMMDeviceEnumerator_EnumAudioEndpoints(mme, eRender, DEVICE_STATE_ACTIVE, &collection); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + hr = IMMDeviceCollection_GetCount(collection, &count); + ok(hr == S_OK, "Got hr %#lx.\n", hr); + if (count > 0) + { + ok(!wcscmp(L"Speakers", pv2.pwszVal), "Expected EnumAudioEndpoints eAll[0] to be eRender but DeviceDesc != 'Speakers'\n"); + } + } swprintf(temp, ARRAY_SIZE(temp), L"%ls (%ls)", pv2.pwszVal, pv.pwszVal); @@ -235,7 +252,7 @@ START_TEST(propstore) hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, (void**)&mme); ok(hr == S_OK, "Got hr %#lx.\n", hr); - hr = IMMDeviceEnumerator_EnumAudioEndpoints(mme, eRender, DEVICE_STATE_ACTIVE, &collection); + hr = IMMDeviceEnumerator_EnumAudioEndpoints(mme, eAll, DEVICE_STATE_ACTIVE, &collection); ok(hr == S_OK, "Got hr %#lx.\n", hr); hr = IMMDeviceCollection_GetCount(collection, &count); ok(hr == S_OK, "Got hr %#lx.\n", hr); @@ -265,7 +282,7 @@ START_TEST(propstore) hr = IMMDevice_OpenPropertyStore(dev, STGM_READ, &store); ok(hr == S_OK, "Opening valid store returned %08lx\n", hr); - test_propertystore(store); + test_propertystore(store, mme, i); test_deviceinterface(store); test_getat(store); if (is_wow64) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11083
On Sun Jun 7 05:29:41 2026 +0000, Huw Davies wrote:
Could we have a test for this please? Successful test for windows:
``` mmdevapi_test.exe propstore propstore.c:52: guid: L"{58518DD1-E7D7-4A16-B873-6C2316DFF578}" propstore.c:59: FriendlyName: L"Senary Audio" propstore.c:65: DeviceDesc...: L"Speakers" propstore.c:71: EnumAudioEndpoints eAll[0] eRender listed first? propstore.c:134: device interface: L"{2}.\\\\?\\hdaudio#func_01&ven_14f1&dev_1f86&subsys_17aa50d6&rev_1001#5&22f6cf6e&0&0001#{6994ad04-93ef-11d0-a3cc-00a0c9223196}\\offloadedrearlineoutwave" propstore.c:52: guid: L"{98984C38-26DE-4A63-AF86-9EA6E86CC484}" propstore.c:59: FriendlyName: L"AMD Audio Device" propstore.c:65: DeviceDesc...: L"Microphone Array" propstore.c:134: device interface: L"{2}.\\\\?\\acp#ven_1022&dev_15e2&subsys_17aa50d6#5&315ea642&0&04#{6994ad04-93ef-11d0-a3cc-00a0c9223196}\\wavemicin0" 2efc:propstore: 307 tests executed (0 marked as todo, 0 as flaky, 0 failures), 0 skipped. ``` Fails for wine: ``` propstore.c:78:Test failed:Expected EnumAudioEndpoints eAll[0] to be eRender but DeviceDesc != 'Speakers' 0020:propstore:248 tests executed(12 marked as todo,0 as flaky,1failure),0 skipped. ``` Succeeds after patch: ``` propstore.c:52:guid:L"{5DA32DD4-68DA-490F-97E4-FEE2AEE31124}" propstore.c:59:FriendlyName:L"PulseAudio Output" propstore.c:65:DeviceDesc...:L"Speakers" propstore.c:71:EnumAudioEndpoints eAll[0] eRender listed first? propstore.c:115:Test marked todo:Got bit depth32 propstore.c:116:Test marked todo:Got subformat{00000003-0000-0010-8000-00aa00389b71} propstore.c:134:device interface:L"{5DA32DD4-68DA-490F-97E4-FEE2AEE31124}" propstore.c:52:guid:L"{CBBA4A74-CB19-4EBB-8226-84E7D3B7FEA4}" propstore.c:59:FriendlyName:L"Ryzen HD Audio Controller Speaker" propstore.c:65:DeviceDesc...:L"Speakers" propstore.c:115:Test marked todo:Got bit depth32 propstore.c:116:Test marked todo:Got subformat{00000003-0000-0010-8000-00aa00389b71} propstore.c:134:device interface:L"{CBBA4A74-CB19-4EBB-8226-84E7D3B7FEA4}" propstore.c:52:guid:L"{68FF3071-DD8F-4FFD-B591-488858703026}" propstore.c:59:FriendlyName:L"Ryzen HD Audio Controller Stereo Microphone" propstore.c:65:DeviceDesc...:L"Microphone" propstore.c:115:Test marked todo:Got bit depth32 propstore.c:116:Test marked todo:Got subformat{00000003-0000-0010-8000-00aa00389b71} propstore.c:134:device interface:L"{68FF3071-DD8F-4FFD-B591-488858703026}" propstore.c:52:guid:L"{70129AC8-F281-4A2E-9C50-268651EC4FD8}" propstore.c:59:FriendlyName:L"PulseAudio Input" propstore.c:65:DeviceDesc...:L"Microphone" propstore.c:115:Test marked todo:Got bit depth32 propstore.c:116:Test marked todo:Got subformat{00000003-0000-0010-8000-00aa00389b71} propstore.c:134:device interface:L"{70129AC8-F281-4A2E-9C50-268651EC4FD8}" propstore.c:52:guid:L"{76242D59-593A-43DC-9EA7-0194E8E02687}" propstore.c:59:FriendlyName:L"Ryzen HD Audio Controller Digital Microphone" propstore.c:65:DeviceDesc...:L"Microphone" propstore.c:115:Test marked todo:Got bit depth32 propstore.c:116:Test marked todo:Got subformat{00000003-0000-0010-8000-00aa00389b71} propstore.c:134:device interface:L"{76242D59-593A-43DC-9EA7-0194E8E02687}" propstore.c:52:guid:L"{988FB763-AE4E-4001-A3A9-60C5F9BDFC48}" propstore.c:59:FriendlyName:L"Monitor of Ryzen HD Audio Controller Speaker" propstore.c:65:DeviceDesc...:L"Microphone" propstore.c:115:Test marked todo:Got bit depth32 propstore.c:116:Test marked todo:Got subformat{00000003-0000-0010-8000-00aa00389b71} propstore.c:134:device interface:L"{988FB763-AE4E-4001-A3A9-60C5F9BDFC48}" 0020:propstore:248 tests executed(12 marked as todo,0 as flaky,0failures),0 skipped. ``` -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11083#note_142371
participants (2)
-
Stian Low -
Stian Low (@stianlow)