Commit 7a04c24e authored by Maarten Lankhorst's avatar Maarten Lankhorst Committed by Alexandre Julliard

dsound: Fix detection of different sample rates in setformat.

parent 7144849d
...@@ -71,6 +71,8 @@ static void DSOUND_RecalcPrimary(DirectSoundDevice *device) ...@@ -71,6 +71,8 @@ static void DSOUND_RecalcPrimary(DirectSoundDevice *device)
HRESULT DSOUND_ReopenDevice(DirectSoundDevice *device, BOOL forcewave) HRESULT DSOUND_ReopenDevice(DirectSoundDevice *device, BOOL forcewave)
{ {
HRESULT hres = DS_OK; HRESULT hres = DS_OK;
TRACE("(%p, %d)\n", device, forcewave);
if (device->driver) if (device->driver)
{ {
IDsDriver_Close(device->driver); IDsDriver_Close(device->driver);
...@@ -336,7 +338,7 @@ HRESULT DSOUND_PrimaryStop(DirectSoundDevice *device) ...@@ -336,7 +338,7 @@ HRESULT DSOUND_PrimaryStop(DirectSoundDevice *device)
err = IDsDriverBuffer_Stop(device->hwbuf); err = IDsDriverBuffer_Stop(device->hwbuf);
if (err == DSERR_BUFFERLOST) { if (err == DSERR_BUFFERLOST) {
DSOUND_PrimaryClose(device); DSOUND_PrimaryClose(device);
err = DSOUND_ReopenDevice(device, !device->driver); err = DSOUND_ReopenDevice(device, FALSE);
if (FAILED(err)) if (FAILED(err))
ERR("DSOUND_ReopenDevice failed\n"); ERR("DSOUND_ReopenDevice failed\n");
else else
...@@ -454,6 +456,7 @@ HRESULT DSOUND_PrimarySetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX wfex, ...@@ -454,6 +456,7 @@ HRESULT DSOUND_PrimarySetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX wfex,
err = DS_OK; err = DS_OK;
goto done; goto done;
} }
if (err == S_FALSE) if (err == S_FALSE)
{ {
/* ALSA specific: S_FALSE tells that recreation was successful, /* ALSA specific: S_FALSE tells that recreation was successful,
...@@ -476,20 +479,28 @@ HRESULT DSOUND_PrimarySetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX wfex, ...@@ -476,20 +479,28 @@ HRESULT DSOUND_PrimarySetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX wfex,
{ {
DSOUND_PrimaryClose(device); DSOUND_PrimaryClose(device);
if (device->drvdesc.dwFlags & DSDDESC_DOMMSYSTEMSETFORMAT) err = DSOUND_ReopenDevice(device, FALSE);
if (FAILED(err))
{ {
err = DSOUND_ReopenDevice(device, FALSE); WARN("DSOUND_ReopenDevice failed: %08x\n", err);
if (FAILED(err)) goto done;
{
WARN("DSOUND_ReopenDevice failed: %08x\n", err);
goto done;
}
} }
err = DSOUND_PrimaryOpen(device); err = DSOUND_PrimaryOpen(device);
if (err != DS_OK) { if (err != DS_OK) {
WARN("DSOUND_PrimaryOpen failed\n"); WARN("DSOUND_PrimaryOpen failed\n");
goto done; 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) { if (nSamplesPerSec != device->pwfx->nSamplesPerSec || bpp != device->pwfx->wBitsPerSample || chans != device->pwfx->nChannels) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment