[PATCH 3/4] mmdevapi: Set data pointer to NULL on IAudioCaptureClient::GetBuffer failure

Andrew Eikum aeikum at codeweavers.com
Thu Oct 24 11:28:35 CDT 2019


Matches Windows 10 behavior.

Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
---
 dlls/mmdevapi/tests/capture.c     | 9 ++++++---
 dlls/winealsa.drv/mmdevdrv.c      | 7 ++++++-
 dlls/wineandroid.drv/mmdevdrv.c   | 7 ++++++-
 dlls/winecoreaudio.drv/mmdevdrv.c | 7 ++++++-
 dlls/wineoss.drv/mmdevdrv.c       | 7 ++++++-
 dlls/winepulse.drv/mmdevdrv.c     | 7 ++++++-
 6 files changed, 36 insertions(+), 8 deletions(-)

diff --git a/dlls/mmdevapi/tests/capture.c b/dlls/mmdevapi/tests/capture.c
index 253ba3c762b..5cf61ea8245 100644
--- a/dlls/mmdevapi/tests/capture.c
+++ b/dlls/mmdevapi/tests/capture.c
@@ -122,7 +122,8 @@ static void test_capture(IAudioClient *ac, HANDLE handle, WAVEFORMATEX *wfx)
 
     hr = IAudioCaptureClient_GetBuffer(acc, &data, &frames, NULL, NULL, NULL);
     ok(hr == E_POINTER, "IAudioCaptureClient_GetBuffer(&ata, &frames, NULL) returns %08x\n", hr);
-    ok((DWORD_PTR)data == 0xdeadf00d, "data is reset to %p\n", data);
+    ok(broken((DWORD_PTR)data == 0xdeadf00d) || /* <= win8 */
+            data == NULL, "data is reset to %p\n", data);
     ok(frames == 0xdeadbeef, "frames is reset to %08x\n", frames);
     ok(flags == 0xabadcafe, "flags is reset to %08x\n", flags);
 
@@ -147,7 +148,8 @@ static void test_capture(IAudioClient *ac, HANDLE handle, WAVEFORMATEX *wfx)
         sum = pos;
     }else if (hr == AUDCLNT_S_BUFFER_EMPTY){
         ok(!frames, "Amount of frames locked with empty buffer is %u!\n", frames);
-        ok(data == (void*)0xdeadf00d, "No data changed to %p\n", data);
+        ok(broken(data == (void*)0xdeadf00d) || /* <= win8 */
+                data == NULL, "No data changed to %p\n", data);
     }
 
     trace("Wait'ed position %d pad %u flags %x, amount of frames locked: %u\n",
@@ -228,7 +230,8 @@ static void test_capture(IAudioClient *ac, HANDLE handle, WAVEFORMATEX *wfx)
         hr = IAudioCaptureClient_GetBuffer(acc, &data2, &frames2, &flags, &pos, &qpc);
         ok(hr == AUDCLNT_E_OUT_OF_ORDER, "Out of order IAudioCaptureClient_GetBuffer returns %08x\n", hr);
         ok(frames2 == 0xabadcafe, "Out of order frames changed to %x\n", frames2);
-        ok(data2 == (void*)0xdeadf00d, "Out of order data changed to %p\n", data2);
+        ok(broken(data2 == (void*)0xdeadf00d) /* <= win8 */ ||
+                data2 == NULL, "Out of order data changed to %p\n", data2);
         ok(flags == 0xabadcafe, "Out of order flags changed to %x\n", flags);
         ok(pos == 0xdeadbeef, "Out of order position changed to %x\n", (UINT)pos);
         ok(qpc == 0xdeadbeef, "Out of order timer changed to %x\n", (UINT)qpc);
diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c
index 4f1270b33c8..5bc71da77ae 100644
--- a/dlls/winealsa.drv/mmdevdrv.c
+++ b/dlls/winealsa.drv/mmdevdrv.c
@@ -2883,7 +2883,12 @@ static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface,
     TRACE("(%p)->(%p, %p, %p, %p, %p)\n", This, data, frames, flags,
             devpos, qpcpos);
 
-    if(!data || !frames || !flags)
+    if(!data)
+        return E_POINTER;
+
+    *data = NULL;
+
+    if(!frames || !flags)
         return E_POINTER;
 
     EnterCriticalSection(&This->lock);
diff --git a/dlls/wineandroid.drv/mmdevdrv.c b/dlls/wineandroid.drv/mmdevdrv.c
index 1dafe02f4cd..e10b3debf1c 100644
--- a/dlls/wineandroid.drv/mmdevdrv.c
+++ b/dlls/wineandroid.drv/mmdevdrv.c
@@ -1845,7 +1845,12 @@ static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface,
     TRACE("(%p)->(%p, %p, %p, %p, %p)\n", This, data, frames, flags,
             devpos, qpcpos);
 
-    if(!data || !frames || !flags)
+    if(!data)
+        return E_POINTER;
+
+    *data = NULL;
+
+    if(!frames || !flags)
         return E_POINTER;
 
     EnterCriticalSection(&This->lock);
diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c
index be2b5e7e1e9..d595f43007b 100644
--- a/dlls/winecoreaudio.drv/mmdevdrv.c
+++ b/dlls/winecoreaudio.drv/mmdevdrv.c
@@ -2442,7 +2442,12 @@ static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface,
     TRACE("(%p)->(%p, %p, %p, %p, %p)\n", This, data, frames, flags,
             devpos, qpcpos);
 
-    if(!data || !frames || !flags)
+    if(!data)
+        return E_POINTER;
+
+    *data = NULL;
+
+    if(!frames || !flags)
         return E_POINTER;
 
     OSSpinLockLock(&This->lock);
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c
index dca40ecd771..c6b6e8effe5 100644
--- a/dlls/wineoss.drv/mmdevdrv.c
+++ b/dlls/wineoss.drv/mmdevdrv.c
@@ -2007,7 +2007,12 @@ static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface,
     TRACE("(%p)->(%p, %p, %p, %p, %p)\n", This, data, frames, flags,
             devpos, qpcpos);
 
-    if(!data || !frames || !flags)
+    if(!data)
+        return E_POINTER;
+
+    *data = NULL;
+
+    if(!frames || !flags)
         return E_POINTER;
 
     EnterCriticalSection(&This->lock);
diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c
index 1c647c73d62..61f0e03c9f1 100644
--- a/dlls/winepulse.drv/mmdevdrv.c
+++ b/dlls/winepulse.drv/mmdevdrv.c
@@ -2511,7 +2511,12 @@ static HRESULT WINAPI AudioCaptureClient_GetBuffer(IAudioCaptureClient *iface,
     TRACE("(%p)->(%p, %p, %p, %p, %p)\n", This, data, frames, flags,
             devpos, qpcpos);
 
-    if (!data || !frames || !flags)
+    if (!data)
+       return E_POINTER;
+
+    *data = NULL;
+
+    if (!frames || !flags)
         return E_POINTER;
 
     pthread_mutex_lock(&pulse_lock);
-- 
2.23.0





More information about the wine-devel mailing list