winecfg: Only initialise the audio drivers once.
authorMaarten Lankhorst <m.b.lankhorst@gmail.com>
Fri, 18 Jun 2010 19:18:06 +0000 (21:18 +0200)
committerAlexandre Julliard <julliard@winehq.org>
Mon, 21 Jun 2010 10:19:42 +0000 (12:19 +0200)
programs/winecfg/audio.c

index c5cebcd7d84c2c2f4e2a6a0a14cf8084ecb577a8..134296d92adc6dc9412b3061f25c3dc85897b9a6 100644 (file)
@@ -86,9 +86,10 @@ typedef struct
 {
   UINT nameID;
   const char *szDriver;
+  HDRVR hDriver;
 } AUDIO_DRIVER;
 
-static const AUDIO_DRIVER sAudioDrivers[] = {
+static AUDIO_DRIVER sAudioDrivers[] = {
   {IDS_DRIVER_ALSA,      "alsa"},
   {IDS_DRIVER_OSS,       "oss"},
   {IDS_DRIVER_COREAUDIO, "coreaudio"},
@@ -118,7 +119,7 @@ static void configureAudioDriver(HWND hDlg)
         HDRVR hdrvr;
         char wine_driver[MAX_NAME_LENGTH + 9];
         sprintf(wine_driver, "wine%s.drv", pAudioDrv->szDriver);
-        hdrvr = OpenDriverA(wine_driver, 0, 0);
+        hdrvr = pAudioDrv->hDriver;
         if (hdrvr != 0)
         {
             if (SendDriverMessage(hdrvr, DRV_QUERYCONFIGURE, 0, 0) != 0)
@@ -129,7 +130,6 @@ static void configureAudioDriver(HWND hDlg)
                 dci.lpszDCIAliasName = NULL;
                 SendDriverMessage(hdrvr, DRV_CONFIGURE, 0, (LONG_PTR)&dci);
             }
-            CloseDriver(hdrvr, 0, 0);
         }
         else
         {
@@ -197,7 +197,7 @@ static void removeDriver(const char * driver)
 
 static void initAudioDeviceTree(HWND hDlg)
 {
-    const AUDIO_DRIVER *pAudioDrv = NULL;
+    AUDIO_DRIVER *pAudioDrv = NULL;
     int i, j;
     TVINSERTSTRUCTW insert;
     HTREEITEM root, driver[10];
@@ -247,7 +247,7 @@ static void initAudioDeviceTree(HWND hDlg)
         LoadStringW (GetModuleHandle (NULL), pAudioDrv->nameID, text,
             sizeof(text)/sizeof(text[0]));
 
-        if ((hdrv = OpenDriverA(name, 0, 0)))
+        if ((hdrv = pAudioDrv->hDriver))
         {
             HMODULE lib;
             if ((lib = GetDriverModuleHandle(hdrv)))
@@ -473,7 +473,6 @@ static void initAudioDeviceTree(HWND hDlg)
                     }
                 }
             }
-            CloseDriver(hdrv, 0, 0);
         }
     }
 
@@ -490,7 +489,7 @@ static void initAudioDeviceTree(HWND hDlg)
 static void findAudioDrivers(void)
 {
     int numFound = 0;
-    const AUDIO_DRIVER *pAudioDrv = NULL;
+    AUDIO_DRIVER *pAudioDrv = NULL;
     HCURSOR old_cursor;
 
     /* delete an existing list */
@@ -511,10 +510,38 @@ static void findAudioDrivers(void)
 
             sprintf(driver, "wine%s.drv", pAudioDrv->szDriver);
 
-            if ((hdrv = OpenDriverA(driver, 0, 0)))
-            {
-                CloseDriver(hdrv, 0, 0);
+            hdrv = pAudioDrv->hDriver;
+            if (!pAudioDrv->hDriver && (hdrv = OpenDriverA(driver, 0, 0))) {
+                HMODULE lib = GetDriverModuleHandle(hdrv);
+                MessagePtr wodMessagePtr = (MessagePtr)GetProcAddress(lib, "wodMessage");
+                MessagePtr widMessagePtr = (MessagePtr)GetProcAddress(lib, "widMessage");
+                MessagePtr modMessagePtr = (MessagePtr)GetProcAddress(lib, "modMessage");
+                MessagePtr midMessagePtr = (MessagePtr)GetProcAddress(lib, "midMessage");
+                MessagePtr auxMessagePtr = (MessagePtr)GetProcAddress(lib, "auxMessage");
+                MessagePtr mxdMessagePtr = (MessagePtr)GetProcAddress(lib, "mxdMessage");
+
+                pAudioDrv->hDriver = hdrv;
 
+                if (wodMessagePtr)
+                    wodMessagePtr(0, DRVM_INIT, 0, 0, 0);
+
+                if (widMessagePtr)
+                    widMessagePtr(0, DRVM_INIT, 0, 0, 0);
+
+                if (modMessagePtr)
+                    modMessagePtr(0, DRVM_INIT, 0, 0, 0);
+
+                if (midMessagePtr)
+                    midMessagePtr(0, DRVM_INIT, 0, 0, 0);
+
+                if (auxMessagePtr)
+                    auxMessagePtr(0, DRVM_INIT, 0, 0, 0);
+
+                if (mxdMessagePtr)
+                    mxdMessagePtr(0, DRVM_INIT, 0, 0, 0);
+            }
+            if (hdrv)
+            {
                 if (loadedAudioDrv)
                     loadedAudioDrv = HeapReAlloc(GetProcessHeap(), 0, loadedAudioDrv, (numFound + 1) * sizeof(AUDIO_DRIVER));
                 else