[PATCH 6/8] wineoss: Don't cache the oss_audioinfo in the client.

Huw Davies huw at codeweavers.com
Wed Apr 6 01:55:56 CDT 2022


The retrieval on endpoint creation is left in for debugging
purposes.

Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 dlls/wineoss.drv/mmdevdrv.c | 53 +++++++++++++++++++++----------------
 1 file changed, 30 insertions(+), 23 deletions(-)

diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c
index 242d2e0b359..990429156bc 100644
--- a/dlls/wineoss.drv/mmdevdrv.c
+++ b/dlls/wineoss.drv/mmdevdrv.c
@@ -113,8 +113,6 @@ struct ACImpl {
     UINT32 channel_count;
     struct oss_stream *stream;
 
-    oss_audioinfo ai;
-
     BOOL initted;
     HANDLE timer;
 
@@ -433,6 +431,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev,
 {
     ACImpl *This;
     struct oss_stream *stream;
+    oss_audioinfo ai;
     const OSSDevice *oss_dev;
     HRESULT hr;
     int len;
@@ -475,8 +474,8 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev,
 
     This->dataflow = oss_dev->flow;
 
-    This->ai.dev = -1;
-    if(ioctl(stream->fd, SNDCTL_ENGINEINFO, &This->ai) < 0){
+    ai.dev = -1;
+    if(ioctl(stream->fd, SNDCTL_ENGINEINFO, &ai) < 0){
         WARN("Unable to get audio info for device %s: %d (%s)\n", oss_dev->devnode,
                 errno, strerror(errno));
         close(stream->fd);
@@ -488,17 +487,17 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev,
     strcpy(This->devnode, oss_dev->devnode);
 
     TRACE("OSS audioinfo:\n");
-    TRACE("devnode: %s\n", This->ai.devnode);
-    TRACE("name: %s\n", This->ai.name);
-    TRACE("busy: %x\n", This->ai.busy);
-    TRACE("caps: %x\n", This->ai.caps);
-    TRACE("iformats: %x\n", This->ai.iformats);
-    TRACE("oformats: %x\n", This->ai.oformats);
-    TRACE("enabled: %d\n", This->ai.enabled);
-    TRACE("min_rate: %d\n", This->ai.min_rate);
-    TRACE("max_rate: %d\n", This->ai.max_rate);
-    TRACE("min_channels: %d\n", This->ai.min_channels);
-    TRACE("max_channels: %d\n", This->ai.max_channels);
+    TRACE("devnode: %s\n", ai.devnode);
+    TRACE("name: %s\n", ai.name);
+    TRACE("busy: %x\n", ai.busy);
+    TRACE("caps: %x\n", ai.caps);
+    TRACE("iformats: %x\n", ai.iformats);
+    TRACE("oformats: %x\n", ai.oformats);
+    TRACE("enabled: %d\n", ai.enabled);
+    TRACE("min_rate: %d\n", ai.min_rate);
+    TRACE("max_rate: %d\n", ai.max_rate);
+    TRACE("min_channels: %d\n", ai.min_channels);
+    TRACE("max_channels: %d\n", ai.max_channels);
 
     This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl;
     This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl;
@@ -1129,6 +1128,7 @@ static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface,
 {
     ACImpl *This = impl_from_IAudioClient3(iface);
     WAVEFORMATEXTENSIBLE *fmt;
+    oss_audioinfo ai;
     int formats;
 
     TRACE("(%p)->(%p)\n", This, pwfx);
@@ -1137,10 +1137,17 @@ static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface,
         return E_POINTER;
     *pwfx = NULL;
 
+    ai.dev = -1;
+    if(ioctl(This->stream->fd, SNDCTL_ENGINEINFO, &ai) < 0){
+        WARN("Unable to get audio info for device %s: %d (%s)\n", This->devnode,
+                errno, strerror(errno));
+        return E_FAIL;
+    }
+
     if(This->dataflow == eRender)
-        formats = This->ai.oformats;
+        formats = ai.oformats;
     else if(This->dataflow == eCapture)
-        formats = This->ai.iformats;
+        formats = ai.iformats;
     else
         return E_UNEXPECTED;
 
@@ -1174,7 +1181,7 @@ static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface,
 
     /* some OSS drivers are buggy, so set reasonable defaults if
      * the reported values seem wacky */
-    fmt->Format.nChannels = max(This->ai.max_channels, This->ai.min_channels);
+    fmt->Format.nChannels = max(ai.max_channels, ai.min_channels);
     if(fmt->Format.nChannels == 0 || fmt->Format.nChannels > 8)
         fmt->Format.nChannels = 2;
 
@@ -1185,7 +1192,7 @@ static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface,
      * channels (e.g. 2.1). */
     if(fmt->Format.nChannels > 1 && (fmt->Format.nChannels & 0x1))
     {
-        if(fmt->Format.nChannels < This->ai.max_channels)
+        if(fmt->Format.nChannels < ai.max_channels)
             fmt->Format.nChannels += 1;
         else
             /* We could "fake" more channels and downmix the emulated channels,
@@ -1194,12 +1201,12 @@ static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface,
             WARN("Some Windows applications behave badly with an odd number of channels (%u)!\n", fmt->Format.nChannels);
     }
 
-    if(This->ai.max_rate == 0)
+    if(ai.max_rate == 0)
         fmt->Format.nSamplesPerSec = 44100;
     else
-        fmt->Format.nSamplesPerSec = min(This->ai.max_rate, 44100);
-    if(fmt->Format.nSamplesPerSec < This->ai.min_rate)
-        fmt->Format.nSamplesPerSec = This->ai.min_rate;
+        fmt->Format.nSamplesPerSec = min(ai.max_rate, 44100);
+    if(fmt->Format.nSamplesPerSec < ai.min_rate)
+        fmt->Format.nSamplesPerSec = ai.min_rate;
 
     fmt->dwChannelMask = get_channel_mask(fmt->Format.nChannels);
 
-- 
2.25.1




More information about the wine-devel mailing list