[WINECFG] show sound card drivers and devices (Try 3)

Robert Reif reif at earthlink.net
Tue Dec 6 21:03:17 CST 2005


ChangeLog:
- Show all sound card drivers and their devices.

The main differences  in this version is that the
Disable Sound entry is not shown and that only the english
rc file is included.

I can provide revised versions of the other rc files if necessary
but that shouldn't prevent this patch from going in.
-------------- next part --------------
Index: programs/winecfg/En.rc
===================================================================
RCS file: /home/wine/wine/programs/winecfg/En.rc,v
retrieving revision 1.54
diff -p -u -r1.54 En.rc
--- programs/winecfg/En.rc	27 Oct 2005 11:24:02 -0000	1.54
+++ programs/winecfg/En.rc	7 Dec 2005 02:51:09 -0000
@@ -155,16 +155,14 @@ FONT 8, "MS Shell Dlg"
 BEGIN
     LTEXT	"Audio driver: ",IDC_STATIC,10,20,60,8
     COMBOBOX	IDC_AUDIO_DRIVER,70,18,85,85,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    PUSHBUTTON	"Autodetect",IDC_AUDIO_AUTODETECT,170,20,49,14
-    PUSHBUTTON	"Configure",IDC_AUDIO_CONFIGURE,170,40,49,14
-    PUSHBUTTON	"Control Panel",IDC_AUDIO_CONTROL_PANEL,170,60,49,14
-
-    GROUPBOX    " DirectSound ",IDC_STATIC,8,75,244,120
-
-    LTEXT	"Hardware Acceleration: ",IDC_STATIC,15,85,90,10
-    COMBOBOX	IDC_DSOUND_HW_ACCEL,100,83,150,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
-    CONTROL     "Driver Emulation",IDC_DSOUND_DRV_EMUL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,100,230,10
-
+    PUSHBUTTON	"Autodetect",IDC_AUDIO_AUTODETECT,170,20,59,14
+    PUSHBUTTON	"Configure",IDC_AUDIO_CONFIGURE,170,40,59,14
+    PUSHBUTTON	"Control Panel",IDC_AUDIO_CONTROL_PANEL,170,60,59,14
+    CONTROL     "Devices",IDC_AUDIO_TREE,"SysTreeView32",WS_BORDER | WS_TABSTOP,10,40,150,160 
+    GROUPBOX    " DirectSound ",IDC_STATIC,8,205,244,60
+    LTEXT	"Hardware Acceleration: ",IDC_STATIC,15,215,90,10
+    COMBOBOX	IDC_DSOUND_HW_ACCEL,100,213,150,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+    CONTROL     "Driver Emulation",IDC_DSOUND_DRV_EMUL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,230,230,10
 END
 
 IDD_APPEARANCE DIALOG DISCARDABLE  0, 0, 260, 250
Index: programs/winecfg/audio.c
===================================================================
RCS file: /home/wine/wine/programs/winecfg/audio.c,v
retrieving revision 1.15
diff -p -u -r1.15 audio.c
--- programs/winecfg/audio.c	3 Nov 2005 19:31:45 -0000	1.15
+++ programs/winecfg/audio.c	7 Dec 2005 02:51:09 -0000
@@ -38,12 +38,17 @@
 #include <shlwapi.h>
 #include <shlobj.h>
 #include <mmsystem.h>
+#include <mmreg.h>
+#include <mmsystem.h>
+#include <mmddk.h>
 
 #include "winecfg.h"
 #include "resource.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(winecfg);
 
+typedef DWORD (WINAPI * MessagePtr)(UINT, UINT, DWORD, DWORD, DWORD);
+
 static const char* DSound_HW_Accels[] = {
   "Full",
   "Standard",
@@ -116,6 +121,264 @@ static void configureAudioDriver(HWND hD
   }
 }
 
