Nick Bowler : dsound: Restore old format on SetFormat failure.

Alexandre Julliard julliard at winehq.org
Mon Oct 4 11:03:59 CDT 2010


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

Author: Nick Bowler <nbowler at draconx.ca>
Date:   Sun Oct  3 11:52:00 2010 -0400

dsound: Restore old format on SetFormat failure.

---

 dlls/dsound/primary.c |   20 +++++++++++++++-----
 1 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/dlls/dsound/primary.c b/dlls/dsound/primary.c
index 8a054f8..aa8450f 100644
--- a/dlls/dsound/primary.c
+++ b/dlls/dsound/primary.c
@@ -441,10 +441,17 @@ HRESULT DSOUND_PrimaryGetPosition(DirectSoundDevice *device, LPDWORD playpos, LP
 	return DS_OK;
 }
 
+static DWORD DSOUND_GetFormatSize(LPCWAVEFORMATEX wfex)
+{
+	if (wfex->wFormatTag == WAVE_FORMAT_PCM)
+		return sizeof(WAVEFORMATEX);
+	else
+		return sizeof(WAVEFORMATEX) + wfex->cbSize;
+}
+
 LPWAVEFORMATEX DSOUND_CopyFormat(LPCWAVEFORMATEX wfex)
 {
-	DWORD size = wfex->wFormatTag == WAVE_FORMAT_PCM ?
-		sizeof(WAVEFORMATEX) : sizeof(WAVEFORMATEX) + wfex->cbSize;
+	DWORD size = DSOUND_GetFormatSize(wfex);
 	LPWAVEFORMATEX pwfx = HeapAlloc(GetProcessHeap(),0,size);
 	if (pwfx == NULL) {
 		WARN("out of memory\n");
@@ -501,11 +508,10 @@ static HRESULT DSOUND_PrimarySetFormat(DirectSoundDevice *device, LPCWAVEFORMATE
 	device->pwfx = DSOUND_CopyFormat(wfex);
 	if (device->pwfx == NULL) {
 		device->pwfx = oldpwfx;
+		oldpwfx = NULL;
 		err = DSERR_OUTOFMEMORY;
 		goto done;
 	}
-	/* TODO: on failure below (bad format?), reinstall oldpwfx */
-	HeapFree(GetProcessHeap(), 0, oldpwfx);
 
 	if (!(device->drvdesc.dwFlags & DSDDESC_DOMMSYSTEMSETFORMAT) && device->hwbuf) {
 		err = IDsDriverBuffer_SetFormat(device->hwbuf, device->pwfx);
@@ -520,9 +526,12 @@ static HRESULT DSOUND_PrimarySetFormat(DirectSoundDevice *device, LPCWAVEFORMATE
 		}
 
 		if (err != DSERR_BUFFERLOST && FAILED(err)) {
+			DWORD size = DSOUND_GetFormatSize(oldpwfx);
 			WARN("IDsDriverBuffer_SetFormat failed\n");
-			if (!forced)
+			if (!forced) {
+				CopyMemory(device->pwfx, oldpwfx, size);
 				err = DS_OK;
+			}
 			goto done;
 		}
 
@@ -599,6 +608,7 @@ done:
 	RtlReleaseResource(&(device->buffer_list_lock));
 	/* **** */
 
+	HeapFree(GetProcessHeap(), 0, oldpwfx);
 	return err;
 }
 




More information about the wine-cvs mailing list