Andrew Eikum : xaudio2: Implement IXAudio2SourceVoice frequency functions.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Sep 25 15:22:02 CDT 2015


Module: wine
Branch: master
Commit: eae93c1f412c9c55ac6319938fdf15444b8e7a74
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=eae93c1f412c9c55ac6319938fdf15444b8e7a74

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Fri Sep 25 12:39:40 2015 -0500

xaudio2: Implement IXAudio2SourceVoice frequency functions.

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..8b41cbb 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 < XAUDIO2_MIN_FREQ_RATIO)
+        r = XAUDIO2_MIN_FREQ_RATIO;
+    else if (Ratio > XAUDIO2_MAX_FREQ_RATIO)
+        r = XAUDIO2_MAX_FREQ_RATIO;
+    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;
 }
 




More information about the wine-cvs mailing list