Reece Dunn : winealsa: Calculate the delay correctly as snd_pcm_delay is not reliable in this context .

Alexandre Julliard julliard at winehq.org
Mon Nov 24 09:17:03 CST 2008


Module: wine
Branch: master
Commit: ef0069cbf5dd7c65089aa9565a5c42f1ab8e7de3
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ef0069cbf5dd7c65089aa9565a5c42f1ab8e7de3

Author: Reece Dunn <msclrhd at googlemail.com>
Date:   Fri Nov 21 21:14:32 2008 +0000

winealsa: Calculate the delay correctly as snd_pcm_delay is not reliable in this context.

---

 dlls/winealsa.drv/waveout.c |   18 ++++++++++++++----
 1 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/dlls/winealsa.drv/waveout.c b/dlls/winealsa.drv/waveout.c
index 6cb2da8..90c23b3 100644
--- a/dlls/winealsa.drv/waveout.c
+++ b/dlls/winealsa.drv/waveout.c
@@ -98,19 +98,29 @@ static DWORD wodNotifyClient(WINE_WAVEDEV* wwo, WORD wMsg, DWORD dwParam1, DWORD
 static BOOL wodUpdatePlayedTotal(WINE_WAVEDEV* wwo, snd_pcm_status_t* ps)
 {
     snd_pcm_sframes_t delay = 0;
+    snd_pcm_sframes_t avail = 0;
+    snd_pcm_uframes_t buf_size = 0;
     snd_pcm_state_t state;
+    int err;
 
     state = snd_pcm_state(wwo->pcm);
-    snd_pcm_delay(wwo->pcm, &delay);
+    avail = snd_pcm_avail_update(wwo->pcm);
+    err = snd_pcm_hw_params_get_buffer_size(wwo->hw_params, &buf_size);
+    delay = buf_size - avail;
+
+    if (state != SND_PCM_STATE_RUNNING && state != SND_PCM_STATE_PREPARED)
+    {
+        WARN("Unexpected state (%d) while updating Total Played, resetting\n", state);
+        delay=0;
+    }
 
     /* A delay < 0 indicates an underrun; for our purposes that's 0.  */
     if (delay < 0)
     {
-        WARN("Unexpected state (%d) or delay (%ld) while updating Total Played, resetting\n", state, delay);
+        WARN("Unexpected delay (%ld) while updating Total Played, resetting\n", delay);
         delay=0;
     }
-    if (state == SND_PCM_STATE_XRUN)
-        snd_pcm_start(wwo->pcm);
+
     InterlockedExchange((LONG*)&wwo->dwPlayedTotal, wwo->dwWrittenTotal - snd_pcm_frames_to_bytes(wwo->pcm, delay));
     return TRUE;
 }




More information about the wine-cvs mailing list