[PATCH] wineoss: Seperate wave-in and wave-outs shared use of a single OSS_DEVICE struct

Maarten Lankhorst maarten at codeweavers.com
Mon Oct 1 02:16:59 CDT 2007


This code doesnt change any logic, it only seperates it
---
 dlls/wineoss.drv/audio.c     |  231 +++++++++++++++++++++---------------------
 dlls/wineoss.drv/audio.h     |    5 +-
 dlls/wineoss.drv/dscapture.c |   70 +++++++-------
 dlls/wineoss.drv/dsrender.c  |   66 ++++++------
 4 files changed, 184 insertions(+), 188 deletions(-)

diff --git a/dlls/wineoss.drv/audio.c b/dlls/wineoss.drv/audio.c
index 332280b..088c959 100644
--- a/dlls/wineoss.drv/audio.c
+++ b/dlls/wineoss.drv/audio.c
@@ -82,7 +82,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(wave);
 
 #ifdef HAVE_OSS
 
-OSS_DEVICE      OSS_Devices[MAX_WAVEDRV];
 WINE_WAVEOUT    WOutDev[MAX_WAVEDRV];
 WINE_WAVEIN     WInDev[MAX_WAVEDRV];
 unsigned        numOutDev;
@@ -184,17 +183,17 @@ static DWORD wodDevInterfaceSize(UINT wDevID, LPDWORD dwParam1)
 {
     TRACE("(%u, %p)\n", wDevID, dwParam1);
 
-    *dwParam1 = MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].ossdev->interface_name, -1,
+    *dwParam1 = MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].ossdev.interface_name, -1,
                                     NULL, 0 ) * sizeof(WCHAR);
     return MMSYSERR_NOERROR;
 }
 
 static DWORD wodDevInterface(UINT wDevID, PWCHAR dwParam1, DWORD dwParam2)
 {
-    if (dwParam2 >= MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].ossdev->interface_name, -1,
+    if (dwParam2 >= MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].ossdev.interface_name, -1,
                                         NULL, 0 ) * sizeof(WCHAR))
     {
-        MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].ossdev->interface_name, -1,
+        MultiByteToWideChar(CP_ACP, 0, WOutDev[wDevID].ossdev.interface_name, -1,
                             dwParam1, dwParam2 / sizeof(WCHAR));
 	return MMSYSERR_NOERROR;
     }
@@ -206,17 +205,17 @@ static DWORD widDevInterfaceSize(UINT wDevID, LPDWORD dwParam1)
 {
     TRACE("(%u, %p)\n", wDevID, dwParam1);
 
-    *dwParam1 = MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].ossdev->interface_name, -1,
+    *dwParam1 = MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].ossdev.interface_name, -1,
                                     NULL, 0 ) * sizeof(WCHAR);
     return MMSYSERR_NOERROR;
 }
 
 static DWORD widDevInterface(UINT wDevID, PWCHAR dwParam1, DWORD dwParam2)
 {
-    if (dwParam2 >= MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].ossdev->interface_name, -1,
+    if (dwParam2 >= MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].ossdev.interface_name, -1,
                                         NULL, 0 ) * sizeof(WCHAR))
     {
-        MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].ossdev->interface_name, -1,
+        MultiByteToWideChar(CP_ACP, 0, WInDev[wDevID].ossdev.interface_name, -1,
                             dwParam1, dwParam2 / sizeof(WCHAR));
 	return MMSYSERR_NOERROR;
     }
@@ -1152,46 +1151,46 @@ LRESULT OSS_WaveInit(void)
     char* str;
     int i;
 
-    TRACE("()\n");
+    FIXME("() stub\n");
 
     str=getenv("AUDIODEV");
     if (str!=NULL)
     {
-        OSS_Devices[0].dev_name=StrDup(str,"");
-        OSS_Devices[0].mixer_name=StrDup(getenv("MIXERDEV"),"/dev/mixer");
+        WOutDev[0].ossdev.dev_name = WInDev[0].ossdev.dev_name = StrDup(str,"");
+        WOutDev[0].ossdev.mixer_name = WInDev[0].ossdev.mixer_name = StrDup(getenv("MIXERDEV"),"/dev/mixer");
         for (i = 1; i < MAX_WAVEDRV; ++i)
         {
-            OSS_Devices[i].dev_name=StrDup("",NULL);
-            OSS_Devices[i].mixer_name=StrDup("",NULL);
+            WOutDev[i].ossdev.dev_name = WInDev[i].ossdev.dev_name = StrDup("",NULL);
+            WOutDev[i].ossdev.mixer_name = WInDev[i].ossdev.mixer_name = StrDup("",NULL);
         }
     }
     else
     {
-        OSS_Devices[0].dev_name=StrDup("/dev/dsp",NULL);
-        OSS_Devices[0].mixer_name=StrDup("/dev/mixer",NULL);
+        WOutDev[0].ossdev.dev_name = WInDev[0].ossdev.dev_name = StrDup("/dev/dsp",NULL);
+        WOutDev[0].ossdev.mixer_name = WInDev[0].ossdev.mixer_name = StrDup("/dev/mixer",NULL);
         for (i = 1; i < MAX_WAVEDRV; ++i)
         {
-            OSS_Devices[i].dev_name=HeapAlloc(GetProcessHeap(),0,11);
-            sprintf(OSS_Devices[i].dev_name, "/dev/dsp%d", i);
-            OSS_Devices[i].mixer_name=HeapAlloc(GetProcessHeap(),0,13);
-            sprintf(OSS_Devices[i].mixer_name, "/dev/mixer%d", i);
+            WOutDev[i].ossdev.dev_name = WInDev[i].ossdev.dev_name = HeapAlloc(GetProcessHeap(),0,11);
+            sprintf(WOutDev[i].ossdev.dev_name, "/dev/dsp%d", i);
+            WOutDev[i].ossdev.mixer_name = WInDev[i].ossdev.mixer_name = HeapAlloc(GetProcessHeap(),0,13);
+            sprintf(WOutDev[i].ossdev.mixer_name, "/dev/mixer%d", i);
         }
     }
 
     for (i = 0; i < MAX_WAVEDRV; ++i)
     {
-        OSS_Devices[i].interface_name=HeapAlloc(GetProcessHeap(),0,9+strlen(OSS_Devices[i].dev_name)+1);
-        sprintf(OSS_Devices[i].interface_name, "wineoss: %s", OSS_Devices[i].dev_name);
+        WOutDev[i].ossdev.interface_name = WInDev[i].ossdev.interface_name =
+            HeapAlloc(GetProcessHeap(),0,9+strlen(WOutDev[i].ossdev.dev_name)+1);
+        sprintf(WOutDev[i].ossdev.interface_name, "wineoss: %s", WOutDev[i].ossdev.dev_name);
     }
 
     /* start with output devices */
     for (i = 0; i < MAX_WAVEDRV; ++i)
     {
-        if (*OSS_Devices[i].dev_name=='\0' || OSS_WaveOutInit(&OSS_Devices[i]))
+        if (*WOutDev[i].ossdev.dev_name == '\0' || OSS_WaveOutInit(&WOutDev[i].ossdev))
         {
             WOutDev[numOutDev].state = WINE_WS_CLOSED;
-            WOutDev[numOutDev].ossdev = &OSS_Devices[i];
-	    WOutDev[numOutDev].volume = 0xffffffff;
+            WOutDev[numOutDev].volume = 0xffffffff;
             numOutDev++;
         }
     }
@@ -1199,29 +1198,28 @@ LRESULT OSS_WaveInit(void)
     /* then do input devices */
     for (i = 0; i < MAX_WAVEDRV; ++i)
     {
-        if (*OSS_Devices[i].dev_name=='\0' || OSS_WaveInInit(&OSS_Devices[i]))
+        if (*WInDev[i].ossdev.dev_name=='\0' || OSS_WaveInInit(&WInDev[i].ossdev))
         {
             WInDev[numInDev].state = WINE_WS_CLOSED;
-            WInDev[numInDev].ossdev = &OSS_Devices[i];
             numInDev++;
         }
     }
 
     /* finish with the full duplex bits */
     for (i = 0; i < MAX_WAVEDRV; i++)
