[WINECFG] show sound card drivers and devices

Robert Reif reif at earthlink.net
Mon Dec 5 21:53:10 CST 2005


Show all sound card drivers and their devices.
-------------- 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	6 Dec 2005 03:39:36 -0000
@@ -155,15 +155,17 @@ 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,190,20,59,14
+    PUSHBUTTON	"Configure",IDC_AUDIO_CONFIGURE,190,40,59,14
+    PUSHBUTTON	"Control Panel",IDC_AUDIO_CONTROL_PANEL,190,60,59,14
+
+    CONTROL     "Devices",IDC_AUDIO_TREE,"SysTreeView32",WS_BORDER | WS_TABSTOP,10,40,170,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
 
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	6 Dec 2005 03:39:37 -0000
@@ -38,6 +38,9 @@
 #include <shlwapi.h>
 #include <shlobj.h>
 #include <mmsystem.h>
+#include <mmreg.h>
+#include <mmsystem.h>
+#include <mmddk.h>
 
 #include "winecfg.h"
 #include "resource.h"
@@ -116,6 +119,268 @@ 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];
+
+        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
+        {
+            DWORD (WINAPI * wodMessagePtr)(UINT, UINT, DWORD, DWORD, DWORD);
+            DWORD (WINAPI * widMessagePtr)(UINT, UINT, DWORD, DWORD, DWORD);
+            DWORD (WINAPI * modMessagePtr)(UINT, UINT, DWORD, DWORD, DWORD);
+            DWORD (WINAPI * midMessagePtr)(UINT, UINT, DWORD, DWORD, DWORD);
+            DWORD (WINAPI * auxMessagePtr)(UINT, UINT, DWORD, DWORD, DWORD);
+            DWORD (WINAPI * mxdMessagePtr)(UINT, UINT, DWORD, DWORD, DWORD);
+            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;
+                wodMessagePtr = (void *)GetProcAddress(lib, "wodMessage");
+                widMessagePtr = (void *)GetProcAddress(lib, "widMessage");
+                modMessagePtr = (void *)GetProcAddress(lib, "modMessage");
+                midMessagePtr = (void *)GetProcAddress(lib, "midMessage");
+                auxMessagePtr = (void *)GetProcAddress(lib, "auxMessage");
+                mxdMessagePtr = (void *)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 = (LPSTR)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 = (LPSTR)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 = (LPSTR)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 = (LPSTR)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 = (LPSTR)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 = (LPSTR)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 +399,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	6 Dec 2005 03:39:37 -0000
@@ -147,3 +147,5 @@
 #define IDC_THEME_SIZETEXT              1404
 #define IDC_THEME_THEMECOMBO            1405
 #define IDC_THEME_INSTALL               1406
+#define IDC_AUDIO_TREE			1407
+


More information about the wine-patches mailing list