[MMDEVAPI] Sync with Wine Staging 3.3. CORE-14434
[reactos.git] / dll / win32 / mmdevapi / main.c
index 63432de..2b0a6f9 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
+#include "config.h"
+#include "wine/port.h"
+
+#include <stdarg.h>
+
+#define COBJMACROS
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "wine/library.h"
+
+#include "ole2.h"
+#include "olectl.h"
+#include "rpcproxy.h"
+#include "propsys.h"
+#include "propkeydef.h"
+#include "mmdeviceapi.h"
+#include "mmsystem.h"
+#include "dsound.h"
+#include "audioclient.h"
+#include "endpointvolume.h"
+#include "audiopolicy.h"
+#include "devpkey.h"
+#include "winreg.h"
+
 #include "mmdevapi.h"
+#include "wine/debug.h"
+#include "wine/unicode.h"
 
-#include <rpcproxy.h>
+WINE_DEFAULT_DEBUG_CHANNEL(mmdevapi);
 
 static HINSTANCE instance;
 
@@ -70,6 +97,9 @@ static BOOL load_driver(const WCHAR *name, DriverFuncs *driver)
     LDFC(GetAudioSessionManager);
 #undef LDFC
 
+    /* optional - do not fail if not found */
+    driver->pGetPropValue = (void*)GetProcAddress(driver->module, "GetPropValue");
+
     driver->priority = driver->pGetPriority();
     lstrcpyW(driver->module_name, driver_module);
 
@@ -79,20 +109,17 @@ static BOOL load_driver(const WCHAR *name, DriverFuncs *driver)
     return TRUE;
 }
 
-static BOOL init_driver(void)
+static BOOL WINAPI init_driver(INIT_ONCE *once, void *param, void **context)
 {
     static const WCHAR drv_value[] = {'A','u','d','i','o',0};
 
-    static WCHAR default_list[] = {'a','l','s','a',',','o','s','s',',',
-        'c','o','r','e','a','u','d','i','o',0};
+    static WCHAR default_list[] = {'p','u','l','s','e',',','a','l','s','a',',','o','s','s',',',
+        'c','o','r','e','a','u','d','i','o',',','a','n','d','r','o','i','d',0};
 
     DriverFuncs driver;
     HKEY key;
     WCHAR reg_list[256], *p, *next, *driver_list = default_list;
 
-    if(drvs.module)
-        return TRUE;
-
     if(RegOpenKeyW(HKEY_CURRENT_USER, drv_keyW, &key) == ERROR_SUCCESS){
         DWORD size = sizeof(reg_list);
 
@@ -246,10 +273,11 @@ static IClassFactoryImpl MMDEVAPI_CF[] = {
 
 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
 {
+    static INIT_ONCE init_once = INIT_ONCE_STATIC_INIT;
     unsigned int i = 0;
     TRACE("(%s, %s, %p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
 
-    if(!init_driver()){
+    if(!InitOnceExecuteOnce(&init_once, init_driver, NULL, NULL)) {
         ERR("Driver initialization failed\n");
         return E_FAIL;
     }
@@ -274,7 +302,6 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
             *ppv = &MMDEVAPI_CF[i];
             return S_OK;
         }
-        i++;
     }
 
     WARN("(%s, %s, %p): no class found.\n", debugstr_guid(rclsid),