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