Andrew Eikum : dsound: Allow inactive devices to change the primary format.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu May 19 10:32:07 CDT 2016
Module: wine
Branch: master
Commit: 4fbe6f3e7601f7b39f7f672ffe43553eee92ab1b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=4fbe6f3e7601f7b39f7f672ffe43553eee92ab1b
Author: Andrew Eikum <aeikum at codeweavers.com>
Date: Thu May 19 09:11:08 2016 -0500
dsound: Allow inactive devices to change the primary format.
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/dsound/primary.c | 45 ++++++++++++++++++++-------------------------
1 file changed, 20 insertions(+), 25 deletions(-)
diff --git a/dlls/dsound/primary.c b/dlls/dsound/primary.c
index 0dc16f0..b14bff7 100644
--- a/dlls/dsound/primary.c
+++ b/dlls/dsound/primary.c
@@ -479,35 +479,30 @@ HRESULT primarybuffer_SetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX passe
RtlAcquireResourceExclusive(&(device->buffer_list_lock), TRUE);
EnterCriticalSection(&(device->mixlock));
- if (device->priolevel == DSSCL_WRITEPRIMARY) {
- old_fmt = device->primary_pwfx;
- device->primary_pwfx = DSOUND_CopyFormat(passed_fmt);
- fmtex = (WAVEFORMATEXTENSIBLE *)device->primary_pwfx;
- if (device->primary_pwfx == NULL) {
- err = DSERR_OUTOFMEMORY;
- goto out;
- }
+ old_fmt = device->primary_pwfx;
+ device->primary_pwfx = DSOUND_CopyFormat(passed_fmt);
+ fmtex = (WAVEFORMATEXTENSIBLE *)device->primary_pwfx;
+ if (device->primary_pwfx == NULL) {
+ err = DSERR_OUTOFMEMORY;
+ goto out;
+ }
- if (fmtex->Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE &&
- fmtex->Samples.wValidBitsPerSample == 0) {
- TRACE("Correcting 0 valid bits per sample\n");
- fmtex->Samples.wValidBitsPerSample = fmtex->Format.wBitsPerSample;
- }
+ if (fmtex->Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE &&
+ fmtex->Samples.wValidBitsPerSample == 0) {
+ TRACE("Correcting 0 valid bits per sample\n");
+ fmtex->Samples.wValidBitsPerSample = fmtex->Format.wBitsPerSample;
+ }
+ if(device->priolevel == DSSCL_WRITEPRIMARY || device->nrofbuffers == 0)
err = DSOUND_ReopenDevice(device, TRUE);
- if (FAILED(err)) {
- ERR("No formats could be opened\n");
- HeapFree(GetProcessHeap(), 0, device->primary_pwfx);
- device->primary_pwfx = old_fmt;
- } else
- HeapFree(GetProcessHeap(), 0, old_fmt);
+ if (FAILED(err) && device->priolevel == DSSCL_WRITEPRIMARY) {
+ ERR("No formats could be opened\n");
+ HeapFree(GetProcessHeap(), 0, device->primary_pwfx);
+ device->primary_pwfx = old_fmt;
} else {
- WAVEFORMATEX *wfx = DSOUND_CopyFormat(passed_fmt);
- if (wfx) {
- HeapFree(GetProcessHeap(), 0, device->primary_pwfx);
- device->primary_pwfx = wfx;
- } else
- err = DSERR_OUTOFMEMORY;
+ /* ignore failures */
+ err = S_OK;
+ HeapFree(GetProcessHeap(), 0, old_fmt);
}
out:
More information about the wine-cvs
mailing list