[PATCH 3/4] xaudio2: Implement IXAudio2SourceVoice::SubmitSourceBuffer

Andrew Eikum aeikum at codeweavers.com
Thu Aug 27 09:32:48 CDT 2015


---
 dlls/xaudio2_7/xaudio_dll.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/dlls/xaudio2_7/xaudio_dll.c b/dlls/xaudio2_7/xaudio_dll.c
index 8097ba3..26670b7 100644
--- a/dlls/xaudio2_7/xaudio_dll.c
+++ b/dlls/xaudio2_7/xaudio_dll.c
@@ -584,7 +584,49 @@ static HRESULT WINAPI XA2SRC_SubmitSourceBuffer(IXAudio2SourceVoice *iface,
         const XAUDIO2_BUFFER *pBuffer, const XAUDIO2_BUFFER_WMA *pBufferWMA)
 {
     XA2SourceImpl *This = impl_from_IXAudio2SourceVoice(iface);
+    XA2Buffer *buf;
+    UINT32 buf_idx;
+
     TRACE("%p, %p, %p\n", This, pBuffer, pBufferWMA);
+
+    if(TRACE_ON(xaudio2)){
+        TRACE("Flags: 0x%x\n", pBuffer->Flags);
+        TRACE("AudioBytes: %u\n", pBuffer->AudioBytes);
+        TRACE("pAudioData: %p\n", pBuffer->pAudioData);
+        TRACE("PlayBegin: %u\n", pBuffer->PlayBegin);
+        TRACE("PlayLength: %u\n", pBuffer->PlayLength);
+        TRACE("LoopBegin: %u\n", pBuffer->LoopBegin);
+        TRACE("LoopLength: %u\n", pBuffer->LoopLength);
+        TRACE("LoopCount: %u\n", pBuffer->LoopCount);
+        TRACE("pContext: %p\n", pBuffer->pContext);
+    }
+
+    EnterCriticalSection(&This->lock);
+
+    if(This->nbufs >= XAUDIO2_MAX_QUEUED_BUFFERS){
+        TRACE("Too many buffers queued!\n");
+        LeaveCriticalSection(&This->lock);
+        return XAUDIO2_E_INVALID_CALL;
+    }
+
+    buf_idx = (This->first_buf + This->nbufs) % XAUDIO2_MAX_QUEUED_BUFFERS;
+    buf = &This->buffers[buf_idx];
+    memset(buf, 0, sizeof(*buf));
+
+    /* API contract: pAudioData must remain valid until this buffer is played,
+     * but pBuffer itself may be reused immediately */
+    memcpy(&buf->xa2buffer, pBuffer, sizeof(*pBuffer));
+
+    buf->offs_bytes = 0;
+    buf->latest_al_buf = -1;
+
+    ++This->nbufs;
+
+    TRACE("%p: queued buffer %u (%u bytes), now %u buffers held\n",
+            This, buf_idx, buf->xa2buffer.AudioBytes, This->nbufs);
+
+    LeaveCriticalSection(&This->lock);
+
     return S_OK;
 }
 
-- 
2.5.0





More information about the wine-patches mailing list