Michael Stefaniuc : dsound: Simplify error handling when creating a sound buffer.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Dec 22 14:06:51 CST 2015


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

Author: Michael Stefaniuc <mstefani at redhat.de>
Date:   Tue Dec 22 10:49:10 2015 +0100

dsound: Simplify error handling when creating a sound buffer.

Signed-off-by: Michael Stefaniuc <mstefani at redhat.de>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dsound/buffer.c | 46 ++++++++++++++++------------------------------
 1 file changed, 16 insertions(+), 30 deletions(-)

diff --git a/dlls/dsound/buffer.c b/dlls/dsound/buffer.c
index 5aa2834..d7717fd 100644
--- a/dlls/dsound/buffer.c
+++ b/dlls/dsound/buffer.c
@@ -992,29 +992,28 @@ HRESULT IDirectSoundBufferImpl_Create(
 	LPWAVEFORMATEX wfex = dsbd->lpwfxFormat;
 	HRESULT err = DS_OK;
 	DWORD capf = 0;
+
 	TRACE("(%p,%p,%p)\n",device,pdsb,dsbd);
 
+        *pdsb = NULL;
+
 	if (dsbd->dwBufferBytes < DSBSIZE_MIN || dsbd->dwBufferBytes > DSBSIZE_MAX) {
 		WARN("invalid parameter: dsbd->dwBufferBytes = %d\n", dsbd->dwBufferBytes);
-		*pdsb = NULL;
 		return DSERR_INVALIDPARAM; /* FIXME: which error? */
 	}
 
 	dsb = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*dsb));
 
-	if (dsb == 0) {
-		WARN("out of memory\n");
-		*pdsb = NULL;
+        if (!dsb)
 		return DSERR_OUTOFMEMORY;
-	}
 
 	TRACE("Created buffer at %p\n", dsb);
 
-	dsb->ref = 0;
+        dsb->ref = 1;
         dsb->refn = 0;
         dsb->ref3D = 0;
         dsb->refiks = 0;
-	dsb->numIfaces = 0;
+        dsb->numIfaces = 1;
 	dsb->device = device;
 	dsb->IDirectSoundBuffer8_iface.lpVtbl = &dsbvt;
         dsb->IDirectSoundNotify_iface.lpVtbl = &dsnvt;
@@ -1025,9 +1024,8 @@ HRESULT IDirectSoundBufferImpl_Create(
 	CopyMemory(&dsb->dsbd, dsbd, dsbd->dwSize);
 
 	dsb->pwfx = DSOUND_CopyFormat(wfex);
-	if (dsb->pwfx == NULL) {
-		HeapFree(GetProcessHeap(),0,dsb);
-		*pdsb = NULL;
+        if (!dsb->pwfx) {
+                IDirectSoundBuffer8_Release(&dsb->IDirectSoundBuffer8_iface);
 		return DSERR_OUTOFMEMORY;
 	}
 
@@ -1052,22 +1050,16 @@ HRESULT IDirectSoundBufferImpl_Create(
 
 	/* Allocate an empty buffer */
 	dsb->buffer = HeapAlloc(GetProcessHeap(),0,sizeof(*(dsb->buffer)));
-	if (dsb->buffer == NULL) {
-		WARN("out of memory\n");
-		HeapFree(GetProcessHeap(),0,dsb->pwfx);
-		HeapFree(GetProcessHeap(),0,dsb);
-		*pdsb = NULL;
+        if (!dsb->buffer) {
+                IDirectSoundBuffer8_Release(&dsb->IDirectSoundBuffer8_iface);
 		return DSERR_OUTOFMEMORY;
 	}
 
 	/* Allocate system memory for buffer */
 	dsb->buffer->memory = HeapAlloc(GetProcessHeap(),0,dsb->buflen);
-	if (dsb->buffer->memory == NULL) {
+        if (!dsb->buffer->memory) {
 		WARN("out of memory\n");
-		HeapFree(GetProcessHeap(),0,dsb->pwfx);
-		HeapFree(GetProcessHeap(),0,dsb->buffer);
-		HeapFree(GetProcessHeap(),0,dsb);
-		*pdsb = NULL;
+                IDirectSoundBuffer8_Release(&dsb->IDirectSoundBuffer8_iface);
 		return DSERR_OUTOFMEMORY;
 	}
 
@@ -1118,18 +1110,12 @@ HRESULT IDirectSoundBufferImpl_Create(
 	/* register buffer if not primary */
 	if (!(dsbd->dwFlags & DSBCAPS_PRIMARYBUFFER)) {
 		err = DirectSoundDevice_AddBuffer(device, dsb);
-		if (err != DS_OK) {
-			HeapFree(GetProcessHeap(),0,dsb->buffer->memory);
-			HeapFree(GetProcessHeap(),0,dsb->buffer);
-			RtlDeleteResource(&dsb->lock);
-			HeapFree(GetProcessHeap(),0,dsb->pwfx);
-			HeapFree(GetProcessHeap(),0,dsb);
-			dsb = NULL;
-		}
+                if (err == DS_OK)
+                        *pdsb = dsb;
+                else
+                        IDirectSoundBuffer8_Release(&dsb->IDirectSoundBuffer8_iface);
 	}
 
-        IDirectSoundBuffer8_AddRef(&dsb->IDirectSoundBuffer8_iface);
-	*pdsb = dsb;
 	return err;
 }
 




More information about the wine-cvs mailing list