79592: [PATCH 3/4 (try2)] mmdevapi: Attempt to determine default devices from the registry

buildbot at kegel.com buildbot at kegel.com
Wed Oct 5 23:22:26 CDT 2011


This is an experimental automated build and test service.
Please feel free to ignore this email while we work the kinks out.

For more info about this message, see http://wiki.winehq.org/BuildBot

The Buildbot has detected a failed build on builder runtests-ati while building Wine.
Full details are available at: http://buildbot.kegel.com/builders/runtests-ati/builds/138 (though maybe not for long, as I'm still reinstalling the buildbot periodically while experimenting)
BUILD FAILED: failed git

Errors:
error: patch failed: dlls/winealsa.drv/Makefile.in:1
error: dlls/winealsa.drv/Makefile.in: patch does not apply
error: patch failed: dlls/winecoreaudio.drv/Makefile.in:1
error: dlls/winecoreaudio.drv/Makefile.in: patch does not apply
error: patch failed: dlls/wineoss.drv/Makefile.in:1
error: dlls/wineoss.drv/Makefile.in: patch does not apply
error: patch failed: programs/winecfg/Makefile.in:1
error: programs/winecfg/Makefile.in: patch does not apply
error: patch failed: programs/winecfg/audio.c:115
error: programs/winecfg/audio.c: patch does not apply
error: patch failed: programs/winecfg/resource.h:174
error: programs/winecfg/resource.h: patch does not apply
error: patch failed: programs/winecfg/winecfg.rc:86
error: programs/winecfg/winecfg.rc: patch does not apply
error: patch failed: dlls/mmdevapi/devenum.c:909
error: dlls/mmdevapi/devenum.c: patch does not apply
error: patch failed: dlls/mmdevapi/main.c:53
error: dlls/mmdevapi/main.c: patch does not apply
error: patch failed: dlls/mmdevapi/mmdevapi.h:75
error: dlls/mmdevapi/mmdevapi.h: patch does not apply

-------------- next part --------------
From: Andrew Eikum <aeikum at codeweavers.com>
Subject: [PATCH 1/4 (try2)] audio: Change winmm import to delayed import
Message-Id: <20111005183934.GA9338 at foghorn.codeweavers.com>
Date: Wed, 5 Oct 2011 13:39:34 -0500

---
 dlls/winealsa.drv/Makefile.in      |    3 ++-
 dlls/winecoreaudio.drv/Makefile.in |    3 ++-
 dlls/wineoss.drv/Makefile.in       |    3 ++-
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/dlls/winealsa.drv/Makefile.in b/dlls/winealsa.drv/Makefile.in
index c5f8cde..336da8b 100644
--- a/dlls/winealsa.drv/Makefile.in
+++ b/dlls/winealsa.drv/Makefile.in
@@ -1,5 +1,6 @@
 MODULE    = winealsa.drv
-IMPORTS   = uuid winmm ole32
+IMPORTS   = uuid ole32
+DELAYIMPORTS = winmm
 EXTRALIBS = @ALSALIBS@
 
 C_SRCS = \
diff --git a/dlls/winecoreaudio.drv/Makefile.in b/dlls/winecoreaudio.drv/Makefile.in
index f0598aa..ff0a500 100644
--- a/dlls/winecoreaudio.drv/Makefile.in
+++ b/dlls/winecoreaudio.drv/Makefile.in
@@ -1,5 +1,6 @@
 MODULE    = winecoreaudio.drv
-IMPORTS   = uuid winmm ole32 user32
+IMPORTS   = uuid ole32 user32
+DELAYIMPORTS = winmm
 EXTRALIBS = @COREAUDIO@
 
 C_SRCS = \
diff --git a/dlls/wineoss.drv/Makefile.in b/dlls/wineoss.drv/Makefile.in
index 61b466b..3edf9d3 100644
--- a/dlls/wineoss.drv/Makefile.in
+++ b/dlls/wineoss.drv/Makefile.in
@@ -1,5 +1,6 @@
 MODULE    = wineoss.drv
-IMPORTS   = uuid winmm ole32 user32
+IMPORTS   = uuid ole32 user32
+DELAYIMPORTS = winmm
 EXTRAINCL = @OSS4INCL@
 
 C_SRCS = \

