Maarten Lankhorst : winealsa:
Make SetFormat work better with new behavior of dsound.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Aug 27 13:57:15 CDT 2007
Module: wine
Branch: master
Commit: cdc8d971818624b5ab7a410cbd3cd8c80ebcecf7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=cdc8d971818624b5ab7a410cbd3cd8c80ebcecf7
Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date: Mon Aug 27 14:28:52 2007 +0200
winealsa: Make SetFormat work better with new behavior of dsound.
---
dlls/winealsa.drv/dsoutput.c | 39 +++++++++++++++++++++------------------
1 files changed, 21 insertions(+), 18 deletions(-)
diff --git a/dlls/winealsa.drv/dsoutput.c b/dlls/winealsa.drv/dsoutput.c
index 87907b3..c1cd039 100644
--- a/dlls/winealsa.drv/dsoutput.c
+++ b/dlls/winealsa.drv/dsoutput.c
@@ -73,6 +73,7 @@ struct IDsDriverImpl
/* IDsDriverImpl fields */
IDsDriverBufferImpl* primary;
UINT wDevID;
+ DWORD forceformat;
};
struct IDsDriverBufferImpl
@@ -292,6 +293,9 @@ static HRESULT WINAPI IDsDriverBufferImpl_Lock(PIDSDRIVERBUFFER iface,
/* **** */
EnterCriticalSection(&This->pcm_crst);
+ if (dwFlags & DSBLOCK_ENTIREBUFFER)
+ dwWriteLen = This->mmap_buflen_bytes;
+
if (dwWriteLen > This->mmap_buflen_bytes || dwWritePosition >= This->mmap_buflen_bytes)
{
/* **** */
@@ -368,7 +372,7 @@ static HRESULT WINAPI IDsDriverBufferImpl_Unlock(PIDSDRIVERBUFFER iface,
return DS_OK;
}
-static HRESULT SetFormat(IDsDriverBufferImpl *This, LPWAVEFORMATEX pwfx, BOOL forced)
+static HRESULT SetFormat(IDsDriverBufferImpl *This, LPWAVEFORMATEX pwfx)
{
snd_pcm_t *pcm = NULL;
snd_pcm_hw_params_t *hw_params = This->hw_params;
@@ -387,11 +391,7 @@ static HRESULT SetFormat(IDsDriverBufferImpl *This, LPWAVEFORMATEX pwfx, BOOL fo
default: FIXME("Unsupported bpp: %d\n", pwfx->wBitsPerSample); return DSERR_GENERIC;
}
- /* **** */
- EnterCriticalSection(&This->pcm_crst);
-
err = snd_pcm_open(&pcm, WOutDev[This->drv->wDevID].pcmname, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK);
-
if (err < 0)
{
if (errno != EBUSY || !This->pcm)
@@ -427,13 +427,18 @@ static HRESULT SetFormat(IDsDriverBufferImpl *This, LPWAVEFORMATEX pwfx, BOOL fo
* side effects, which may include: Less granular pointer, changing buffer sizes, etc
*/
#if SND_LIB_VERSION >= 0x010009
- snd_pcm_hw_params_set_rate_resample(pcm, hw_params, 0 && forced);
+ snd_pcm_hw_params_set_rate_resample(pcm, hw_params, 0);
#endif
err = snd_pcm_hw_params_set_rate_near(pcm, hw_params, &rate, NULL);
if (err < 0) { rate = pwfx->nSamplesPerSec; WARN("Could not set rate\n"); goto err; }
- if (!ALSA_NearMatch(rate, pwfx->nSamplesPerSec))
+ if (!ALSA_NearMatch(rate, pwfx->nSamplesPerSec) && (This->drv->forceformat++))
+ {
+ WARN("Could not set exact rate %d, instead %d, bombing out\n", pwfx->nSamplesPerSec, rate);
+ goto err;
+ }
+ else if (!ALSA_NearMatch(rate, pwfx->nSamplesPerSec))
{
WARN("Could not set sound rate to %d, but instead to %d\n", pwfx->nSamplesPerSec, rate);
pwfx->nSamplesPerSec = rate;
@@ -463,12 +468,8 @@ static HRESULT SetFormat(IDsDriverBufferImpl *This, LPWAVEFORMATEX pwfx, BOOL fo
snd_pcm_close(This->pcm);
}
This->pcm = pcm;
-
snd_pcm_prepare(This->pcm);
DSDB_CreateMMAP(This);
-
- /* **** */
- LeaveCriticalSection(&This->pcm_crst);
return S_OK;
err:
@@ -483,8 +484,6 @@ static HRESULT SetFormat(IDsDriverBufferImpl *This, LPWAVEFORMATEX pwfx, BOOL fo
if (This->pcm)
snd_pcm_hw_params_current(This->pcm, This->hw_params);
- /* **** */
- LeaveCriticalSection(&This->pcm_crst);
return DSERR_BADFORMAT;
}
@@ -495,11 +494,15 @@ static HRESULT WINAPI IDsDriverBufferImpl_SetFormat(PIDSDRIVERBUFFER iface, LPWA
TRACE("(%p, %p)\n", iface, pwfx);
- hr = SetFormat(This, pwfx, TRUE);
+ /* **** */
+ EnterCriticalSection(&This->pcm_crst);
+ This->drv->forceformat = FALSE;
+ hr = SetFormat(This, pwfx);
+ /* **** */
+ LeaveCriticalSection(&This->pcm_crst);
- if (hr == S_OK)
- /* Buffer size / Location changed, so tell dsound to recreate */
- return DSERR_BUFFERLOST;
+ if (hr == DS_OK)
+ return S_FALSE;
return hr;
}
@@ -778,7 +781,7 @@ static HRESULT WINAPI IDsDriverImpl_CreateSoundBuffer(PIDSDRIVER iface,
(*ippdsdb)->pcm_crst.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": ALSA_DSOUTPUT.pcm_crst");
/* SetFormat has to re-initialize pcm here anyway */
- err = SetFormat(*ippdsdb, pwfx, FALSE);
+ err = SetFormat(*ippdsdb, pwfx);
if (FAILED(err))
{
WARN("Error occurred: %08x\n", err);
More information about the wine-cvs
mailing list