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