xaudio2: Implement IXAudio2SourceVoice::FlushSourceBuffers.
This commit is contained in:
parent
cb38242821
commit
66a58ad52a
|
@ -639,8 +639,45 @@ static HRESULT WINAPI XA2SRC_SubmitSourceBuffer(IXAudio2SourceVoice *iface,
|
||||||
|
|
||||||
static HRESULT WINAPI XA2SRC_FlushSourceBuffers(IXAudio2SourceVoice *iface)
|
static HRESULT WINAPI XA2SRC_FlushSourceBuffers(IXAudio2SourceVoice *iface)
|
||||||
{
|
{
|
||||||
|
UINT i, first, last, to_flush;
|
||||||
XA2SourceImpl *This = impl_from_IXAudio2SourceVoice(iface);
|
XA2SourceImpl *This = impl_from_IXAudio2SourceVoice(iface);
|
||||||
|
|
||||||
TRACE("%p\n", This);
|
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;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue