Maarten Lankhorst : dsound:
Fix detection of different sample rates in setformat.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Sep 10 10:17:55 CDT 2007
Module: wine
Branch: master
Commit: 7a04c24e632857f33f873fe1aa9f8c0b1ee66fd4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7a04c24e632857f33f873fe1aa9f8c0b1ee66fd4
Author: Maarten Lankhorst <m.b.lankhorst at 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) {
More information about the wine-cvs
mailing list