Andrew Eikum : xaudio2: Implement IXAudio2SourceVoice::FlushSourceBuffers.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Aug 31 06:41:59 CDT 2015
Module: wine
Branch: master
Commit: 66a58ad52a5e0dd9b444dc6b844e939367d2e047
URL: http://source.winehq.org/git/wine.git/?a=commit;h=66a58ad52a5e0dd9b444dc6b844e939367d2e047
Author: Andrew Eikum <aeikum at codeweavers.com>
Date: Fri Aug 28 08:22:25 2015 -0500
xaudio2: Implement IXAudio2SourceVoice::FlushSourceBuffers.
---
dlls/xaudio2_7/xaudio_dll.c | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/dlls/xaudio2_7/xaudio_dll.c b/dlls/xaudio2_7/xaudio_dll.c
index b8fbbc6..48ab3db 100644
--- a/dlls/xaudio2_7/xaudio_dll.c
+++ b/dlls/xaudio2_7/xaudio_dll.c
@@ -639,8 +639,45 @@ static HRESULT WINAPI XA2SRC_SubmitSourceBuffer(IXAudio2SourceVoice *iface,
static HRESULT WINAPI XA2SRC_FlushSourceBuffers(IXAudio2SourceVoice *iface)
{
+ UINT i, first, last, to_flush;
XA2SourceImpl *This = impl_from_IXAudio2SourceVoice(iface);
+
TRACE("%p\n", This);
+
+ EnterCriticalSection(&This->lock);
+
+ if(This->running && This->nbufs > 0){
+ /* when running, flush only completely unused buffers; the rest remain
+ * in queue */
+ last = (This->first_buf + This->nbufs) % XAUDIO2_MAX_QUEUED_BUFFERS;
+ first = (This->cur_buf + 1) % XAUDIO2_MAX_QUEUED_BUFFERS;
+ if(This->cur_buf == last)
+ /* nothing to do */
+ to_flush = 0;
+ else if(last >= first)
+ to_flush = last - first;
+ else
+ to_flush = last + XAUDIO2_MAX_QUEUED_BUFFERS - first;
+ }else{
+ /* when stopped, flush all buffers */
+ first = This->first_buf;
+ last = (This->first_buf + This->nbufs) % XAUDIO2_MAX_QUEUED_BUFFERS;
+ to_flush = This->nbufs;
+ }
+
+
+ for(i = first;
+ i < (first + to_flush) % XAUDIO2_MAX_QUEUED_BUFFERS;
+ i = (i + 1) % XAUDIO2_MAX_QUEUED_BUFFERS){
+ if(This->cb)
+ IXAudio2VoiceCallback_OnBufferEnd(This->cb,
+ This->buffers[i].xa2buffer.pContext);
+ }
+
+ This->nbufs -= to_flush;
+
+ LeaveCriticalSection(&This->lock);
+
return S_OK;
}
More information about the wine-cvs
mailing list