[PATCH 1/4] xaudio2: Implement IXAudio2SourceVoice frequency functions

Andrew Eikum aeikum at codeweavers.com
Tue Sep 15 12:25:23 CDT 2015


---
 dlls/xaudio2_7/xaudio_dll.c | 27 +++++++++++++++++++++++++--
 1 file changed, 25 insertions(+), 2 deletions(-)

diff --git a/dlls/xaudio2_7/xaudio_dll.c b/dlls/xaudio2_7/xaudio_dll.c
index ccbcd21..53c657c 100644
--- a/dlls/xaudio2_7/xaudio_dll.c
+++ b/dlls/xaudio2_7/xaudio_dll.c
@@ -147,7 +147,8 @@ typedef struct _XA2SourceImpl {
 
     WAVEFORMATEX *fmt;
     ALenum al_fmt;
-    UINT32 submit_blocksize;
+    UINT32 submit_blocksize, freq;
+    float freq_ratio;
 
     IXAudio2VoiceCallback *cb;
 
@@ -801,14 +802,26 @@ static HRESULT WINAPI XA2SRC_SetFrequencyRatio(IXAudio2SourceVoice *iface,
         float Ratio, UINT32 OperationSet)
 {
     XA2SourceImpl *This = impl_from_IXAudio2SourceVoice(iface);
+
     TRACE("%p, %f, 0x%x\n", This, Ratio, OperationSet);
+
+    EnterCriticalSection(&This->lock);
+
+    This->freq_ratio = Ratio;
+    This->freq = This->fmt->nSamplesPerSec * Ratio;
+
+    LeaveCriticalSection(&This->lock);
+
     return S_OK;
 }
 
 static void WINAPI XA2SRC_GetFrequencyRatio(IXAudio2SourceVoice *iface, float *pRatio)
 {
     XA2SourceImpl *This = impl_from_IXAudio2SourceVoice(iface);
+
     TRACE("%p, %p\n", This, pRatio);
+
+    *pRatio = This->freq_ratio;
 }
 
 static HRESULT WINAPI XA2SRC_SetSourceSampleRate(
@@ -816,7 +829,16 @@ static HRESULT WINAPI XA2SRC_SetSourceSampleRate(
     UINT32 NewSourceSampleRate)
 {
     XA2SourceImpl *This = impl_from_IXAudio2SourceVoice(iface);
+
     TRACE("%p, %u\n", This, NewSourceSampleRate);
+
+    EnterCriticalSection(&This->lock);
+
+    This->fmt->nSamplesPerSec = NewSourceSampleRate;
+    This->freq = NewSourceSampleRate * This->freq_ratio;
+
+    LeaveCriticalSection(&This->lock);
+
     return S_OK;
 }
 
@@ -1697,6 +1719,7 @@ static HRESULT WINAPI IXAudio2Impl_CreateSourceVoice(IXAudio2 *iface,
     src->submit_blocksize = pSourceFormat->nBlockAlign;
 
     src->fmt = copy_waveformat(pSourceFormat);
+    src->freq = src->fmt->nSamplesPerSec;
 
     hr = XA2SRC_SetOutputVoices(&src->IXAudio2SourceVoice_iface, pSendList);
     if(FAILED(hr)){
@@ -2989,7 +3012,7 @@ static BOOL xa2buffer_queue_period(XA2SourceImpl *src, XA2Buffer *buf, ALuint al
     buf->offs_bytes += submit_bytes;
 
     alBufferData(al_buf, src->al_fmt, submit_buf, submit_bytes,
-            src->fmt->nSamplesPerSec);
+            src->freq);
 
     alSourceQueueBuffers(src->al_src, 1, &al_buf);
 
-- 
2.5.1





More information about the wine-patches mailing list