add autodetect audio driver capability to winmm

James Hawkins truiken at gmail.com
Sun Jul 25 17:33:19 CDT 2004


> This is only available in C99. We try to make Wine compile with as many
> C compilers as possible, including gcc 2.95, which doesn't allow this
> sort of thing.

What part of the code is only availabe in C99? I'll try to fix it so
we can be compatible with other compilers.

On Sun, 25 Jul 2004 23:25:57 +0100, Robert Shearman <rob at codeweavers.com> wrote:
> 
> 
> James Hawkins wrote:
> 
> >Changelog:
> >    * take audio autodetection out of winecfg and put it in winmm
> >    * if driver is not found in the registry or the driver fails to
> >load, then autodetect driver
> >
> >
> 
> Thanks for another cool patch. It lessens the burden on the user.
> CC'ing ros-kernel as explained below.
> 
> >Index: dlls/winmm/lolvldrv.c
> >===================================================================
> >RCS file: /home/wine/wine/dlls/winmm/lolvldrv.c,v
> >retrieving revision 1.58
> >diff -u -r1.58 lolvldrv.c
> >--- dlls/winmm/lolvldrv.c      1 Jun 2004 19:40:48 -0000       1.58
> >+++ dlls/winmm/lolvldrv.c      25 Jul 2004 22:05:54 -0000
> >@@ -30,6 +30,8 @@
> > #include "winver.h"
> > #include "winemm.h"
> > #include "wine/debug.h"
> >+#include "config.h"
> >+#include "wine/port.h"
> >
> > WINE_DEFAULT_DEBUG_CHANNEL(winmm);
> >
> >@@ -711,6 +713,80 @@
> > }
> >
> > /**************************************************************************
> >+ * MMDRV_AutoDetectDriver [internal]
> >+ *
> >+ * modified from programs/winecfg/audio.c
> >+ */
> >+BOOL MMDRV_AutoDetectDriver(void)
> >+{
> >+    struct stat buf;
> >+    const char *argv_new[4];
> >+    int fd;
> >+
> >+    char *driversFound[10];
> >+    char *name[10];
> >+    int numFound = 0;
> >+
> >+    argv_new[0] = "/bin/sh";
> >
> 
> I think the ReactOS people may have a few comments to make on this, now
> that they are using this DLL in ReactOS.
> 
> >+    argv_new[1] = "-c";
> >+    argv_new[3] = NULL;
> >+
> >+    /* try to detect arts */
> >+    argv_new[2] = "ps awx|grep artsd|grep -v grep|grep artsd > /dev/null";
> >+    if(!spawnvp(_P_WAIT, "/bin/sh", argv_new))
> >+    {
> >+        driversFound[numFound] = "winearts.drv";
> >+        name[numFound] = "aRts";
> >+        numFound++;
> >+    }
> >+
> >+    /* try to detect jack */
> >+    argv_new[2] = "ps awx|grep jackd|grep -v grep|grep jackd > /dev/null";
> >+    if(!spawnvp(_P_WAIT, "/bin/sh", argv_new))
> >+    {
> >+        driversFound[numFound] = "winejack.drv";
> >+        name[numFound] = "jack";
> >+        numFound++;
> >+    }
> >+
> >+    /* try to detect nas */
> >+    /* TODO */
> >+
> >+    /* try to detect audioIO (solaris) */
> >+    /* TODO */
> >+
> >+    /* try to detect alsa */
> >+    if(!stat("/proc/asound", &buf))
> >+    {
> >+        driversFound[numFound] = "winealsa.drv";
> >+        name[numFound] = "Alsa";
> >+        numFound++;
> >+    }
> >+
> >+    /* try to detect oss */
> >+    fd = open("/dev/dsp", O_WRONLY | O_NONBLOCK);
> >+    if(fd)
> >+    {
> >+        close(fd);
> >+        driversFound[numFound] = "wineoss.drv";
> >+        name[numFound] = "OSS";
> >+        numFound++;
> >+    }
> >+
> >+
> >+    if (numFound == 0)
> >+    {
> >+        TRACE("Could not detect any audio devices/servers");
> >+        return FALSE;
> >+    }
> >+
> >+    /* TODO: possibly smarter handling of multiple drivers? */
> >+    TRACE("Found driver %s\n", name[0]);
> >+
> >+    return MMDRV_Install(driversFound[0], driversFound[0], FALSE);
> >+}
> >+
> >+/**************************************************************************
> >  *                            MMDRV_InitFromRegistry          [internal]
> >  */
> > static BOOL   MMDRV_InitFromRegistry(void)
> >@@ -729,7 +805,9 @@
> >     }
> >
> >     size = sizeof(buffer);
> >-    if (!RegQueryValueExA(hKey, "Drivers", 0, &type, (LPVOID)buffer, &size)) {
> >+    BOOL keyQueried = !RegQueryValueExA(hKey, "Drivers", 0, &type,
> >+                                        (LPVOID)buffer, &size);
> >
> 
> This is only available in C99. We try to make Wine compile with as many
> C compilers as possible, including gcc 2.95, which doesn't allow this
> sort of thing.
> 
> >+    if (keyQueried) {
> >       p1 = buffer;
> >       while (p1) {
> >           p2 = strchr(p1, ';');
> >@@ -738,7 +816,11 @@
> >           p1 = p2;
> >       }
> >     }
> >-
> >+
> >+    /* if no driver specified in reg or driver fails to load then autodetect */
> >+    if (!keyQueried || !ret)
> >+        ret |= MMDRV_AutoDetectDriver();
> >+
> >     /* finish with mappers */
> >     size = sizeof(buffer);
> >     if (!RegQueryValueExA(hKey, "WaveMapper", 0, &type, (LPVOID)buffer, &size))
> >
> >
> 
> Rob
> 
> 


-- 
James Hawkins



More information about the wine-devel mailing list