[WINEOSS] fix device probing

Robert Reif reif at earthlink.net
Wed Dec 7 19:39:20 CST 2005


ChangeLog:
- Fix device probing at driver load time.
- Fix memory leaks at driver exit time.

Wine performs dynamic device probing at initial device
driver load time rather than reading the hardware config
from the registry.  This patch fixes the mixer and aux
to probe for hardware just like wave and midi does now.
This fixes a bug in the winecfg device tree display where
the mixer and aux devices don't show up if the oss driver
is not the default driver.

-------------- next part --------------
Index: dlls/winmm/wineoss/audio.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/wineoss/audio.c,v
retrieving revision 1.167
diff -p -u -r1.167 audio.c
--- dlls/winmm/wineoss/audio.c	21 Nov 2005 11:56:55 -0000	1.167
+++ dlls/winmm/wineoss/audio.c	8 Dec 2005 01:23:26 -0000
@@ -1078,7 +1078,7 @@ static char* StrDup(const char* str, con
  *
  * Initialize internal structures from OSS information
  */
-LONG OSS_WaveInit(void)
+LRESULT OSS_WaveInit(void)
 {
     char* str;
     int i;
@@ -1159,6 +1159,33 @@ LONG OSS_WaveInit(void)
 }
 
 /******************************************************************
+ *		OSS_WaveExit
+ *
+ * Delete/clear internal structures of OSS information
+ */
+LRESULT OSS_WaveExit(void)
+{
+    int i;
+    TRACE("()\n");
+
+    for (i = 0; i < MAX_WAVEDRV; ++i)
+    {
+        HeapFree(GetProcessHeap(), 0, OSS_Devices[i].dev_name);
+        HeapFree(GetProcessHeap(), 0, OSS_Devices[i].mixer_name);
+        HeapFree(GetProcessHeap(), 0, OSS_Devices[i].interface_name);
+    }
+
+    ZeroMemory(OSS_Devices, sizeof(OSS_Devices));
+    ZeroMemory(WOutDev, sizeof(WOutDev));
+    ZeroMemory(WInDev, sizeof(WInDev));
+
+    numOutDev = 0;
+    numInDev = 0;
+
+    return 0;
+}
+
+/******************************************************************
  *		OSS_InitRingMessage
  *
  * Initialize the ring of messages for passing between driver's caller and playback/record
Index: dlls/winmm/wineoss/midi.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/wineoss/midi.c,v
retrieving revision 1.49
diff -p -u -r1.49 midi.c
--- dlls/winmm/wineoss/midi.c	9 Sep 2005 10:19:44 -0000	1.49
+++ dlls/winmm/wineoss/midi.c	8 Dec 2005 01:23:27 -0000
@@ -176,7 +176,7 @@ static	int 	MIDI_UnixToWindowsDeviceType
  *
  * Initializes the MIDI devices information variables
  */
-BOOL OSS_MidiInit(void)
+LRESULT OSS_MidiInit(void)
 {
     int 		i, status, numsynthdevs = 255, nummididevs = 255;
     struct synth_info 	sinfo;
@@ -184,14 +184,14 @@ BOOL OSS_MidiInit(void)
     static	BOOL	bInitDone = FALSE;
 
     if (bInitDone)
-	return TRUE;
+	return 0;
 
     TRACE("Initializing the MIDI variables.\n");
-    bInitDone = TRUE;
+    bInitDone = 0;
 
     /* try to open device */
     if (midiOpenSeq() == -1) {
-	return TRUE;
+	return -1;
     }
 
     /* find how many Synth devices are there in the system */
@@ -200,7 +200,7 @@ BOOL OSS_MidiInit(void)
     if (status == -1) {
 	ERR("ioctl for nr synth failed.\n");
 	midiCloseSeq();
-	return TRUE;
+	return -1;
     }
 
     if (numsynthdevs > MAX_MIDIOUTDRV) {
@@ -374,7 +374,26 @@ BOOL OSS_MidiInit(void)
     /* close file and exit */
     midiCloseSeq();
 
-    return TRUE;
+    return 0;
+}
+
+/**************************************************************************
+ * 			OSS_MidiExit				[internal]
+ *
+ * Release the MIDI devices information variables
+ */
+LRESULT OSS_MidiExit(void)
+{
+    TRACE("()\n");
+
+    ZeroMemory(MidiInDev, sizeof(MidiInDev));
+    ZeroMemory(MidiOutDev, sizeof(MidiOutDev));
+
+    MODM_NumDevs = 0;
+    MODM_NumFMSynthDevs = 0;
+    MIDM_NumDevs = 0;
+
+    return 0;
 }
 
 /**************************************************************************
@@ -1657,7 +1676,7 @@ static DWORD modReset(WORD wDevID)
 
 #else /* HAVE_OSS_MIDI */
 
-BOOL OSS_MidiInit(void)
+LRESULT OSS_MidiInit(void)
 {
     return FALSE;
 }
Index: dlls/winmm/wineoss/mixer.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/wineoss/mixer.c,v
retrieving revision 1.36
diff -p -u -r1.36 mixer.c
--- dlls/winmm/wineoss/mixer.c	22 Aug 2005 09:20:20 -0000	1.36
+++ dlls/winmm/wineoss/mixer.c	8 Dec 2005 01:23:28 -0000
@@ -1437,7 +1437,7 @@ static	DWORD	MIX_SetControlDetails(WORD 
 /**************************************************************************
  * 				MIX_Init			[internal]
  */
-static	DWORD	MIX_Init(void)
+LRESULT OSS_MixerInit(void)
 {
     int	i, mixer;
 
@@ -1489,7 +1489,7 @@ static	DWORD	MIX_Init(void)
 /**************************************************************************
  * 				MIX_Exit			[internal]
  */
-static	DWORD	MIX_Exit(void)
+LRESULT OSS_MixerExit(void)
 {
     int	i;
 
@@ -1528,9 +1528,7 @@ DWORD WINAPI OSS_mxdMessage(UINT wDevID,
     switch (wMsg)
     {
     case DRVM_INIT:
-	return MIX_Init();
     case DRVM_EXIT:
-        return MIX_Exit();
     case DRVM_ENABLE:
     case DRVM_DISABLE:
 	/* FIXME: Pretend this is supported */
Index: dlls/winmm/wineoss/mmaux.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/wineoss/mmaux.c,v
retrieving revision 1.14
diff -p -u -r1.14 mmaux.c
--- dlls/winmm/wineoss/mmaux.c	10 Nov 2005 11:39:07 -0000	1.14
+++ dlls/winmm/wineoss/mmaux.c	8 Dec 2005 01:23:29 -0000
@@ -49,9 +49,10 @@ static int	NumDev = 6;
 
 /*-----------------------------------------------------------------------*/
 
-static	int	AUXDRV_Init(void)
+LRESULT OSS_AuxInit(void)
 {
     int	mixer;
+    TRACE("()\n");
 
     if ((mixer = open(MIXER_DEV, O_RDWR)) < 0) {
 	WARN("mixer device not available !\n");
@@ -60,7 +61,15 @@ static	int	AUXDRV_Init(void)
 	close(mixer);
 	NumDev = 6;
     }
-    return NumDev;
+    return 0;
+}
+
+/*-----------------------------------------------------------------------*/
+
+LRESULT OSS_AuxExit(void)
+{
+    TRACE("()\n");
+    return 0;
 }
 
 /**************************************************************************
@@ -219,8 +228,6 @@ DWORD WINAPI OSS_auxMessage(UINT wDevID,
 #ifdef HAVE_OSS
     switch (wMsg) {
     case DRVM_INIT:
-	AUXDRV_Init();
-	/* fall through */
     case DRVM_EXIT:
     case DRVM_ENABLE:
     case DRVM_DISABLE:
Index: dlls/winmm/wineoss/oss.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/wineoss/oss.c,v
retrieving revision 1.16
diff -p -u -r1.16 oss.c
--- dlls/winmm/wineoss/oss.c	6 Dec 2005 10:39:26 -0000	1.16
+++ dlls/winmm/wineoss/oss.c	8 Dec 2005 01:23:29 -0000
@@ -29,14 +29,44 @@
 #include "winuser.h"
 #include "mmddk.h"
 #include "oss.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wave);
 
 #ifdef HAVE_OSS
 
 /**************************************************************************
+ * 				OSS_drvLoad			[internal]
+ */
+static LRESULT OSS_drvLoad(void)
+{
+    TRACE("()\n");
+    OSS_WaveInit();
+    OSS_MidiInit();
+    OSS_MixerInit();
+    OSS_AuxInit();
+    return 1;
+}
+
+/**************************************************************************
+ * 				OSS_drvFree			[internal]
+ */
+static LRESULT OSS_drvFree(void)
+{
+    TRACE("()\n");
+    OSS_WaveExit();
+    OSS_MidiExit();
+    OSS_MixerExit();
+    OSS_AuxExit();
+    return 1;
+}
+
+/**************************************************************************
  * 				OSS_drvOpen			[internal]
  */
 static LRESULT OSS_drvOpen(LPSTR str)
 {
+    TRACE("(%s)\n", str);
     return 1;
 }
 
@@ -45,6 +75,7 @@ static LRESULT OSS_drvOpen(LPSTR str)
  */
 static LRESULT OSS_drvClose(DWORD_PTR dwDevID)
 {
+    TRACE("(%08lx)\n", dwDevID);
     return 1;
 }
 
@@ -57,15 +88,13 @@ static LRESULT OSS_drvClose(DWORD_PTR dw
 LRESULT CALLBACK OSS_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg,
                                 LPARAM dwParam1, LPARAM dwParam2)
 {
-/* EPP     TRACE("(%08lX, %04X, %08lX, %08lX, %08lX)\n",  */
-/* EPP 	  dwDevID, hDriv, wMsg, dwParam1, dwParam2); */
+     TRACE("(%08lX, %p, %08X, %08lX, %08lX)\n",
+           dwDevID, hDriv, wMsg, dwParam1, dwParam2);
 
     switch(wMsg) {
 #ifdef HAVE_OSS
-    case DRV_LOAD:		OSS_WaveInit();
-				OSS_MidiInit();
-				return 1;
-    case DRV_FREE:		return 1;
+    case DRV_LOAD:		return OSS_drvLoad();
+    case DRV_FREE:		return OSS_drvFree();
     case DRV_OPEN:		return OSS_drvOpen((LPSTR)dwParam1);
     case DRV_CLOSE:		return OSS_drvClose(dwDevID);
     case DRV_ENABLE:		return 1;
Index: dlls/winmm/wineoss/oss.h
===================================================================
RCS file: /home/wine/wine/dlls/winmm/wineoss/oss.h,v
retrieving revision 1.8
diff -p -u -r1.8 oss.h
--- dlls/winmm/wineoss/oss.h	8 Aug 2005 11:17:25 -0000	1.8
+++ dlls/winmm/wineoss/oss.h	8 Dec 2005 01:23:29 -0000
@@ -38,5 +38,14 @@
 # define HAVE_OSS
 #endif
 
-extern LONG OSS_WaveInit(void);
-extern BOOL OSS_MidiInit(void);
+LRESULT OSS_WaveInit(void);
+LRESULT OSS_WaveExit(void);
+
+LRESULT OSS_MidiInit(void);
+LRESULT OSS_MidiExit(void);
+
+LRESULT OSS_MixerInit(void);
+LRESULT OSS_MixerExit(void);
+
+LRESULT OSS_AuxInit(void);
+LRESULT OSS_AuxExit(void);


More information about the wine-patches mailing list