[PATCH 3/3] xaudio2: Implement IXAudio2SourceVoice frequency functions

Andrew Eikum aeikum at codeweavers.com
Thu Sep 24 14:35:46 CDT 2015


The documentation and version 2.8 require the buffer queue to be empty
before this call will succeed. Version 2.7 and earlier allow the call
to succeed, but behave strangely, applying the new frequency only to
some of the queued buffers. I'm not sure that behavior is valuable.

Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
---
 dlls/xaudio2_7/tests/xaudio2.c |  8 ++++++++
 dlls/xaudio2_7/xaudio_dll.c    | 31 +++++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+)

diff --git a/dlls/xaudio2_7/tests/xaudio2.c b/dlls/xaudio2_7/tests/xaudio2.c
index aabb70e..e8f4fbc 100644
--- a/dlls/xaudio2_7/tests/xaudio2.c
+++ b/dlls/xaudio2_7/tests/xaudio2.c
@@ -467,6 +467,14 @@ static void test_buffer_callbacks(IXAudio2 *xa)
     XA2CALL_0(StartEngine);
     ok(hr == S_OK, "StartEngine failed: %08x\n", hr);
 
+    if(xaudio27){
+        hr = IXAudio27SourceVoice_SetSourceSampleRate((IXAudio27SourceVoice*)src, 48000);
+        todo_wine ok(hr == S_OK, "SetSourceSampleRate failed: %08x\n", hr);
+    }else{
+        hr = IXAudio2SourceVoice_SetSourceSampleRate(src, 48000);
+        ok(hr == XAUDIO2_E_INVALID_CALL, "SetSourceSampleRate should have failed: %08x\n", hr);
+    }
+
     while(1){
         if(xaudio27)
             IXAudio27SourceVoice_GetState((IXAudio27SourceVoice*)src, &state);
diff --git a/dlls/xaudio2_7/xaudio_dll.c b/dlls/xaudio2_7/xaudio_dll.c
index 5c67ffb..32a0431 100644
--- a/dlls/xaudio2_7/xaudio_dll.c
+++ b/dlls/xaudio2_7/xaudio_dll.c
@@ -797,14 +797,32 @@ static HRESULT WINAPI XA2SRC_SetFrequencyRatio(IXAudio2SourceVoice *iface,
         float Ratio, UINT32 OperationSet)
 {
     XA2SourceImpl *This = impl_from_IXAudio2SourceVoice(iface);
+    ALfloat r;
+
     TRACE("%p, %f, 0x%x\n", This, Ratio, OperationSet);
+
+    if(Ratio < 0.5f)
+        r = 0.5f;
+    else if (Ratio > 2.0f)
+        r = 2.0f;
+    else
+        r = Ratio;
+
+    alSourcef(This->al_src, AL_PITCH, r);
+
     return S_OK;
 }
 
 static void WINAPI XA2SRC_GetFrequencyRatio(IXAudio2SourceVoice *iface, float *pRatio)
 {
+    ALfloat ratio;
     XA2SourceImpl *This = impl_from_IXAudio2SourceVoice(iface);
+
     TRACE("%p, %p\n", This, pRatio);
+
+    alGetSourcef(This->al_src, AL_PITCH, &ratio);
+
+    *pRatio = ratio;
 }
 
 static HRESULT WINAPI XA2SRC_SetSourceSampleRate(
@@ -812,7 +830,20 @@ static HRESULT WINAPI XA2SRC_SetSourceSampleRate(
     UINT32 NewSourceSampleRate)
 {
     XA2SourceImpl *This = impl_from_IXAudio2SourceVoice(iface);
+
     TRACE("%p, %u\n", This, NewSourceSampleRate);
+
+    EnterCriticalSection(&This->lock);
+
+    if(This->nbufs){
+        LeaveCriticalSection(&This->lock);
+        return XAUDIO2_E_INVALID_CALL;
+    }
+
+    This->fmt->nSamplesPerSec = NewSourceSampleRate;
+
+    LeaveCriticalSection(&This->lock);
+
     return S_OK;
 }
 
-- 
2.5.3




More information about the wine-patches mailing list