wineoss: Fix device probing.

- Fix device probing at driver load time.
- Fix memory leaks at driver exit time.
This commit is contained in:
Robert Reif 2005-12-08 12:00:33 +01:00 committed by Alexandre Julliard
parent db50e2d997
commit c7a59d117a
6 changed files with 113 additions and 24 deletions

View File

@ -1078,7 +1078,7 @@ static char* StrDup(const char* str, const char* def)
*
* Initialize internal structures from OSS information
*/
LONG OSS_WaveInit(void)
LRESULT OSS_WaveInit(void)
{
char* str;
int i;
@ -1158,6 +1158,33 @@ LONG OSS_WaveInit(void)
return 0;
}
/******************************************************************
* 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
*

View File

@ -176,7 +176,7 @@ static int MIDI_UnixToWindowsDeviceType(int type)
*
* 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;
}

View File

@ -1437,7 +1437,7 @@ static DWORD MIX_SetControlDetails(WORD wDevID, LPMIXERCONTROLDETAILS lpmcd,
/**************************************************************************
* 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, UINT wMsg, DWORD dwUser,
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 */

View File

@ -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, UINT wMsg, DWORD dwUser,
#ifdef HAVE_OSS
switch (wMsg) {
case DRVM_INIT:
AUXDRV_Init();
/* fall through */
case DRVM_EXIT:
case DRVM_ENABLE:
case DRVM_DISABLE:

View File

@ -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 dwDevID)
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;

View File

@ -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);