Module: wine Branch: master Commit: 7a04c24e632857f33f873fe1aa9f8c0b1ee66fd4 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7a04c24e632857f33f873fe1aa...
Author: Maarten Lankhorst m.b.lankhorst@gmail.com Date: Wed Sep 5 10:58:52 2007 +0200
dsound: Fix detection of different sample rates in setformat.
---
dlls/dsound/primary.c | 27 +++++++++++++++++++-------- 1 files changed, 19 insertions(+), 8 deletions(-)
diff --git a/dlls/dsound/primary.c b/dlls/dsound/primary.c index 4c9e125..f358aec 100644 --- a/dlls/dsound/primary.c +++ b/dlls/dsound/primary.c @@ -71,6 +71,8 @@ static void DSOUND_RecalcPrimary(DirectSoundDevice *device) HRESULT DSOUND_ReopenDevice(DirectSoundDevice *device, BOOL forcewave) { HRESULT hres = DS_OK; + TRACE("(%p, %d)\n", device, forcewave); + if (device->driver) { IDsDriver_Close(device->driver); @@ -336,7 +338,7 @@ HRESULT DSOUND_PrimaryStop(DirectSoundDevice *device) err = IDsDriverBuffer_Stop(device->hwbuf); if (err == DSERR_BUFFERLOST) { DSOUND_PrimaryClose(device); - err = DSOUND_ReopenDevice(device, !device->driver); + err = DSOUND_ReopenDevice(device, FALSE); if (FAILED(err)) ERR("DSOUND_ReopenDevice failed\n"); else @@ -454,6 +456,7 @@ HRESULT DSOUND_PrimarySetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX wfex, err = DS_OK; goto done; } + if (err == S_FALSE) { /* ALSA specific: S_FALSE tells that recreation was successful, @@ -476,20 +479,28 @@ HRESULT DSOUND_PrimarySetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX wfex, { DSOUND_PrimaryClose(device);
- if (device->drvdesc.dwFlags & DSDDESC_DOMMSYSTEMSETFORMAT) + err = DSOUND_ReopenDevice(device, FALSE); + if (FAILED(err)) { - err = DSOUND_ReopenDevice(device, FALSE); - if (FAILED(err)) - { - WARN("DSOUND_ReopenDevice failed: %08x\n", err); - goto done; - } + WARN("DSOUND_ReopenDevice failed: %08x\n", err); + goto done; } err = DSOUND_PrimaryOpen(device); if (err != DS_OK) { WARN("DSOUND_PrimaryOpen failed\n"); goto done; } + + if (wfex->nSamplesPerSec/100 != device->pwfx->nSamplesPerSec/100 && forced && device->buffer) + { + DSOUND_PrimaryClose(device); + device->pwfx->nSamplesPerSec = wfex->nSamplesPerSec; + err = DSOUND_ReopenDevice(device, TRUE); + if (FAILED(err)) + WARN("DSOUND_ReopenDevice(2) failed: %08x\n", err); + else if (FAILED((err = DSOUND_PrimaryOpen(device)))) + WARN("DSOUND_PrimaryOpen(2) failed: %08x\n", err); + } }
if (nSamplesPerSec != device->pwfx->nSamplesPerSec || bpp != device->pwfx->wBitsPerSample || chans != device->pwfx->nChannels) {