[PATCH 3/5] xaudio2: Implement IXAudio2SourceVoice::FlushSourceBuffers
Andrew Eikum
aeikum at codeweavers.com
Fri Aug 28 08:22:25 CDT 2015
---
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;
}
--
2.5.0
More information about the wine-patches
mailing list