+static void initAudioDeviceTree(HWND hDlg)
+{
+    const AUDIO_DRIVER *pAudioDrv = NULL;
+    int i, j;
+    TVINSERTSTRUCT insert;
+    HTREEITEM root, driver[10];
+    HWND tree = NULL;
+
+    tree = GetDlgItem(hDlg, IDC_AUDIO_TREE);
+
+    if (!tree)
+        return;
+
+    SetWindowLong(tree, GWL_STYLE, GetWindowLong(tree, GWL_STYLE) | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT);
+
+    insert.hParent = TVI_ROOT;
+    insert.hInsertAfter = TVI_LAST;
+    insert.item.mask = TVIF_TEXT | TVIF_CHILDREN;
+    insert.item.pszText = "Sound Drivers";
+    insert.item.cChildren = 1;
+
+    root = (HTREEITEM)SendDlgItemMessage(hDlg, IDC_AUDIO_TREE, TVM_INSERTITEM, 0, (LPARAM)&insert);
+
+    pAudioDrv = getAudioDrivers();
+
+    for (i = 0; *pAudioDrv->szName; i++, pAudioDrv++) {
+        HDRVR hdrv;
+        char name[MAX_PATH];
+        char text[MAX_PATH];
+
+        if (strlen(pAudioDrv->szDriver) == 0)
+            continue;
+
+        sprintf(name, "wine%s.drv", pAudioDrv->szDriver);
+        sprintf(text, "%s Driver", pAudioDrv->szName);
+
+        hdrv = OpenDriverA(name, 0, 0);
+        if (hdrv == 0) /* no driver loaded */
+        {
+            insert.hParent = root;
+            insert.item.mask = TVIF_TEXT;
+            insert.item.pszText = text;
+
+            driver[i] = (HTREEITEM)SendDlgItemMessage(hDlg, IDC_AUDIO_TREE, TVM_INSERTITEM, 0, (LPARAM)&insert);
+        }
+        else
+        {
+            HINSTANCE lib;
+
+            lib = LoadLibrary(name);
+            if (lib)
+            {
+                int num_wod = 0, num_wid = 0, num_mod = 0, num_mid = 0, num_aux = 0, num_mxd = 0;
+                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");
+
+                if (wodMessagePtr)
+                    num_wod = wodMessagePtr(0, WODM_GETNUMDEVS, 0, 0, 0);
+
+                if (widMessagePtr)
+                    num_wid = widMessagePtr(0, WIDM_GETNUMDEVS, 0, 0, 0);
+
+                if (modMessagePtr)
+                    num_mod = modMessagePtr(0, MODM_GETNUMDEVS, 0, 0, 0);
+
+                if (midMessagePtr)
+                    num_mid = midMessagePtr(0, MIDM_GETNUMDEVS, 0, 0, 0);
+
+                if (auxMessagePtr)
+                    num_aux = auxMessagePtr(0, AUXDM_GETNUMDEVS, 0, 0, 0);
+
+                if (mxdMessagePtr)
+                    num_mxd = mxdMessagePtr(0, MXDM_GETNUMDEVS, 0, 0, 0);
+
+                if (num_wod == 0 && num_wid == 0 && num_mod == 0 && num_mid == 0 && num_aux == 0 && num_mxd == 0)
+                {
+                    insert.hParent = root;
+                    insert.item.mask = TVIF_TEXT;
+                    insert.item.pszText = text;
+
+                    driver[i] = (HTREEITEM)SendDlgItemMessage(hDlg, IDC_AUDIO_TREE, TVM_INSERTITEM, 0, (LPARAM)&insert);
+                }
+                else
+                {
+                    HTREEITEM type;
+
+                    insert.hParent = root;
+                    insert.item.mask = TVIF_TEXT | TVIF_CHILDREN;
+                    insert.item.pszText = text;
+                    insert.item.cChildren = 1;
+
+                    driver[i] = (HTREEITEM)SendDlgItemMessage(hDlg, IDC_AUDIO_TREE, TVM_INSERTITEM, 0, (LPARAM)&insert);
+
+                    if (num_wod)
+                    {
+                        insert.hParent = driver[i];
+                        insert.item.mask = TVIF_TEXT | TVIF_CHILDREN;
+                        insert.item.pszText = "Wave Out Devices";
+                        insert.item.cChildren = 1;
+
+                        type = (HTREEITEM)SendDlgItemMessage(hDlg, IDC_AUDIO_TREE, TVM_INSERTITEM, 0, (LPARAM)&insert);
+
+                        for (j = 0; j < num_wod; j++)
+                        {
+                            WAVEOUTCAPSW caps;
+                            char szPname[MAXPNAMELEN];
+
+                            wodMessagePtr(j, WODM_GETDEVCAPS, 0, (DWORD)&caps, sizeof(caps)); 
+                            WideCharToMultiByte(CP_ACP, 0, caps.szPname, -1, szPname, MAXPNAMELEN, 0, 0);
+
+                            insert.hParent = type;
+                            insert.item.mask = TVIF_TEXT;
+                            insert.item.pszText = szPname;
+
+                            SendDlgItemMessage(hDlg, IDC_AUDIO_TREE, TVM_INSERTITEM, 0, (LPARAM)&insert);
+                        }
+                    }
+
+                    if (num_wid)
+                    {
+                        insert.hParent = driver[i];
+                        insert.item.mask = TVIF_TEXT | TVIF_CHILDREN;
+                        insert.item.pszText = "Wave In Devices";
+                        insert.item.cChildren = 1;
+
+                        type = (HTREEITEM)SendDlgItemMessage(hDlg, IDC_AUDIO_TREE, TVM_INSERTITEM, 0, (LPARAM)&insert);
+
+                        for (j = 0; j < num_wid; j++)
+                        {
+                            WAVEINCAPSW caps;
+                            char szPname[MAXPNAMELEN];
+
+                            widMessagePtr(j, WIDM_GETDEVCAPS, 0, (DWORD)&caps, sizeof(caps)); 
+                            WideCharToMultiByte(CP_ACP, 0, caps.szPname, -1, szPname, MAXPNAMELEN, 0, 0);
+
+                            insert.hParent = type;
+                            insert.item.mask = TVIF_TEXT;
+                            insert.item.pszText = szPname;
+
+                            SendDlgItemMessage(hDlg, IDC_AUDIO_TREE, TVM_INSERTITEM, 0, (LPARAM)&insert);
+                        }
+                    }
+
+                    if (num_mod)
+                    {
+                        insert.hParent = driver[i];
+                        insert.item.mask = TVIF_TEXT | TVIF_CHILDREN;
+                        insert.item.pszText = "MIDI Out Devices";
+                        insert.item.cChildren = 1;
+
+                        type = (HTREEITEM)SendDlgItemMessage(hDlg, IDC_AUDIO_TREE, TVM_INSERTITEM, 0, (LPARAM)&insert);
+
+                        for (j = 0; j < num_mod; j++)
+                        {
+                            MIDIOUTCAPSW caps;
+                            char szPname[MAXPNAMELEN];
+
+                            modMessagePtr(j, MODM_GETDEVCAPS, 0, (DWORD)&caps, sizeof(caps)); 
+                            WideCharToMultiByte(CP_ACP, 0, caps.szPname, -1, szPname, MAXPNAMELEN, 0, 0);
+
+                            insert.hParent = type;
+                            insert.item.mask = TVIF_TEXT;
+                            insert.item.pszText = szPname;
+
+                            SendDlgItemMessage(hDlg, IDC_AUDIO_TREE, TVM_INSERTITEM, 0, (LPARAM)&insert);
+                        }
+                    }
+
+                    if (num_mid)
+                    {
+                        insert.hParent = driver[i];
+                        insert.item.mask = TVIF_TEXT | TVIF_CHILDREN;
+                        insert.item.pszText = "MIDI In Devices";
+                        insert.item.cChildren = 1;
+
+                        type = (HTREEITEM)SendDlgItemMessage(hDlg, IDC_AUDIO_TREE, TVM_INSERTITEM, 0, (LPARAM)&insert);
+
+                        for (j = 0; j < num_mid; j++)
+                        {
+                            MIDIINCAPSW caps;
+                            char szPname[MAXPNAMELEN];
+
+                            midMessagePtr(j, MIDM_GETDEVCAPS, 0, (DWORD)&caps, sizeof(caps)); 
+                            WideCharToMultiByte(CP_ACP, 0, caps.szPname, -1, szPname, MAXPNAMELEN, 0, 0);
+
+                            insert.hParent = type;
+                            insert.item.mask = TVIF_TEXT;
+                            insert.item.pszText = szPname;
+
+                            SendDlgItemMessage(hDlg, IDC_AUDIO_TREE, TVM_INSERTITEM, 0, (LPARAM)&insert);
+                        }
+                    }
+
+                    if (num_aux)
+                    {
+                        insert.hParent = driver[i];
+                        insert.item.mask = TVIF_TEXT | TVIF_CHILDREN;
+                        insert.item.pszText = "Aux Devices";
+                        insert.item.cChildren = 1;
+
+                        type = (HTREEITEM)SendDlgItemMessage(hDlg, IDC_AUDIO_TREE, TVM_INSERTITEM, 0, (LPARAM)&insert);
+
+                        for (j = 0; j < num_aux; j++)
+                        {
+                            AUXCAPSW caps;
+                            char szPname[MAXPNAMELEN];
+
+                            auxMessagePtr(j, AUXDM_GETDEVCAPS, 0, (DWORD)&caps, sizeof(caps)); 
+                            WideCharToMultiByte(CP_ACP, 0, caps.szPname, -1, szPname, MAXPNAMELEN, 0, 0);
+
+                            insert.hParent = type;
+                            insert.item.mask = TVIF_TEXT;
+                            insert.item.pszText = szPname;
+
+                            SendDlgItemMessage(hDlg, IDC_AUDIO_TREE, TVM_INSERTITEM, 0, (LPARAM)&insert);
+                        }
+                    }
+
+                    if (num_mxd)
+                    {
+                        insert.hParent = driver[i];
+                        insert.item.mask = TVIF_TEXT | TVIF_CHILDREN;
+                        insert.item.pszText = "Mixer Devices";
+                        insert.item.cChildren = 1;
+
+                        type = (HTREEITEM)SendDlgItemMessage(hDlg, IDC_AUDIO_TREE, TVM_INSERTITEM, 0, (LPARAM)&insert);
+
+                        for (j = 0; j < num_mxd; j++)
+                        {
+                            MIXERCAPSW caps;
+                            char szPname[MAXPNAMELEN];
+
+                            mxdMessagePtr(j, MXDM_GETDEVCAPS, 0, (DWORD)&caps, sizeof(caps)); 
+                            WideCharToMultiByte(CP_ACP, 0, caps.szPname, -1, szPname, MAXPNAMELEN, 0, 0);
+
+                            insert.hParent = type;
+                            insert.item.mask = TVIF_TEXT;
+                            insert.item.pszText = szPname;
+
+                            SendDlgItemMessage(hDlg, IDC_AUDIO_TREE, TVM_INSERTITEM, 0, (LPARAM)&insert);
+                        }
+                    }
+                }
+                FreeLibrary(lib);
+            }
+        }
+    }
+
+    SendDlgItemMessage(hDlg, IDC_AUDIO_TREE, TVM_SELECTITEM, 0, 0);
+    SendDlgItemMessage(hDlg, IDC_AUDIO_TREE, TVM_EXPAND, TVE_EXPAND, (LPARAM)root);
+    for (j = 0; j < i; j++)
+        SendDlgItemMessage(hDlg, IDC_AUDIO_TREE, TVM_EXPAND, TVE_EXPAND, (LPARAM)driver[j]);
+}
+
 static void initAudioDlg (HWND hDlg)
 {
     char *curAudioDriver = get_reg_key(config_key, "Drivers", "Audio", "alsa");
@@ -134,6 +397,7 @@ static void initAudioDlg (HWND hDlg)
         }
     }
 
+    initAudioDeviceTree(hDlg);
 
     SendDlgItemMessage(hDlg, IDC_DSOUND_HW_ACCEL, CB_RESETCONTENT, 0, 0);
     for (i = 0; NULL != DSound_HW_Accels[i]; ++i) {
Index: programs/winecfg/resource.h
===================================================================
RCS file: /home/wine/wine/programs/winecfg/resource.h,v
retrieving revision 1.33
diff -p -u -r1.33 resource.h
--- programs/winecfg/resource.h	27 Oct 2005 11:24:02 -0000	1.33
+++ programs/winecfg/resource.h	7 Dec 2005 02:51:09 -0000
@@ -139,6 +139,7 @@
 #define IDC_AUDIO_CONTROL_PANEL         1303
 #define IDC_DSOUND_HW_ACCEL             1304
 #define IDC_DSOUND_DRV_EMUL             1305
+#define IDC_AUDIO_TREE			1306
 
 /* appearance tab */
 #define IDC_THEME_COLORCOMBO            1401


More information about the wine-patches mailing list