Robert Reif : wineoss: Fix device probing.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Dec 8 07:06:15 CST 2005


Module: wine
Branch: refs/heads/master
Commit: c7a59d117a12d68c504e9486895f0720c0a46953
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=c7a59d117a12d68c504e9486895f0720c0a46953

Author: Robert Reif <reif at earthlink.net>
Date:   Thu Dec  8 12:00:33 2005 +0100

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

---

 dlls/winmm/wineoss/audio.c |   29 ++++++++++++++++++++++++++++-
 dlls/winmm/wineoss/midi.c  |   33 ++++++++++++++++++++++++++-------
 dlls/winmm/wineoss/mixer.c |    6 ++----
 dlls/winmm/wineoss/mmaux.c |   15 +++++++++++----
 dlls/winmm/wineoss/oss.c   |   41 +++++++++++++++++++++++++++++++++++------
 dlls/winmm/wineoss/oss.h   |   13 +++++++++++--
 6 files changed, 113 insertions(+), 24 deletions(-)

diff --git a/dlls/winmm/wineoss/audio.c b/dlls/winmm/wineoss/audio.c
index 6cb9c5a..7df0bca 100644
--- a/dlls/winmm/wineoss/audio.c
+++ b/dlls/winmm/wineoss/audio.c
@@ -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
diff --git a/dlls/winmm/wineoss/midi.c b/dlls/winmm/wineoss/midi.c
index 6dc9f7a..4ea5090 100644
--- a/dlls/winmm/wineoss/midi.c
+++ b/dlls/winmm/wineoss/midi.c
@@ -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;
 }
diff --git a/dlls/winmm/wineoss/mixer.c b/dlls/winmm/wineoss/mixer.c
index 02d377c..82d586c 100644
--- a/dlls/winmm/wineoss/mixer.c
+++ b/dlls/winmm/wineoss/mixer.c
@@ -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 */
diff --git a/dlls/winmm/wineoss/mmaux.c b/dlls/winmm/wineoss/mmaux.c
index 4406634..0841e6f 100644
--- a/dlls/winmm/wineoss/mmaux.c
+++ b/dlls/winmm/wineoss/mmaux.c
@@ -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:
diff --git a/dlls/winmm/wineoss/oss.c b/dlls/winmm/wineoss/oss.c
index 8526f42..a8a07a7 100644
--- a/dlls/winmm/wineoss/oss.c
+++ b/dlls/winmm/wineoss/oss.c
@@ -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;
diff --git a/dlls/winmm/wineoss/oss.h b/dlls/winmm/wineoss/oss.h
index 84450eb..555fbdb 100644
--- a/dlls/winmm/wineoss/oss.h
+++ b/dlls/winmm/wineoss/oss.h
@@ -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-cvs mailing list