Andrew Eikum : dsound: Don' t make the capture buffer object address public until it is prepared.

Alexandre Julliard julliard at winehq.org
Tue Oct 18 12:56:26 CDT 2011


Module: wine
Branch: master
Commit: 6a7c2f66e0569d2419eb9619e78716a9a5f94966
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6a7c2f66e0569d2419eb9619e78716a9a5f94966

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Mon Oct 17 14:52:23 2011 -0500

dsound: Don't make the capture buffer object address public until it is prepared.

---

 dlls/dsound/capture.c |   23 ++++++++---------------
 1 files changed, 8 insertions(+), 15 deletions(-)

diff --git a/dlls/dsound/capture.c b/dlls/dsound/capture.c
index 92dc24f..9e289f3 100644
--- a/dlls/dsound/capture.c
+++ b/dlls/dsound/capture.c
@@ -680,6 +680,7 @@ static HRESULT IDirectSoundCaptureBufferImpl_Create(
     LPCDSCBUFFERDESC lpcDSCBufferDesc)
 {
     LPWAVEFORMATEX  wfex;
+    IDirectSoundCaptureBufferImpl *This;
     TRACE( "(%p,%p,%p)\n", device, ppobj, lpcDSCBufferDesc);
 
     if (ppobj == NULL) {
@@ -687,15 +688,15 @@ static HRESULT IDirectSoundCaptureBufferImpl_Create(
 	return DSERR_INVALIDPARAM;
     }
 
+    *ppobj = NULL;
+
     if (!device) {
 	WARN("not initialized\n");
-        *ppobj = NULL;
 	return DSERR_UNINITIALIZED;
     }
 
     if (lpcDSCBufferDesc == NULL) {
 	WARN("invalid parameter: lpcDSCBufferDesc == NULL\n");
-        *ppobj = NULL;
 	return DSERR_INVALIDPARAM;
     }
 
@@ -704,7 +705,6 @@ static HRESULT IDirectSoundCaptureBufferImpl_Create(
         (lpcDSCBufferDesc->dwBufferBytes == 0) ||
         (lpcDSCBufferDesc->lpwfxFormat == NULL) ) { /* FIXME: DSERR_BADFORMAT ? */
 	WARN("invalid lpcDSCBufferDesc\n");
-	*ppobj = NULL;
 	return DSERR_INVALIDPARAM;
     }
 
@@ -717,23 +717,19 @@ static HRESULT IDirectSoundCaptureBufferImpl_Create(
         wfex->wBitsPerSample, wfex->cbSize);
 
     device->pwfx = DSOUND_CopyFormat(wfex);
-    if ( device->pwfx == NULL ) {
-	*ppobj = NULL;
+    if ( device->pwfx == NULL )
 	return DSERR_OUTOFMEMORY;
-    }
 
-    *ppobj = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
+    This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
         sizeof(IDirectSoundCaptureBufferImpl));
 
-    if ( *ppobj == NULL ) {
+    if ( This == NULL ) {
 	WARN("out of memory\n");
-	*ppobj = NULL;
 	return DSERR_OUTOFMEMORY;
     } else {
         HRESULT err = DS_OK;
         LPBYTE newbuf;
         DWORD buflen;
-        IDirectSoundCaptureBufferImpl *This = *ppobj;
 
         This->ref = 1;
         This->device = device;
@@ -749,7 +745,6 @@ static HRESULT IDirectSoundCaptureBufferImpl_Create(
             WARN("no memory\n");
             This->device->capture_buffer = 0;
             HeapFree( GetProcessHeap(), 0, This );
-            *ppobj = NULL;
             return DSERR_OUTOFMEMORY;
         }
 
@@ -762,7 +757,6 @@ static HRESULT IDirectSoundCaptureBufferImpl_Create(
             HeapFree(GetProcessHeap(), 0, This->pdscbd);
             This->device->capture_buffer = 0;
             HeapFree( GetProcessHeap(), 0, This );
-            *ppobj = NULL;
             return err;
         }
 
@@ -776,7 +770,6 @@ static HRESULT IDirectSoundCaptureBufferImpl_Create(
             HeapFree(GetProcessHeap(), 0, This->pdscbd);
             This->device->capture_buffer = 0;
             HeapFree( GetProcessHeap(), 0, This );
-            *ppobj = NULL;
             return err;
         }
 
@@ -789,7 +782,6 @@ static HRESULT IDirectSoundCaptureBufferImpl_Create(
             HeapFree(GetProcessHeap(), 0, This->pdscbd);
             This->device->capture_buffer = 0;
             HeapFree( GetProcessHeap(), 0, This );
-            *ppobj = NULL;
             return err;
         }
 
@@ -807,13 +799,14 @@ static HRESULT IDirectSoundCaptureBufferImpl_Create(
             HeapFree(GetProcessHeap(), 0, This->pdscbd);
             This->device->capture_buffer = 0;
             HeapFree( GetProcessHeap(), 0, This );
-            *ppobj = NULL;
             return DSERR_OUTOFMEMORY;
         }
         device->buffer = newbuf;
         device->buflen = buflen;
     }
 
+    *ppobj = This;
+
     TRACE("returning DS_OK\n");
     return DS_OK;
 }




More information about the wine-cvs mailing list