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