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