From 46a82846267a49103ec5df99073c7b3ff6468c94 Mon Sep 17 00:00:00 2001 From: Reece Dunn Date: Fri, 21 Nov 2008 21:14:32 +0000 Subject: [PATCH] winealsa.drv: 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; } -- 1.6.0.4