-        if (*OSS_Devices[i].dev_name!='\0')
-            OSS_WaveFullDuplexInit(&OSS_Devices[i]);
+        if (*WOutDev[i].ossdev.dev_name!='\0')
+            OSS_WaveFullDuplexInit(&WOutDev[i].ossdev);
 
     TRACE("%d wave out devices\n", numOutDev);
     for (i = 0; i < numOutDev; i++) {
-        TRACE("%d: %s, %s, %s\n", i, WOutDev[i].ossdev->dev_name,
-              WOutDev[i].ossdev->mixer_name, WOutDev[i].ossdev->interface_name);
+        TRACE("%d: %s, %s, %s\n", i, WOutDev[i].ossdev.dev_name,
+              WOutDev[i].ossdev.mixer_name, WOutDev[i].ossdev.interface_name);
     }
 
     TRACE("%d wave in devices\n", numInDev);
     for (i = 0; i < numInDev; i++) {
-        TRACE("%d: %s, %s, %s\n", i, WInDev[i].ossdev->dev_name,
-              WInDev[i].ossdev->mixer_name, WInDev[i].ossdev->interface_name);
+        TRACE("%d: %s, %s, %s\n", i, WInDev[i].ossdev.dev_name,
+              WInDev[i].ossdev.mixer_name, WInDev[i].ossdev.interface_name);
     }
 
     return 0;
@@ -1239,12 +1237,11 @@ LRESULT OSS_WaveExit(void)
 
     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);
+        HeapFree(GetProcessHeap(), 0, WOutDev[i].ossdev.dev_name);
+        HeapFree(GetProcessHeap(), 0, WOutDev[i].ossdev.mixer_name);
+        HeapFree(GetProcessHeap(), 0, WOutDev[i].ossdev.interface_name);
     }
 
-    ZeroMemory(OSS_Devices, sizeof(OSS_Devices));
     ZeroMemory(WOutDev, sizeof(WOutDev));
     ZeroMemory(WInDev, sizeof(WInDev));
 
@@ -1459,8 +1456,8 @@ static BOOL wodUpdatePlayedTotal(WINE_WAVEOUT* wwo, audio_buf_info* info)
     DWORD notplayed;
     if (!info) info = &dspspace;
 
-    if (ioctl(wwo->ossdev->fd, SNDCTL_DSP_GETOSPACE, info) < 0) {
-        ERR("ioctl(%s, SNDCTL_DSP_GETOSPACE) failed (%s)\n", wwo->ossdev->dev_name, strerror(errno));
+    if (ioctl(wwo->ossdev.fd, SNDCTL_DSP_GETOSPACE, info) < 0) {
+        ERR("ioctl(%s, SNDCTL_DSP_GETOSPACE) failed (%s)\n", wwo->ossdev.dev_name, strerror(errno));
         return FALSE;
     }
 
@@ -1478,7 +1475,7 @@ static BOOL wodUpdatePlayedTotal(WINE_WAVEOUT* wwo, audio_buf_info* info)
         }
         else
             /* Some OSS drivers will clean up nicely if given a POST, so give 'em the chance... */
-            ioctl(wwo->ossdev->fd, SNDCTL_DSP_POST, 0);
+            ioctl(wwo->ossdev.fd, SNDCTL_DSP_POST, 0);
     }
 
     wwo->dwPlayedTotal = wwo->dwWrittenTotal - notplayed;
@@ -1608,9 +1605,9 @@ static BOOL wodPlayer_WriteMaxFrags(WINE_WAVEOUT* wwo, DWORD* bytes)
 
     if (toWrite > 0)
     {
-        written = write(wwo->ossdev->fd, wwo->lpPlayPtr->lpData + wwo->dwPartialOffset, toWrite);
+        written = write(wwo->ossdev.fd, wwo->lpPlayPtr->lpData + wwo->dwPartialOffset, toWrite);
         if (written <= 0) {
-            TRACE("write(%s, %p, %d) failed (%s) returned %d\n", wwo->ossdev->dev_name,
+            TRACE("write(%s, %p, %d) failed (%s) returned %d\n", wwo->ossdev.dev_name,
                 wwo->lpPlayPtr->lpData + wwo->dwPartialOffset, toWrite, strerror(errno), written);
             return FALSE;
         }
@@ -1699,7 +1696,7 @@ static	void	wodPlayer_Reset(WINE_WAVEOUT* wwo, BOOL reset)
     wodPlayer_NotifyCompletions(wwo, FALSE);
 
     /* flush all possible output */
-    if (OSS_ResetDevice(wwo->ossdev) != MMSYSERR_NOERROR)
+    if (OSS_ResetDevice(&wwo->ossdev) != MMSYSERR_NOERROR)
     {
 	wwo->hThread = 0;
 	wwo->state = WINE_WS_STOPPED;
@@ -1868,7 +1865,7 @@ static DWORD wodPlayer_FeedDSP(WINE_WAVEOUT* wwo)
             /* OSS doesn't start before it gets either 2 fragments or a SNDCTL_DSP_POST;
              * if it didn't get one, we give it the other */
             if (wwo->dwBufferSize < availInQ + 2 * wwo->dwFragmentSize)
-                ioctl(wwo->ossdev->fd, SNDCTL_DSP_POST, 0);
+                ioctl(wwo->ossdev.fd, SNDCTL_DSP_POST, 0);
             wwo->bNeedPost = FALSE;
         }
     }
@@ -1913,7 +1910,7 @@ static	DWORD	CALLBACK	wodPlayer(LPVOID pmt)
 		wodPlayer_ProcessMessages(wwo);
 		if (!wwo->lpPlayPtr) {
 		    TRACE("flushing\n");
-		    ioctl(wwo->ossdev->fd, SNDCTL_DSP_SYNC, 0);
+		    ioctl(wwo->ossdev.fd, SNDCTL_DSP_SYNC, 0);
 		    wwo->dwPlayedTotal = wwo->dwWrittenTotal;
                     dwNextNotifyTime = wodPlayer_NotifyCompletions(wwo, FALSE);
 		} else {
@@ -1944,10 +1941,10 @@ static DWORD wodGetDevCaps(WORD wDevID, LPWAVEOUTCAPSW lpCaps, DWORD dwSize)
 	return MMSYSERR_BADDEVICEID;
     }
 
-    if (WOutDev[wDevID].ossdev->open_access == O_RDWR)
-        memcpy(lpCaps, &WOutDev[wDevID].ossdev->duplex_out_caps, min(dwSize, sizeof(*lpCaps)));
+    if (WOutDev[wDevID].ossdev.open_access == O_RDWR)
+        memcpy(lpCaps, &WOutDev[wDevID].ossdev.duplex_out_caps, min(dwSize, sizeof(*lpCaps)));
     else
-        memcpy(lpCaps, &WOutDev[wDevID].ossdev->out_caps, min(dwSize, sizeof(*lpCaps)));
+        memcpy(lpCaps, &WOutDev[wDevID].ossdev.out_caps, min(dwSize, sizeof(*lpCaps)));
 
     return MMSYSERR_NOERROR;
 }
