Module: wine Branch: refs/heads/master Commit: c7a59d117a12d68c504e9486895f0720c0a46953 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=c7a59d117a12d68c504e9486...
Author: Robert Reif reif@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);