From: Andrew Eikum <aeikum at codeweavers.com>
Subject: [PATCH 2/4 (try2)] winecfg: Reload winmm for each sound test
Message-Id: <20111005183946.GB9338 at foghorn.codeweavers.com>
Date: Wed, 5 Oct 2011 13:39:46 -0500


Also localize the error dialog while we're in there.
---
 programs/winecfg/Makefile.in |    2 +-
 programs/winecfg/audio.c     |   37 +++++++++++++++++++++++++++++++++++--
 programs/winecfg/resource.h  |    2 ++
 programs/winecfg/winecfg.rc  |    2 ++
 4 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/programs/winecfg/Makefile.in b/programs/winecfg/Makefile.in
index 9aafe32..439dcbc 100644
--- a/programs/winecfg/Makefile.in
+++ b/programs/winecfg/Makefile.in
@@ -1,6 +1,6 @@
 MODULE    = winecfg.exe
 APPMODE   = -mwindows
-IMPORTS   = uuid comdlg32 comctl32 shell32 ole32 winmm shlwapi uxtheme user32 gdi32 advapi32
+IMPORTS   = uuid comdlg32 comctl32 shell32 ole32 shlwapi uxtheme user32 gdi32 advapi32
 
 C_SRCS = \
 	about.c \
diff --git a/programs/winecfg/audio.c b/programs/winecfg/audio.c
index 301e309..2afc926 100644
--- a/programs/winecfg/audio.c
+++ b/programs/winecfg/audio.c
@@ -115,6 +115,40 @@ static void initAudioDlg (HWND hDlg)
     SetDlgItemTextW(hDlg, IDC_AUDIO_DRIVER, display_str);
 }
 
