wineoss: avoid SNDCTL_DSP_GETTRIGGER

Tijl Coosemans tijl at ulyssis.org
Tue Aug 7 17:19:14 CDT 2007


wineoss: avoid SNDCTL_DSP_GETTRIGGER

The SNDCTL_DSP_GETTRIGGER ioctl on FreeBSD seems to be incompatible
with Linux. It returns whether input and output have triggered and not
whether they will trigger. Consequently, when the sound device has only
just been opened this call returns zero, which Wine interprets as input
and output disabled, so when later SNDCTL_DSP_SETTRIGGER is called
sound is disabled.

Since you can tell from RDONLY/WRONLY/RDWR if input and output are
enabled, there's no need to call SNDCTL_DSP_GETTRIGGER. The existing
already does this when there's no trigger support, so this patch simply
rearranges the code to avoid this call.

---
 dlls/wineoss.drv/audio.c |   26 ++++++++------------------
 1 files changed, 8 insertions(+), 18 deletions(-)
-------------- next part --------------
diff --git a/dlls/wineoss.drv/audio.c b/dlls/wineoss.drv/audio.c
index e9c93f7..5c233da 100644
--- a/dlls/wineoss.drv/audio.c
+++ b/dlls/wineoss.drv/audio.c
@@ -389,18 +389,16 @@ static DWORD      OSS_RawOpenDevice(OSS_DEVICE* ossdev, int strict_format)
     }
     ossdev->fd = fd;
 
+    ossdev->bOutputEnabled = TRUE;	/* OSS enables by default */
+    ossdev->bInputEnabled  = TRUE;	/* OSS enables by default */
+    if (ossdev->open_access == O_RDONLY)
+        ossdev->bOutputEnabled = FALSE;
+    if (ossdev->open_access == O_WRONLY)
+        ossdev->bInputEnabled = FALSE;
+
     if (ossdev->bTriggerSupport) {
 	int trigger;
-	rc = ioctl(fd, SNDCTL_DSP_GETTRIGGER, &trigger);
-	if (rc != 0) {
-	    ERR("ioctl(%s, SNDCTL_DSP_GETTRIGGER) failed (%s)\n",
-		ossdev->dev_name, strerror(errno));
-	    goto error;
-	}
-	
-    	ossdev->bOutputEnabled = ((trigger & PCM_ENABLE_OUTPUT) == PCM_ENABLE_OUTPUT);
-    	ossdev->bInputEnabled  = ((trigger & PCM_ENABLE_INPUT) == PCM_ENABLE_INPUT);
-
+        trigger = getEnables(ossdev);
         /* If we do not have full duplex, but they opened RDWR 
         ** (as you have to in order for an mmap to succeed)
         ** then we start out with input off
@@ -411,16 +409,8 @@ static DWORD      OSS_RawOpenDevice(OSS_DEVICE* ossdev, int strict_format)
             trigger &= ~PCM_ENABLE_INPUT;
 	    ioctl(fd, SNDCTL_DSP_SETTRIGGER, &trigger);
         }
-    } else {
-    	ossdev->bOutputEnabled = TRUE;	/* OSS enables by default */
-    	ossdev->bInputEnabled  = TRUE;	/* OSS enables by default */
     }
 
-    if (ossdev->open_access == O_RDONLY)
-        ossdev->bOutputEnabled = FALSE;
-    if (ossdev->open_access == O_WRONLY)
-        ossdev->bInputEnabled = FALSE;
-
     return MMSYSERR_NOERROR;
 
 error:


More information about the wine-patches mailing list