@@ -1998,12 +1995,12 @@ DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
     wwo = &WOutDev[wDevID];
 
     if ((dwFlags & WAVE_DIRECTSOUND) &&
-        !(wwo->ossdev->duplex_out_caps.dwSupport & WAVECAPS_DIRECTSOUND))
+        !(wwo->ossdev.duplex_out_caps.dwSupport & WAVECAPS_DIRECTSOUND))
 	/* not supported, ignore it */
 	dwFlags &= ~WAVE_DIRECTSOUND;
 
     if (dwFlags & WAVE_DIRECTSOUND) {
-        if (wwo->ossdev->duplex_out_caps.dwSupport & WAVECAPS_SAMPLEACCURATE)
+        if (wwo->ossdev.duplex_out_caps.dwSupport & WAVECAPS_SAMPLEACCURATE)
 	    /* we have realtime DirectSound, fragments just waste our time,
 	     * but a large buffer is good, so choose 64KB (32 * 2^11) */
 	    audio_fragment = 0x0020000B;
@@ -2034,7 +2031,7 @@ DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 
     /* we want to be able to mmap() the device, which means it must be opened readable,
      * otherwise mmap() will fail (at least under Linux) */
-    ret = OSS_OpenDevice(wwo->ossdev,
+    ret = OSS_OpenDevice(&wwo->ossdev,
                          (dwFlags & WAVE_DIRECTSOUND) ? O_RDWR : O_WRONLY,
                          &audio_fragment,
                          (dwFlags & WAVE_DIRECTSOUND) ? 0 : 1,
@@ -2043,9 +2040,9 @@ DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
                          (lpDesc->lpFormat->wBitsPerSample == 16)
                              ? AFMT_S16_LE : AFMT_U8);
     if ((ret==MMSYSERR_NOERROR) && (dwFlags & WAVE_DIRECTSOUND)) {
-        lpDesc->lpFormat->nSamplesPerSec=wwo->ossdev->sample_rate;
-        lpDesc->lpFormat->nChannels=wwo->ossdev->channels;
-        lpDesc->lpFormat->wBitsPerSample=(wwo->ossdev->format == AFMT_U8 ? 8 : 16);
+        lpDesc->lpFormat->nSamplesPerSec=wwo->ossdev.sample_rate;
+        lpDesc->lpFormat->nChannels=wwo->ossdev.channels;
+        lpDesc->lpFormat->wBitsPerSample=(wwo->ossdev.format == AFMT_U8 ? 8 : 16);
         lpDesc->lpFormat->nBlockAlign=lpDesc->lpFormat->nChannels*lpDesc->lpFormat->wBitsPerSample/8;
         lpDesc->lpFormat->nAvgBytesPerSec=lpDesc->lpFormat->nSamplesPerSec*lpDesc->lpFormat->nBlockAlign;
         TRACE("OSS_OpenDevice returned this format: %dx%dx%d\n",
@@ -2069,16 +2066,16 @@ DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 	    wwo->waveFormat.Format.nChannels;
     }
     /* Read output space info for future reference */
-    if (ioctl(wwo->ossdev->fd, SNDCTL_DSP_GETOSPACE, &info) < 0) {
-	ERR("ioctl(%s, SNDCTL_DSP_GETOSPACE) failed (%s)\n", wwo->ossdev->dev_name, strerror(errno));
-        OSS_CloseDevice(wwo->ossdev);
+    if (ioctl(wwo->ossdev.fd, SNDCTL_DSP_GETOSPACE, &info) < 0) {
+	ERR("ioctl(%s, SNDCTL_DSP_GETOSPACE) failed (%s)\n", wwo->ossdev.dev_name, strerror(errno));
+        OSS_CloseDevice(&wwo->ossdev);
 	wwo->state = WINE_WS_CLOSED;
 	return MMSYSERR_NOTENABLED;
     }
 
     TRACE("got %d %d byte fragments (%d ms/fragment)\n", info.fragstotal,
-        info.fragsize, (info.fragsize * 1000) / (wwo->ossdev->sample_rate *
-        wwo->ossdev->channels * (wwo->ossdev->format == AFMT_U8 ? 1 : 2)));
+        info.fragsize, (info.fragsize * 1000) / (wwo->ossdev.sample_rate *
+        wwo->ossdev.channels * (wwo->ossdev.format == AFMT_U8 ? 1 : 2)));
 
     /* Check that fragsize is correct per our settings above */
     if ((info.fragsize > 1024) && (LOWORD(audio_fragment) <= 10)) {
@@ -2094,7 +2091,7 @@ DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
     wwo->bNeedPost = TRUE;
 
     TRACE("fd=%d fragstotal=%d fragsize=%d BufferSize=%d\n",
-          wwo->ossdev->fd, info.fragstotal, info.fragsize, wwo->dwBufferSize);
+          wwo->ossdev.fd, info.fragstotal, info.fragsize, wwo->dwBufferSize);
     if (wwo->dwFragmentSize % wwo->waveFormat.Format.nBlockAlign) {
         ERR("Fragment doesn't contain an integral number of data blocks fragsize=%d BlockAlign=%d\n",wwo->dwFragmentSize,wwo->waveFormat.Format.nBlockAlign);
         /* Some SoundBlaster 16 cards return an incorrect (odd) fragment
@@ -2149,7 +2146,7 @@ static DWORD wodClose(WORD wDevID)
 
         OSS_DestroyRingMessage(&wwo->msgRing);
 
-        OSS_CloseDevice(wwo->ossdev);
+        OSS_CloseDevice(&wwo->ossdev);
 	wwo->state = WINE_WS_CLOSED;
 	wwo->dwFragmentSize = 0;
 	ret = wodNotifyClient(wwo, WOM_CLOSE, 0L, 0L);
@@ -2269,11 +2266,11 @@ static DWORD wodGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
 
     wwo = &WOutDev[wDevID];
 #ifdef EXACT_WODPOSITION
-    if (wwo->ossdev->open_access == O_RDWR) {
-        if (wwo->ossdev->duplex_out_caps.dwSupport & WAVECAPS_SAMPLEACCURATE)
+    if (wwo->ossdev.open_access == O_RDWR) {
+        if (wwo->ossdev.duplex_out_caps.dwSupport & WAVECAPS_SAMPLEACCURATE)
 	    OSS_AddRingMessage(&wwo->msgRing, WINE_WM_UPDATE, 0, TRUE);
     } else {
-        if (wwo->ossdev->out_caps.dwSupport & WAVECAPS_SAMPLEACCURATE)
+        if (wwo->ossdev.out_caps.dwSupport & WAVECAPS_SAMPLEACCURATE)
 	    OSS_AddRingMessage(&wwo->msgRing, WINE_WM_UPDATE, 0, TRUE);
     }
 #endif
@@ -2316,26 +2313,26 @@ static DWORD wodGetVolume(WORD wDevID, LPDWORD lpdwVol)
         WARN("invalid parameter\n");
         return MMSYSERR_INVALPARAM;
     }
-    if (WOutDev[wDevID].ossdev->open_access == O_RDWR) {
-        if (!(WOutDev[wDevID].ossdev->duplex_out_caps.dwSupport & WAVECAPS_VOLUME)) { 
+    if (WOutDev[wDevID].ossdev.open_access == O_RDWR) {
+        if (!(WOutDev[wDevID].ossdev.duplex_out_caps.dwSupport & WAVECAPS_VOLUME)) { 
             TRACE("Volume not supported\n");
             return MMSYSERR_NOTSUPPORTED;
         }
     } else {
-        if (!(WOutDev[wDevID].ossdev->out_caps.dwSupport & WAVECAPS_VOLUME)) { 
+        if (!(WOutDev[wDevID].ossdev.out_caps.dwSupport & WAVECAPS_VOLUME)) { 
             TRACE("Volume not supported\n");
             return MMSYSERR_NOTSUPPORTED;
         }
     }
 
-    if ((mixer = open(WOutDev[wDevID].ossdev->mixer_name, O_RDONLY|O_NDELAY)) < 0) {
+    if ((mixer = open(WOutDev[wDevID].ossdev.mixer_name, O_RDONLY|O_NDELAY)) < 0) {
         WARN("mixer device not available !\n");
         return MMSYSERR_NOTENABLED;
     }
     if (ioctl(mixer, SOUND_MIXER_READ_PCM, &volume) == -1) {
         close(mixer);
         WARN("ioctl(%s, SOUND_MIXER_READ_PCM) failed (%s)\n",
-             WOutDev[wDevID].ossdev->mixer_name, strerror(errno));
+             WOutDev[wDevID].ossdev.mixer_name, strerror(errno));
         return MMSYSERR_NOTENABLED;
     }
     close(mixer);
@@ -2372,25 +2369,25 @@ DWORD wodSetVolume(WORD wDevID, DWORD dwParam)
         WARN("invalid parameter: wDevID > %d\n", numOutDev);
         return MMSYSERR_INVALPARAM;
     }
-    if (WOutDev[wDevID].ossdev->open_access == O_RDWR) {
-        if (!(WOutDev[wDevID].ossdev->duplex_out_caps.dwSupport & WAVECAPS_VOLUME)) { 
+    if (WOutDev[wDevID].ossdev.open_access == O_RDWR) {
+        if (!(WOutDev[wDevID].ossdev.duplex_out_caps.dwSupport & WAVECAPS_VOLUME)) { 
             TRACE("Volume not supported\n");
             return MMSYSERR_NOTSUPPORTED;
         }
     } else {
-        if (!(WOutDev[wDevID].ossdev->out_caps.dwSupport & WAVECAPS_VOLUME)) { 
+        if (!(WOutDev[wDevID].ossdev.out_caps.dwSupport & WAVECAPS_VOLUME)) { 
             TRACE("Volume not supported\n");
             return MMSYSERR_NOTSUPPORTED;
         }
     }
-    if ((mixer = open(WOutDev[wDevID].ossdev->mixer_name, O_WRONLY|O_NDELAY)) < 0) {
-        WARN("open(%s) failed (%s)\n", WOutDev[wDevID].ossdev->mixer_name, strerror(errno));
+    if ((mixer = open(WOutDev[wDevID].ossdev.mixer_name, O_WRONLY|O_NDELAY)) < 0) {
+        WARN("open(%s) failed (%s)\n", WOutDev[wDevID].ossdev.mixer_name, strerror(errno));
         return MMSYSERR_NOTENABLED;
     }
     if (ioctl(mixer, SOUND_MIXER_WRITE_PCM, &volume) == -1) {
         close(mixer);
         WARN("ioctl(%s, SOUND_MIXER_WRITE_PCM) failed (%s)\n",
-            WOutDev[wDevID].ossdev->mixer_name, strerror(errno));
+            WOutDev[wDevID].ossdev.mixer_name, strerror(errno));
         return MMSYSERR_NOTENABLED;
     }
     TRACE("volume=%04x\n", (unsigned)volume);
@@ -2493,7 +2490,7 @@ static DWORD widGetDevCaps(WORD wDevID, LPWAVEINCAPSW lpCaps, DWORD dwSize)
 	return MMSYSERR_BADDEVICEID;
     }
 
-    memcpy(lpCaps, &WInDev[wDevID].ossdev->in_caps, min(dwSize, sizeof(*lpCaps)));
+    memcpy(lpCaps, &WInDev[wDevID].ossdev.in_caps, min(dwSize, sizeof(*lpCaps)));
     return MMSYSERR_NOERROR;
 }
 
@@ -2552,15 +2549,15 @@ static	DWORD	CALLBACK	widRecorder(LPVOID pmt)
     SetEvent(wwi->hStartUpEvent);
 
     /* disable input so capture will begin when triggered */
-    wwi->ossdev->bInputEnabled = FALSE;
-    enable = getEnables(wwi->ossdev);
-    if (ioctl(wwi->ossdev->fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0)
-	ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n", wwi->ossdev->dev_name, strerror(errno));
+    wwi->ossdev.bInputEnabled = FALSE;
+    enable = getEnables(&wwi->ossdev);
+    if (ioctl(wwi->ossdev.fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0)
+	ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n", wwi->ossdev.dev_name, strerror(errno));
 
     /* the soundblaster live needs a micro wake to get its recording started
      * (or GETISPACE will have 0 frags all the time)
      */
-    read(wwi->ossdev->fd, &xs, 4);
+    read(wwi->ossdev.fd, &xs, 4);
 
     /* make sleep time to be # of ms to output a fragment */
     dwSleepTime = (wwi->dwFragmentSize * 1000) / wwi->waveFormat.Format.nAvgBytesPerSec;
@@ -2576,7 +2573,7 @@ static	DWORD	CALLBACK	widRecorder(LPVOID pmt)
         {
             lpWaveHdr = wwi->lpQueuePtr;
 
-	    ioctl(wwi->ossdev->fd, SNDCTL_DSP_GETISPACE, &info);
+	    ioctl(wwi->ossdev.fd, SNDCTL_DSP_GETISPACE, &info);
             TRACE("info={frag=%d fsize=%d ftotal=%d bytes=%d}\n", info.fragments, info.fragsize, info.fragstotal, info.bytes);
 
             /* read all the fragments accumulated so far */
@@ -2587,7 +2584,7 @@ static	DWORD	CALLBACK	widRecorder(LPVOID pmt)
                 if (lpWaveHdr->dwBufferLength - lpWaveHdr->dwBytesRecorded >= wwi->dwFragmentSize)
                 {
                     /* directly read fragment in wavehdr */
-                    bytesRead = read(wwi->ossdev->fd,
+                    bytesRead = read(wwi->ossdev.fd,
 		      		     lpWaveHdr->lpData + lpWaveHdr->dwBytesRecorded,
                                      wwi->dwFragmentSize);
 
@@ -2615,7 +2612,7 @@ static	DWORD	CALLBACK	widRecorder(LPVOID pmt)
 			    lpWaveHdr = lpNext;
 			}
                     } else {
-                        TRACE("read(%s, %p, %d) failed (%s)\n", wwi->ossdev->dev_name,
+                        TRACE("read(%s, %p, %d) failed (%s)\n", wwi->ossdev.dev_name,
                             lpWaveHdr->lpData + lpWaveHdr->dwBytesRecorded,
                             wwi->dwFragmentSize, strerror(errno));
                     }
@@ -2623,13 +2620,13 @@ static	DWORD	CALLBACK	widRecorder(LPVOID pmt)
                 else
 		{
                     /* read the fragment in a local buffer */
-                    bytesRead = read(wwi->ossdev->fd, buffer, wwi->dwFragmentSize);
+                    bytesRead = read(wwi->ossdev.fd, buffer, wwi->dwFragmentSize);
                     pOffset = buffer;
 
                     TRACE("bytesRead=%d (local)\n", bytesRead);
 
                     if (bytesRead == (DWORD) -1) {
-                        TRACE("read(%s, %p, %d) failed (%s)\n", wwi->ossdev->dev_name,
+                        TRACE("read(%s, %p, %d) failed (%s)\n", wwi->ossdev.dev_name,
                             buffer, wwi->dwFragmentSize, strerror(errno));
                         continue;
                     }
@@ -2718,21 +2715,21 @@ static	DWORD	CALLBACK	widRecorder(LPVOID pmt)
 	    case WINE_WM_STARTING:
 		wwi->state = WINE_WS_PLAYING;
 
-                if (wwi->ossdev->bTriggerSupport)
+                if (wwi->ossdev.bTriggerSupport)
                 {
                     /* start the recording */
-		    wwi->ossdev->bInputEnabled = TRUE;
-                    enable = getEnables(wwi->ossdev);
-                    if (ioctl(wwi->ossdev->fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
-		        wwi->ossdev->bInputEnabled = FALSE;
-                        ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n", wwi->ossdev->dev_name, strerror(errno));
+		    wwi->ossdev.bInputEnabled = TRUE;
+                    enable = getEnables(&wwi->ossdev);
+                    if (ioctl(wwi->ossdev.fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
+		        wwi->ossdev.bInputEnabled = FALSE;
+                        ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n", wwi->ossdev.dev_name, strerror(errno));
 		    }
                 }
                 else
                 {
                     unsigned char data[4];
                     /* read 4 bytes to start the recording */
-                    read(wwi->ossdev->fd, data, 4);
+                    read(wwi->ossdev.fd, data, 4);
                 }
 
 		SetEvent(ev);
@@ -2751,14 +2748,14 @@ static	DWORD	CALLBACK	widRecorder(LPVOID pmt)
 	    case WINE_WM_STOPPING:
 		if (wwi->state != WINE_WS_STOPPED)
 		{
-                    if (wwi->ossdev->bTriggerSupport)
+                    if (wwi->ossdev.bTriggerSupport)
                     {
                         /* stop the recording */
-		        wwi->ossdev->bInputEnabled = FALSE;
-                        enable = getEnables(wwi->ossdev);
-                        if (ioctl(wwi->ossdev->fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
-		            wwi->ossdev->bInputEnabled = FALSE;
-                            ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n", wwi->ossdev->dev_name, strerror(errno));
+		        wwi->ossdev.bInputEnabled = FALSE;
+                        enable = getEnables(&wwi->ossdev);
+                        if (ioctl(wwi->ossdev.fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
+		            wwi->ossdev.bInputEnabled = FALSE;
+                            ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n", wwi->ossdev.dev_name, strerror(errno));
 		        }
                     }
 
@@ -2783,14 +2780,14 @@ static	DWORD	CALLBACK	widRecorder(LPVOID pmt)
 	    case WINE_WM_RESETTING:
 		if (wwi->state != WINE_WS_STOPPED)
 		{
-                    if (wwi->ossdev->bTriggerSupport)
+                    if (wwi->ossdev.bTriggerSupport)
                     {
                         /* stop the recording */
-		        wwi->ossdev->bInputEnabled = FALSE;
-                        enable = getEnables(wwi->ossdev);
-                        if (ioctl(wwi->ossdev->fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
-		            wwi->ossdev->bInputEnabled = FALSE;
-                            ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n", wwi->ossdev->dev_name, strerror(errno));
+		        wwi->ossdev.bInputEnabled = FALSE;
+                        enable = getEnables(&wwi->ossdev);
+                        if (ioctl(wwi->ossdev.fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
+		            wwi->ossdev.bInputEnabled = FALSE;
+                            ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n", wwi->ossdev.dev_name, strerror(errno));
 		        }
                     }
 		}
@@ -2816,8 +2813,8 @@ static	DWORD	CALLBACK	widRecorder(LPVOID pmt)
 	    case WINE_WM_UPDATE:
 		if (wwi->state == WINE_WS_PLAYING) {
 		    audio_buf_info tmp_info;
-		    if (ioctl(wwi->ossdev->fd, SNDCTL_DSP_GETISPACE, &tmp_info) < 0)
-			ERR("ioctl(%s, SNDCTL_DSP_GETISPACE) failed (%s)\n", wwi->ossdev->dev_name, strerror(errno));
+		    if (ioctl(wwi->ossdev.fd, SNDCTL_DSP_GETISPACE, &tmp_info) < 0)
+			ERR("ioctl(%s, SNDCTL_DSP_GETISPACE) failed (%s)\n", wwi->ossdev.dev_name, strerror(errno));
 		    else
 			wwi->dwTotalRecorded = wwi->dwTotalRead + tmp_info.bytes;
 		}
@@ -2890,13 +2887,13 @@ DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
     if (wwi->state != WINE_WS_CLOSED) return MMSYSERR_ALLOCATED;
 
     if ((dwFlags & WAVE_DIRECTSOUND) &&
-        !(wwi->ossdev->in_caps_support & WAVECAPS_DIRECTSOUND))
+        !(wwi->ossdev.in_caps_support & WAVECAPS_DIRECTSOUND))
 	/* not supported, ignore it */
 	dwFlags &= ~WAVE_DIRECTSOUND;
 
     if (dwFlags & WAVE_DIRECTSOUND) {
 	TRACE("has DirectSoundCapture driver\n");
-        if (wwi->ossdev->in_caps_support & WAVECAPS_SAMPLEACCURATE)
+        if (wwi->ossdev.in_caps_support & WAVECAPS_SAMPLEACCURATE)
 	    /* we have realtime DirectSound, fragments just waste our time,
 	     * but a large buffer is good, so choose 64KB (32 * 2^11) */
 	    audio_fragment = 0x0020000B;
@@ -2906,11 +2903,11 @@ DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 	    audio_fragment = 0x01000008;
     } else {
 	TRACE("doesn't have DirectSoundCapture driver\n");
-	if (wwi->ossdev->open_count > 0) {
+	if (wwi->ossdev.open_count > 0) {
 	    TRACE("Using output device audio_fragment\n");
 	    /* FIXME: This may not be optimal for capture but it allows us
 	     * to do hardware playback without hardware capture. */
-	    audio_fragment = wwi->ossdev->audio_fragment;
+	    audio_fragment = wwi->ossdev.audio_fragment;
 	} else {
 	    /* A wave device must have a worst case latency of 10 ms so calculate
 	     * the largest fragment size less than 10 ms long.
@@ -2928,7 +2925,7 @@ DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 	1 << (audio_fragment & 0xffff),
 	((1 << (audio_fragment & 0xffff)) * 1000) / lpDesc->lpFormat->nAvgBytesPerSec);
 
-    ret = OSS_OpenDevice(wwi->ossdev, O_RDONLY, &audio_fragment,
+    ret = OSS_OpenDevice(&wwi->ossdev, O_RDONLY, &audio_fragment,
                          1,
                          lpDesc->lpFormat->nSamplesPerSec,
                          lpDesc->lpFormat->nChannels,
@@ -2956,17 +2953,17 @@ DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags)
 	    wwi->waveFormat.Format.nChannels;
     }
 
-    if (ioctl(wwi->ossdev->fd, SNDCTL_DSP_GETISPACE, &info) < 0) {
+    if (ioctl(wwi->ossdev.fd, SNDCTL_DSP_GETISPACE, &info) < 0) {
         ERR("ioctl(%s, SNDCTL_DSP_GETISPACE) failed (%s)\n",
-            wwi->ossdev->dev_name, strerror(errno));
-        OSS_CloseDevice(wwi->ossdev);
+            wwi->ossdev.dev_name, strerror(errno));
+        OSS_CloseDevice(&wwi->ossdev);
 	wwi->state = WINE_WS_CLOSED;
 	return MMSYSERR_NOTENABLED;
     }
 
     TRACE("got %d %d byte fragments (%d ms/fragment)\n", info.fragstotal,
-        info.fragsize, (info.fragsize * 1000) / (wwi->ossdev->sample_rate *
-        wwi->ossdev->channels * (wwi->ossdev->format == AFMT_U8 ? 1 : 2)));
+        info.fragsize, (info.fragsize * 1000) / (wwi->ossdev.sample_rate *
+        wwi->ossdev.channels * (wwi->ossdev.format == AFMT_U8 ? 1 : 2)));
 
     wwi->dwFragmentSize = info.fragsize;
 
@@ -3010,7 +3007,7 @@ static DWORD widClose(WORD wDevID)
     }
 
     OSS_AddRingMessage(&wwi->msgRing, WINE_WM_CLOSING, 0, TRUE);
-    OSS_CloseDevice(wwi->ossdev);
+    OSS_CloseDevice(&wwi->ossdev);
     wwi->state = WINE_WS_CLOSED;
     wwi->dwFragmentSize = 0;
     OSS_DestroyRingMessage(&wwi->msgRing);
@@ -3112,7 +3109,7 @@ static DWORD widGetPosition(WORD wDevID, LPMMTIME lpTime, DWORD uSize)
 
     wwi = &WInDev[wDevID];
 #ifdef EXACT_WIDPOSITION
-    if (wwi->ossdev->in_caps_support & WAVECAPS_SAMPLEACCURATE)
+    if (wwi->ossdev.in_caps_support & WAVECAPS_SAMPLEACCURATE)
         OSS_AddRingMessage(&(wwi->msgRing), WINE_WM_UPDATE, 0, TRUE);
 #endif
 
diff --git a/dlls/wineoss.drv/audio.h b/dlls/wineoss.drv/audio.h
index 6fdb670..be63145 100644
--- a/dlls/wineoss.drv/audio.h
+++ b/dlls/wineoss.drv/audio.h
@@ -110,7 +110,7 @@ typedef struct tagOSS_DEVICE {
 } OSS_DEVICE;
 
 typedef struct {
-    OSS_DEVICE*                 ossdev;
+    OSS_DEVICE ossdev;
     volatile int		state;			/* one of the WINE_WS_ manifest constants */
     WAVEOPENDESC		waveDesc;
     WORD			wFlags;
@@ -143,7 +143,7 @@ typedef struct {
 } WINE_WAVEOUT;
 
 typedef struct {
-    OSS_DEVICE*                 ossdev;
+    OSS_DEVICE ossdev;
     volatile int		state;
     DWORD			dwFragmentSize;		/* OpenSound '/dev/dsp' give us that size */
     WAVEOPENDESC		waveDesc;
@@ -160,7 +160,6 @@ typedef struct {
     OSS_MSG_RING		msgRing;
 } WINE_WAVEIN;
 
-extern OSS_DEVICE       OSS_Devices[MAX_WAVEDRV];
 extern WINE_WAVEOUT	WOutDev[MAX_WAVEDRV];
 extern WINE_WAVEIN	WInDev[MAX_WAVEDRV];
 extern unsigned         numOutDev;
diff --git a/dlls/wineoss.drv/dscapture.c b/dlls/wineoss.drv/dscapture.c
index 065bd79..0724ea8 100644
--- a/dlls/wineoss.drv/dscapture.c
+++ b/dlls/wineoss.drv/dscapture.c
@@ -356,7 +356,7 @@ static HRESULT DSCDB_MapBuffer(IDsCaptureDriverBufferImpl *dscdb)
 {
     if (!dscdb->mapping) {
         dscdb->mapping = mmap(NULL, dscdb->maplen, PROT_READ, MAP_SHARED,
-                              WInDev[dscdb->drv->wDevID].ossdev->fd, 0);
+                              WInDev[dscdb->drv->wDevID].ossdev.fd, 0);
         if (dscdb->mapping == (LPBYTE)-1) {
             TRACE("(%p): Could not map sound device for direct access (%s)\n",
                   dscdb, strerror(errno));
@@ -462,7 +462,7 @@ static ULONG WINAPI IDsCaptureDriverBufferImpl_Release(PIDSCDRIVERBUFFER iface)
 
         DSCDB_UnmapBuffer(This);
 
-        OSS_CloseDevice(wwi->ossdev);
+        OSS_CloseDevice(&wwi->ossdev);
         wwi->state = WINE_WS_CLOSED;
         wwi->dwFragmentSize = 0;
         This->drv->capture_buffer = NULL;
@@ -619,28 +619,28 @@ static HRESULT WINAPI IDsCaptureDriverBufferImpl_Start(
     if (dwFlags & DSCBSTART_LOOPING)
         This->is_looping = TRUE;
 
-    WInDev[This->drv->wDevID].ossdev->bInputEnabled = TRUE;
-    enable = getEnables(WInDev[This->drv->wDevID].ossdev);
-    if (ioctl(WInDev[This->drv->wDevID].ossdev->fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
+    WInDev[This->drv->wDevID].ossdev.bInputEnabled = TRUE;
+    enable = getEnables(&WInDev[This->drv->wDevID].ossdev);
+    if (ioctl(WInDev[This->drv->wDevID].ossdev.fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
         if (errno == EINVAL) {
             /* Don't give up yet. OSS trigger support is inconsistent. */
-            if (WInDev[This->drv->wDevID].ossdev->open_count == 1) {
+            if (WInDev[This->drv->wDevID].ossdev.open_count == 1) {
                 /* try the opposite output enable */
-                if (WInDev[This->drv->wDevID].ossdev->bOutputEnabled == FALSE)
-                    WInDev[This->drv->wDevID].ossdev->bOutputEnabled = TRUE;
+                if (WInDev[This->drv->wDevID].ossdev.bOutputEnabled == FALSE)
+                    WInDev[This->drv->wDevID].ossdev.bOutputEnabled = TRUE;
                 else
-                    WInDev[This->drv->wDevID].ossdev->bOutputEnabled = FALSE;
+                    WInDev[This->drv->wDevID].ossdev.bOutputEnabled = FALSE;
                 /* try it again */
-                enable = getEnables(WInDev[This->drv->wDevID].ossdev);
-                if (ioctl(WInDev[This->drv->wDevID].ossdev->fd, SNDCTL_DSP_SETTRIGGER, &enable) >= 0) {
+                enable = getEnables(&WInDev[This->drv->wDevID].ossdev);
+                if (ioctl(WInDev[This->drv->wDevID].ossdev.fd, SNDCTL_DSP_SETTRIGGER, &enable) >= 0) {
                     This->is_capturing = TRUE;
                     return DS_OK;
                 }
             }
         }
         ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n",
-            WInDev[This->drv->wDevID].ossdev->dev_name, strerror(errno));
-        WInDev[This->drv->wDevID].ossdev->bInputEnabled = FALSE;
+            WInDev[This->drv->wDevID].ossdev.dev_name, strerror(errno));
+        WInDev[This->drv->wDevID].ossdev.bInputEnabled = FALSE;
         return DSERR_GENERIC;
     }
 
@@ -658,11 +658,11 @@ static HRESULT WINAPI IDsCaptureDriverBufferImpl_Stop(PIDSCDRIVERBUFFER iface)
         return DS_OK;
 
     /* no more capturing */
-    WInDev[This->drv->wDevID].ossdev->bInputEnabled = FALSE;
-    enable = getEnables(WInDev[This->drv->wDevID].ossdev);
-    if (ioctl(WInDev[This->drv->wDevID].ossdev->fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
+    WInDev[This->drv->wDevID].ossdev.bInputEnabled = FALSE;
+    enable = getEnables(&WInDev[This->drv->wDevID].ossdev);
+    if (ioctl(WInDev[This->drv->wDevID].ossdev.fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
         ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n",
-            WInDev[This->drv->wDevID].ossdev->dev_name,  strerror(errno));
+            WInDev[This->drv->wDevID].ossdev.dev_name,  strerror(errno));
         return DSERR_GENERIC;
     }
 
@@ -769,7 +769,7 @@ static HRESULT WINAPI IDsCaptureDriverImpl_GetDriverDesc(
     }
 
     /* copy version from driver */
-    memcpy(pDesc, &(WInDev[This->wDevID].ossdev->ds_desc), sizeof(DSDRIVERDESC));
+    memcpy(pDesc, &(WInDev[This->wDevID].ossdev.ds_desc), sizeof(DSDRIVERDESC));
 
     pDesc->dnDevNode            = WInDev[This->wDevID].waveDesc.dnDevNode;
     pDesc->wVxdId               = 0;
@@ -809,7 +809,7 @@ static HRESULT WINAPI IDsCaptureDriverImpl_GetCaps(
 {
     IDsCaptureDriverImpl *This = (IDsCaptureDriverImpl *)iface;
     TRACE("(%p,%p)\n",This,pCaps);
-    memcpy(pCaps, &(WInDev[This->wDevID].ossdev->dsc_caps), sizeof(DSCDRIVERCAPS));
+    memcpy(pCaps, &(WInDev[This->wDevID].ossdev.dsc_caps), sizeof(DSCDRIVERCAPS));
     return DS_OK;
 }
 
@@ -902,7 +902,7 @@ static DWORD CALLBACK DSCDB_Thread(LPVOID lpParameter)
             /* get the current DMA position */
             if (ioctl(This->fd, SNDCTL_DSP_GETIPTR, &info) < 0) {
                 ERR("ioctl(%s, SNDCTL_DSP_GETIPTR) failed (%s)\n",
-                    WInDev[This->drv->wDevID].ossdev->dev_name, strerror(errno));
+                    WInDev[This->drv->wDevID].ossdev.dev_name, strerror(errno));
                 return DSERR_GENERIC;
             }
 
@@ -1044,9 +1044,9 @@ static HRESULT WINAPI IDsCaptureDriverImpl_CreateCaptureBuffer(
     if (wwi->state == WINE_WS_CLOSED) {
         unsigned int frag_size;
 
-        if (wwi->ossdev->open_count > 0) {
+        if (wwi->ossdev.open_count > 0) {
             /* opened already so use existing fragment size */
-            audio_fragment = wwi->ossdev->audio_fragment;
+            audio_fragment = wwi->ossdev.audio_fragment;
         } else {
             /* calculate a fragment size */
             unsigned int mask = 0xffffffff;
@@ -1107,7 +1107,7 @@ static HRESULT WINAPI IDsCaptureDriverImpl_CreateCaptureBuffer(
               audio_fragment >> 16, frag_size, frag_size * (audio_fragment >> 16),
               (frag_size * 1000) / pwfx->nAvgBytesPerSec);
 
-        ret = OSS_OpenDevice(wwi->ossdev, O_RDWR, &audio_fragment, 1,
+        ret = OSS_OpenDevice(&wwi->ossdev, O_RDWR, &audio_fragment, 1,
                              pwfx->nSamplesPerSec,
                              (pwfx->nChannels > 1) ? 1 : 0,
                              (pwfx->wBitsPerSample == 16)
@@ -1123,10 +1123,10 @@ static HRESULT WINAPI IDsCaptureDriverImpl_CreateCaptureBuffer(
         wwi->state = WINE_WS_STOPPED;
 
         /* find out what fragment and buffer sizes OSS gave us */
-        if (ioctl(wwi->ossdev->fd, SNDCTL_DSP_GETISPACE, &info) < 0) {
+        if (ioctl(wwi->ossdev.fd, SNDCTL_DSP_GETISPACE, &info) < 0) {
              ERR("ioctl(%s, SNDCTL_DSP_GETISPACE) failed (%s)\n",
-                 wwi->ossdev->dev_name, strerror(errno));
-             OSS_CloseDevice(wwi->ossdev);
+                 wwi->ossdev.dev_name, strerror(errno));
+             OSS_CloseDevice(&wwi->ossdev);
              wwi->state = WINE_WS_CLOSED;
              HeapFree(GetProcessHeap(),0,*ippdscdb);
              *ippdscdb = NULL;
@@ -1152,11 +1152,11 @@ static HRESULT WINAPI IDsCaptureDriverImpl_CreateCaptureBuffer(
             TRACE("same buffer length but different fragment size\n");
         }
     }
-    (*ippdscdb)->fd = WInDev[This->wDevID].ossdev->fd;
+    (*ippdscdb)->fd = WInDev[This->wDevID].ossdev.fd;
 
     if (pipe((*ippdscdb)->pipe_fd) < 0) {
         TRACE("pipe() failed (%s)\n", strerror(errno));
-        OSS_CloseDevice(wwi->ossdev);
+        OSS_CloseDevice(&wwi->ossdev);
         wwi->state = WINE_WS_CLOSED;
         HeapFree(GetProcessHeap(),0,*ippdscdb);
         *ippdscdb = NULL;
@@ -1164,10 +1164,10 @@ static HRESULT WINAPI IDsCaptureDriverImpl_CreateCaptureBuffer(
     }
 
     /* check how big the DMA buffer is now */
-    if (ioctl(wwi->ossdev->fd, SNDCTL_DSP_GETISPACE, &info) < 0) {
+    if (ioctl(wwi->ossdev.fd, SNDCTL_DSP_GETISPACE, &info) < 0) {
         ERR("ioctl(%s, SNDCTL_DSP_GETISPACE) failed (%s)\n",
-            wwi->ossdev->dev_name, strerror(errno));
-        OSS_CloseDevice(wwi->ossdev);
+            wwi->ossdev.dev_name, strerror(errno));
+        OSS_CloseDevice(&wwi->ossdev);
         wwi->state = WINE_WS_CLOSED;
         close((*ippdscdb)->pipe_fd[0]);
         close((*ippdscdb)->pipe_fd[1]);
@@ -1184,7 +1184,7 @@ static HRESULT WINAPI IDsCaptureDriverImpl_CreateCaptureBuffer(
     /* map the DMA buffer */
     err = DSCDB_MapBuffer(*ippdscdb);
     if (err != DS_OK) {
-        OSS_CloseDevice(wwi->ossdev);
+        OSS_CloseDevice(&wwi->ossdev);
         wwi->state = WINE_WS_CLOSED;
         close((*ippdscdb)->pipe_fd[0]);
         close((*ippdscdb)->pipe_fd[1]);
@@ -1198,7 +1198,7 @@ static HRESULT WINAPI IDsCaptureDriverImpl_CreateCaptureBuffer(
         (*ippdscdb)->buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,(*ippdscdb)->buflen);
 
     if ((*ippdscdb)->buffer == NULL) {
-        OSS_CloseDevice(wwi->ossdev);
+        OSS_CloseDevice(&wwi->ossdev);
         wwi->state = WINE_WS_CLOSED;
         close((*ippdscdb)->pipe_fd[0]);
         close((*ippdscdb)->pipe_fd[1]);
@@ -1284,7 +1284,7 @@ DWORD widDsCreate(UINT wDevID, PIDSCDRIVER* drv)
     TRACE("(%d,%p)\n",wDevID,drv);
 
     /* the HAL isn't much better than the HEL if we can't do mmap() */
-    if (!(WInDev[wDevID].ossdev->in_caps_support & WAVECAPS_DIRECTSOUND)) {
+    if (!(WInDev[wDevID].ossdev.in_caps_support & WAVECAPS_DIRECTSOUND)) {
         ERR("DirectSoundCapture flag not set\n");
         MESSAGE("This sound card's driver does not support direct access\n");
         MESSAGE("The (slower) DirectSound HEL mode will be used instead.\n");
@@ -1304,7 +1304,7 @@ DWORD widDsCreate(UINT wDevID, PIDSCDRIVER* drv)
 
 DWORD widDsDesc(UINT wDevID, PDSDRIVERDESC desc)
 {
-    memcpy(desc, &(WInDev[wDevID].ossdev->ds_desc), sizeof(DSDRIVERDESC));
+    memcpy(desc, &(WInDev[wDevID].ossdev.ds_desc), sizeof(DSDRIVERDESC));
     return MMSYSERR_NOERROR;
 }
 
diff --git a/dlls/wineoss.drv/dsrender.c b/dlls/wineoss.drv/dsrender.c
index 3236456..1491980 100644
--- a/dlls/wineoss.drv/dsrender.c
+++ b/dlls/wineoss.drv/dsrender.c
@@ -475,8 +475,8 @@ static ULONG WINAPI IDsDriverBufferImpl_Release(PIDSDRIVERBUFFER iface)
             TRACE("(%p) buffer count is now %d\n", This, This->drv->nrofsecondaries);
         }
 
-        WOutDev[This->drv->wDevID].ossdev->ds_caps.dwFreeHwMixingAllBuffers++;
-        WOutDev[This->drv->wDevID].ossdev->ds_caps.dwFreeHwMixingStreamingBuffers++;
+        WOutDev[This->drv->wDevID].ossdev.ds_caps.dwFreeHwMixingAllBuffers++;
+        WOutDev[This->drv->wDevID].ossdev.ds_caps.dwFreeHwMixingStreamingBuffers++;
     }
 
     DSDB_UnmapBuffer(This);
@@ -566,14 +566,14 @@ static HRESULT WINAPI IDsDriverBufferImpl_GetPosition(PIDSDRIVERBUFFER iface,
     }
     if (ioctl(This->fd, SNDCTL_DSP_GETOPTR, &info) < 0) {
         ERR("ioctl(%s, SNDCTL_DSP_GETOPTR) failed (%s)\n",
-            WOutDev[This->drv->wDevID].ossdev->dev_name, strerror(errno));
+            WOutDev[This->drv->wDevID].ossdev.dev_name, strerror(errno));
 	return DSERR_GENERIC;
     }
     ptr = info.ptr & ~3; /* align the pointer, just in case */
     if (lpdwPlay) *lpdwPlay = ptr;
     if (lpdwWrite) {
 	/* add some safety margin (not strictly necessary, but...) */
-	if (WOutDev[This->drv->wDevID].ossdev->duplex_out_caps.dwSupport & WAVECAPS_SAMPLEACCURATE)
+	if (WOutDev[This->drv->wDevID].ossdev.duplex_out_caps.dwSupport & WAVECAPS_SAMPLEACCURATE)
 	    *lpdwWrite = ptr + 32;
 	else
 	    *lpdwWrite = ptr + WOutDev[This->drv->wDevID].dwFragmentSize;
@@ -589,26 +589,26 @@ static HRESULT WINAPI IDsDriverBufferImpl_Play(PIDSDRIVERBUFFER iface, DWORD dwR
     IDsDriverBufferImpl *This = (IDsDriverBufferImpl *)iface;
     int enable;
     TRACE("(%p,%x,%x,%x)\n",iface,dwRes1,dwRes2,dwFlags);
-    WOutDev[This->drv->wDevID].ossdev->bOutputEnabled = TRUE;
-    enable = getEnables(WOutDev[This->drv->wDevID].ossdev);
+    WOutDev[This->drv->wDevID].ossdev.bOutputEnabled = TRUE;
+    enable = getEnables(&WOutDev[This->drv->wDevID].ossdev);
     if (ioctl(This->fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
 	if (errno == EINVAL) {
 	    /* Don't give up yet. OSS trigger support is inconsistent. */
-	    if (WOutDev[This->drv->wDevID].ossdev->open_count == 1) {
+	    if (WOutDev[This->drv->wDevID].ossdev.open_count == 1) {
 		/* try the opposite input enable */
-		if (WOutDev[This->drv->wDevID].ossdev->bInputEnabled == FALSE)
-		    WOutDev[This->drv->wDevID].ossdev->bInputEnabled = TRUE;
+		if (WOutDev[This->drv->wDevID].ossdev.bInputEnabled == FALSE)
+		    WOutDev[This->drv->wDevID].ossdev.bInputEnabled = TRUE;
 		else
-		    WOutDev[This->drv->wDevID].ossdev->bInputEnabled = FALSE;
+		    WOutDev[This->drv->wDevID].ossdev.bInputEnabled = FALSE;
 		/* try it again */
-    		enable = getEnables(WOutDev[This->drv->wDevID].ossdev);
+    		enable = getEnables(&WOutDev[This->drv->wDevID].ossdev);
                 if (ioctl(This->fd, SNDCTL_DSP_SETTRIGGER, &enable) >= 0)
 		    return DS_OK;
 	    }
 	}
         ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n",
-            WOutDev[This->drv->wDevID].ossdev->dev_name, strerror(errno));
-	WOutDev[This->drv->wDevID].ossdev->bOutputEnabled = FALSE;
+            WOutDev[This->drv->wDevID].ossdev.dev_name, strerror(errno));
+	WOutDev[This->drv->wDevID].ossdev.bOutputEnabled = FALSE;
 	return DSERR_GENERIC;
     }
     return DS_OK;
@@ -620,16 +620,16 @@ static HRESULT WINAPI IDsDriverBufferImpl_Stop(PIDSDRIVERBUFFER iface)
     int enable;
     TRACE("(%p)\n",iface);
     /* no more playing */
-    WOutDev[This->drv->wDevID].ossdev->bOutputEnabled = FALSE;
-    enable = getEnables(WOutDev[This->drv->wDevID].ossdev);
+    WOutDev[This->drv->wDevID].ossdev.bOutputEnabled = FALSE;
+    enable = getEnables(&WOutDev[This->drv->wDevID].ossdev);
     if (ioctl(This->fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
-	ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n", WOutDev[This->drv->wDevID].ossdev->dev_name, strerror(errno));
+	ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n", WOutDev[This->drv->wDevID].ossdev.dev_name, strerror(errno));
 	return DSERR_GENERIC;
     }
 #if 0
     /* the play position must be reset to the beginning of the buffer */
     if (ioctl(This->fd, SNDCTL_DSP_RESET, 0) < 0) {
-	ERR("ioctl(%s, SNDCTL_DSP_RESET) failed (%s)\n", WOutDev[This->drv->wDevID].ossdev->dev_name, strerror(errno));
+	ERR("ioctl(%s, SNDCTL_DSP_RESET) failed (%s)\n", WOutDev[This->drv->wDevID].ossdev.dev_name, strerror(errno));
 	return DSERR_GENERIC;
     }
 #endif
@@ -638,7 +638,7 @@ static HRESULT WINAPI IDsDriverBufferImpl_Stop(PIDSDRIVERBUFFER iface)
      * that it should completely recreate this HW buffer...
      * this unexpected error code should do the trick... */
     /* FIXME: ...unless we are doing full duplex, then it's not nice to close the device */
-    if (WOutDev[This->drv->wDevID].ossdev->open_count == 1)
+    if (WOutDev[This->drv->wDevID].ossdev.open_count == 1)
 	return DSERR_BUFFERLOST;
 
     return DS_OK;
@@ -710,7 +710,7 @@ static HRESULT WINAPI IDsDriverImpl_GetDriverDesc(PIDSDRIVER iface,
     TRACE("(%p,%p)\n",iface,pDesc);
 
     /* copy version from driver */
-    memcpy(pDesc, &(WOutDev[This->wDevID].ossdev->ds_desc), sizeof(DSDRIVERDESC));
+    memcpy(pDesc, &(WOutDev[This->wDevID].ossdev.ds_desc), sizeof(DSDRIVERDESC));
 
     pDesc->dwFlags |= DSDDESC_DOMMSYSTEMOPEN | DSDDESC_DOMMSYSTEMSETFORMAT |
         DSDDESC_USESYSTEMMEMORY | DSDDESC_DONTNEEDPRIMARYLOCK |
@@ -736,11 +736,11 @@ static HRESULT WINAPI IDsDriverImpl_Open(PIDSDRIVER iface)
     TRACE("(%p)\n",iface);
 
     /* make sure the card doesn't start playing before we want it to */
-    WOutDev[This->wDevID].ossdev->bOutputEnabled = FALSE;
-    WOutDev[This->wDevID].ossdev->bInputEnabled = FALSE;
-    enable = getEnables(WOutDev[This->wDevID].ossdev);
-    if (ioctl(WOutDev[This->wDevID].ossdev->fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
-	ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n",WOutDev[This->wDevID].ossdev->dev_name, strerror(errno));
+    WOutDev[This->wDevID].ossdev.bOutputEnabled = FALSE;
+    WOutDev[This->wDevID].ossdev.bInputEnabled = FALSE;
+    enable = getEnables(&WOutDev[This->wDevID].ossdev);
+    if (ioctl(WOutDev[This->wDevID].ossdev.fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
+	ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n",WOutDev[This->wDevID].ossdev.dev_name, strerror(errno));
 	return DSERR_GENERIC;
     }
     return DS_OK;
@@ -761,7 +761,7 @@ static HRESULT WINAPI IDsDriverImpl_GetCaps(PIDSDRIVER iface, PDSDRIVERCAPS pCap
 {
     IDsDriverImpl *This = (IDsDriverImpl *)iface;
     TRACE("(%p,%p)\n",iface,pCaps);
-    memcpy(pCaps, &(WOutDev[This->wDevID].ossdev->ds_caps), sizeof(DSDRIVERCAPS));
+    memcpy(pCaps, &(WOutDev[This->wDevID].ossdev.ds_caps), sizeof(DSDRIVERCAPS));
     return DS_OK;
 }
 
@@ -792,13 +792,13 @@ static HRESULT WINAPI DSD_CreatePrimaryBuffer(PIDSDRIVER iface,
     (*ippdsdb)->ref	= 1;
     (*ippdsdb)->drv	= This;
     copy_format(pwfx, &(*ippdsdb)->wfex);
-    (*ippdsdb)->fd      = WOutDev[This->wDevID].ossdev->fd;
+    (*ippdsdb)->fd      = WOutDev[This->wDevID].ossdev.fd;
     (*ippdsdb)->dwFlags = dwFlags;
 
     /* check how big the DMA buffer is now */
     if (ioctl((*ippdsdb)->fd, SNDCTL_DSP_GETOSPACE, &info) < 0) {
         ERR("ioctl(%s, SNDCTL_DSP_GETOSPACE) failed (%s)\n",
-            WOutDev[This->wDevID].ossdev->dev_name, strerror(errno));
+            WOutDev[This->wDevID].ossdev.dev_name, strerror(errno));
 	HeapFree(GetProcessHeap(),0,*ippdsdb);
 	*ippdsdb = NULL;
 	return DSERR_GENERIC;
@@ -818,12 +818,12 @@ static HRESULT WINAPI DSD_CreatePrimaryBuffer(PIDSDRIVER iface,
     *ppbBuffer          = (*ippdsdb)->mapping;
 
     /* some drivers need some extra nudging after mapping */
-    WOutDev[This->wDevID].ossdev->bInputEnabled = FALSE;
-    WOutDev[This->wDevID].ossdev->bOutputEnabled = FALSE;
-    enable = getEnables(WOutDev[This->wDevID].ossdev);
+    WOutDev[This->wDevID].ossdev.bInputEnabled = FALSE;
+    WOutDev[This->wDevID].ossdev.bOutputEnabled = FALSE;
+    enable = getEnables(&WOutDev[This->wDevID].ossdev);
     if (ioctl((*ippdsdb)->fd, SNDCTL_DSP_SETTRIGGER, &enable) < 0) {
         ERR("ioctl(%s, SNDCTL_DSP_SETTRIGGER) failed (%s)\n",
-            WOutDev[This->wDevID].ossdev->dev_name, strerror(errno));
+            WOutDev[This->wDevID].ossdev.dev_name, strerror(errno));
 	return DSERR_GENERIC;
     }
 
@@ -939,7 +939,7 @@ DWORD wodDsCreate(UINT wDevID, PIDSDRIVER* drv)
     TRACE("(%d,%p)\n",wDevID,drv);
 
     /* the HAL isn't much better than the HEL if we can't do mmap() */
-    if (!(WOutDev[wDevID].ossdev->duplex_out_caps.dwSupport & WAVECAPS_DIRECTSOUND)) {
+    if (!(WOutDev[wDevID].ossdev.duplex_out_caps.dwSupport & WAVECAPS_DIRECTSOUND)) {
         WARN("Warn DirectSound flag not set, falling back to HEL layer\n");
         return MMSYSERR_NOTSUPPORTED;
     }
@@ -960,7 +960,7 @@ DWORD wodDsCreate(UINT wDevID, PIDSDRIVER* drv)
 DWORD wodDsDesc(UINT wDevID, PDSDRIVERDESC desc)
 {
     TRACE("(%d,%p)\n",wDevID,desc);
-    memcpy(desc, &(WOutDev[wDevID].ossdev->ds_desc), sizeof(DSDRIVERDESC));
+    memcpy(desc, &(WOutDev[wDevID].ossdev.ds_desc), sizeof(DSDRIVERDESC));
     return MMSYSERR_NOERROR;
 }
 
-- 
1.5.2.5


--------------010808010402060700010206--



More information about the wine-patches mailing list