+static void test_sound(void)
+{
+    BOOL (WINAPI *pPlaySoundW)(const WCHAR *, HMODULE, DWORD);
+    HMODULE winmm;
+
+    static const WCHAR winmmW[] = {'w','i','n','m','m','.','d','l','l',0};
+
+    winmm = LoadLibraryW(winmmW);
+    if(!winmm){
+        WINE_ERR("LoadLibrary failed: %u\n", GetLastError());
+        return;
+    }
+
+    pPlaySoundW = (void*)GetProcAddress(winmm, "PlaySoundW");
+    if(!pPlaySoundW){
+        WINE_ERR("GetProcAddress failed: %u\n", GetLastError());
+        FreeLibrary(winmm);
+        return;
+    }
+
+    if(!pPlaySoundW(MAKEINTRESOURCEW(IDW_TESTSOUND), NULL, SND_RESOURCE | SND_SYNC)){
+        WCHAR error_str[256], title_str[256];
+
+        LoadStringW(GetModuleHandle(NULL), IDS_AUDIO_TEST_FAILED,
+                error_str, sizeof(error_str) / sizeof(*error_str));
+        LoadStringW(GetModuleHandle(NULL), IDS_AUDIO_TEST_FAILED_TITLE,
+                title_str, sizeof(title_str) / sizeof(*title_str));
+
+        MessageBoxW(NULL, error_str, title_str, MB_OK | MB_ICONERROR);
+    }
+
+    FreeLibrary(winmm);
+}
+
 INT_PTR CALLBACK
 AudioDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
 {
@@ -122,8 +156,7 @@ AudioDlgProc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
       case WM_COMMAND:
         switch (LOWORD(wParam)) {
           case IDC_AUDIO_TEST:
-              if(!PlaySound(MAKEINTRESOURCE(IDW_TESTSOUND), NULL, SND_RESOURCE | SND_SYNC))
-                  MessageBox(NULL, "Audio test failed!", "Error", MB_OK | MB_ICONERROR);
+              test_sound();
               break;
         }
       case WM_SHOWWINDOW:
diff --git a/programs/winecfg/resource.h b/programs/winecfg/resource.h
index 409accb..89999be 100644
--- a/programs/winecfg/resource.h
+++ b/programs/winecfg/resource.h
@@ -174,6 +174,8 @@
 #define IDS_AUDIO_DRIVER                1302
 #define IDS_AUDIO_DRIVER_NONE           1303
 #define IDW_TESTSOUND                   1308
+#define IDS_AUDIO_TEST_FAILED           1309
+#define IDS_AUDIO_TEST_FAILED_TITLE     1310
 
 /* desktop integration tab */
 #define IDC_THEME_COLORCOMBO            1401
diff --git a/programs/winecfg/winecfg.rc b/programs/winecfg/winecfg.rc
index bdce5b0..bed79e5 100644
--- a/programs/winecfg/winecfg.rc
+++ b/programs/winecfg/winecfg.rc
@@ -86,6 +86,8 @@ STRINGTABLE
 BEGIN
     IDS_AUDIO_DRIVER "Selected driver: %s"
     IDS_AUDIO_DRIVER_NONE "(None)"
+    IDS_AUDIO_TEST_FAILED "Audio test failed!"
+    IDS_AUDIO_TEST_FAILED_TITLE "Error"
 END
 
 STRINGTABLE

From: Andrew Eikum <aeikum at codeweavers.com>
Subject: [PATCH 3/4 (try2)] mmdevapi: Attempt to determine default devices from the registry
Message-Id: <20111005183953.GC9338 at foghorn.codeweavers.com>
Date: Wed, 5 Oct 2011 13:39:53 -0500


This uses a new, Wine-specific registry key
<HKCU\Software\Wine\Drivers\wine<driver>.drv> to determine the correct
device to use for the various defaults. The drivers still supply their
own defaults which will be chosen if no registry entry is defined. For
portability we use a driver-specific key in order to support default
devices for each of the driver backends.
---
 dlls/mmdevapi/devenum.c  |   70 ++++++++++++++++++++++++++++++++++++++++++----
 dlls/mmdevapi/main.c     |    7 ++--
 dlls/mmdevapi/mmdevapi.h |    2 +
 3 files changed, 70 insertions(+), 9 deletions(-)

diff --git a/dlls/mmdevapi/devenum.c b/dlls/mmdevapi/devenum.c
index 6b6cfb6..06a1adf 100644
--- a/dlls/mmdevapi/devenum.c
+++ b/dlls/mmdevapi/devenum.c
@@ -909,21 +909,79 @@ static HRESULT WINAPI MMDevEnum_EnumAudioEndpoints(IMMDeviceEnumerator *iface, E
 static HRESULT WINAPI MMDevEnum_GetDefaultAudioEndpoint(IMMDeviceEnumerator *iface, EDataFlow flow, ERole role, IMMDevice **device)
 {
     MMDevEnumImpl *This = impl_from_IMMDeviceEnumerator(iface);
+    WCHAR reg_key[256];
+    HKEY key;
+    HRESULT hr;
+
+    static const WCHAR slashW[] = {'\\',0};
+    static const WCHAR reg_out_nameW[] = {'D','e','f','a','u','l','t','O','u','t','p','u','t',0};
+    static const WCHAR reg_vout_nameW[] = {'D','e','f','a','u','l','t','V','o','i','c','e','O','u','t','p','u','t',0};
+    static const WCHAR reg_in_nameW[] = {'D','e','f','a','u','l','t','I','n','p','u','t',0};
+    static const WCHAR reg_vin_nameW[] = {'D','e','f','a','u','l','t','V','o','i','c','e','I','n','p','u','t',0};
+
     TRACE("(%p)->(%u,%u,%p)\n", This, flow, role, device);
 
     if (!device)
         return E_POINTER;
+
+    if((flow != eRender && flow != eCapture) ||
+            (role != eConsole && role != eMultimedia && role != eCommunications)){
+        WARN("Unknown flow (%u) or role (%u)\n", flow, role);
+        return E_INVALIDARG;
+    }
+
     *device = NULL;
 
+    if(!drvs.module_name[0])
+        return E_NOTFOUND;
+
+    lstrcpyW(reg_key, drv_keyW);
+    lstrcatW(reg_key, slashW);
+    lstrcatW(reg_key, drvs.module_name);
+
+    if(RegOpenKeyW(HKEY_CURRENT_USER, reg_key, &key) == ERROR_SUCCESS){
+        const WCHAR *reg_x_name, *reg_vx_name;
+        WCHAR def_id[256];
+        DWORD size = sizeof(def_id);
+
+        if(flow == eRender){
+            reg_x_name = reg_out_nameW;
+            reg_vx_name = reg_vout_nameW;
+        }else{
+            reg_x_name = reg_in_nameW;
+            reg_vx_name = reg_vin_nameW;
+        }
+
+        if(role == eCommunications &&
+                RegQueryValueExW(key, reg_vx_name, 0, NULL,
+                    (BYTE*)def_id, &size) == ERROR_SUCCESS){
+            hr = IMMDeviceEnumerator_GetDevice(iface, def_id, device);
+            if(SUCCEEDED(hr)){
+                RegCloseKey(key);
+                return S_OK;
+            }
+
+            TRACE("Unable to find voice device %s\n", wine_dbgstr_w(def_id));
+        }
+
+        if(RegQueryValueExW(key, reg_x_name, 0, NULL,
+                    (BYTE*)def_id, &size) == ERROR_SUCCESS){
+            hr = IMMDeviceEnumerator_GetDevice(iface, def_id, device);
+            if(SUCCEEDED(hr)){
+                RegCloseKey(key);
+                return S_OK;
+            }
+
+            TRACE("Unable to find device %s\n", wine_dbgstr_w(def_id));
+        }
+
+        RegCloseKey(key);
+    }
+
     if (flow == eRender)
         *device = &MMDevice_def_play->IMMDevice_iface;
-    else if (flow == eCapture)
+    else
         *device = &MMDevice_def_rec->IMMDevice_iface;
-    else
-    {
-        WARN("Unknown flow %u\n", flow);
-        return E_INVALIDARG;
-    }
 
     if (!*device)
         return E_NOTFOUND;
diff --git a/dlls/mmdevapi/main.c b/dlls/mmdevapi/main.c
index c2c3562..c0e2ff6 100644
--- a/dlls/mmdevapi/main.c
+++ b/dlls/mmdevapi/main.c
@@ -53,6 +53,9 @@ static HINSTANCE instance;
 
 DriverFuncs drvs;
 
+const WCHAR drv_keyW[] = {'S','o','f','t','w','a','r','e','\\',
+    'W','i','n','e','\\','D','r','i','v','e','r','s',0};
+
 static const char *get_priority_string(int prio)
 {
     switch(prio){
@@ -106,8 +109,6 @@ static BOOL load_driver(const WCHAR *name, DriverFuncs *driver)
 
 static BOOL init_driver(void)
 {
-    static const WCHAR drv_key[] = {'S','o','f','t','w','a','r','e','\\',
-        'W','i','n','e','\\','D','r','i','v','e','r','s',0};
     static const WCHAR drv_value[] = {'A','u','d','i','o',0};
 
     static WCHAR default_list[] = {'a','l','s','a',',','o','s','s',',',
@@ -120,7 +121,7 @@ static BOOL init_driver(void)
     if(drvs.module)
         return TRUE;
 
-    if(RegOpenKeyW(HKEY_CURRENT_USER, drv_key, &key) == ERROR_SUCCESS){
+    if(RegOpenKeyW(HKEY_CURRENT_USER, drv_keyW, &key) == ERROR_SUCCESS){
         DWORD size = sizeof(reg_list);
 
         if(RegQueryValueExW(key, drv_value, 0, NULL, (BYTE*)reg_list,
diff --git a/dlls/mmdevapi/mmdevapi.h b/dlls/mmdevapi/mmdevapi.h
index 6ad1ab3..98e0825 100644
--- a/dlls/mmdevapi/mmdevapi.h
+++ b/dlls/mmdevapi/mmdevapi.h
@@ -75,3 +75,5 @@ typedef struct MMDevice {
 
 extern HRESULT AudioClient_Create(MMDevice *parent, IAudioClient **ppv) DECLSPEC_HIDDEN;
 extern HRESULT AudioEndpointVolume_Create(MMDevice *parent, IAudioEndpointVolume **ppv) DECLSPEC_HIDDEN;
+
+extern const WCHAR drv_keyW[] DECLSPEC_HIDDEN;



More information about the wine-tests-results mailing list