Maarten Lankhorst : dsound: Use AudioClient for position.
Alexandre Julliard
julliard at wine.codeweavers.com
Sat May 14 10:07:28 CDT 2016
Module: wine
Branch: master
Commit: 95287ac2dfb3bd64e1b65aadbdf7e375af2607d4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=95287ac2dfb3bd64e1b65aadbdf7e375af2607d4
Author: Maarten Lankhorst <wine at mblankhorst.nl>
Date: Thu May 12 08:43:34 2016 -0500
dsound: Use AudioClient for position.
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/dsound/dsound_private.h | 1 -
dlls/dsound/primary.c | 35 +++++++++++++----------------------
2 files changed, 13 insertions(+), 23 deletions(-)
diff --git a/dlls/dsound/dsound_private.h b/dlls/dsound/dsound_private.h
index 018f024..918839e 100644
--- a/dlls/dsound/dsound_private.h
+++ b/dlls/dsound/dsound_private.h
@@ -75,7 +75,6 @@ struct DirectSoundDevice
DSCAPS drvcaps;
DWORD priolevel, sleeptime;
PWAVEFORMATEX pwfx, primary_pwfx;
- UINT playing_offs_bytes, in_mmdev_bytes;
LPBYTE buffer;
DWORD writelead, buflen, aclen, fraglen, state, playpos, pad;
int nrofbuffers;
diff --git a/dlls/dsound/primary.c b/dlls/dsound/primary.c
index a3851e2..bdab0ee 100644
--- a/dlls/dsound/primary.c
+++ b/dlls/dsound/primary.c
@@ -480,23 +480,6 @@ HRESULT DSOUND_PrimaryStop(DirectSoundDevice *device)
return DS_OK;
}
-HRESULT DSOUND_PrimaryGetPosition(DirectSoundDevice *device, LPDWORD playpos, LPDWORD writepos)
-{
- TRACE("(%p,%p,%p)\n", device, playpos, writepos);
-
- /* check if playpos was requested */
- if (playpos)
- *playpos = device->playing_offs_bytes;
-
- /* check if writepos was requested */
- if (writepos)
- /* the writepos is the first non-queued position */
- *writepos = (device->playing_offs_bytes + device->in_mmdev_bytes) % device->buflen;
-
- TRACE("playpos = %d, writepos = %d (%p, time=%d)\n", playpos?*playpos:-1, writepos?*writepos:-1, device, GetTickCount());
- return DS_OK;
-}
-
WAVEFORMATEX *DSOUND_CopyFormat(const WAVEFORMATEX *wfex)
{
WAVEFORMATEX *pwfx;
@@ -824,7 +807,9 @@ static ULONG WINAPI PrimaryBufferImpl_Release(IDirectSoundBuffer *iface)
static HRESULT WINAPI PrimaryBufferImpl_GetCurrentPosition(IDirectSoundBuffer *iface,
DWORD *playpos, DWORD *writepos)
{
- HRESULT hres;
+ HRESULT hres = DS_OK;
+ UINT32 pad = 0;
+ UINT32 mixpos;
IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface);
DirectSoundDevice *device = This->device;
TRACE("(%p,%p,%p)\n", iface, playpos, writepos);
@@ -832,17 +817,23 @@ static HRESULT WINAPI PrimaryBufferImpl_GetCurrentPosition(IDirectSoundBuffer *i
/* **** */
EnterCriticalSection(&(device->mixlock));
- hres = DSOUND_PrimaryGetPosition(device, playpos, writepos);
+ if (device->client)
+ hres = IAudioClient_GetCurrentPadding(device->client, &pad);
if (hres != DS_OK) {
- WARN("DSOUND_PrimaryGetPosition failed\n");
+ WARN("IAudioClient_GetCurrentPadding failed\n");
LeaveCriticalSection(&(device->mixlock));
return hres;
}
+ mixpos = (device->playpos + pad * device->pwfx->nBlockAlign) % device->buflen;
+ if (playpos)
+ *playpos = mixpos;
if (writepos) {
- if (device->state != STATE_STOPPED)
+ *writepos = mixpos;
+ if (device->state != STATE_STOPPED) {
/* apply the documented 10ms lead to writepos */
*writepos += device->writelead;
- while (*writepos >= device->buflen) *writepos -= device->buflen;
+ *writepos %= device->buflen;
+ }
}
LeaveCriticalSection(&(device->mixlock));
More information about the wine-cvs
mailing list