Andrew Eikum : xaudio2: Implement IXAudio2::RegisterForCallbacks.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Aug 26 09:57:11 CDT 2015


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

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Tue Aug 25 14:29:19 2015 -0500

xaudio2: Implement IXAudio2::RegisterForCallbacks.

---

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

diff --git a/dlls/xaudio2_7/xaudio_dll.c b/dlls/xaudio2_7/xaudio_dll.c
index 0438fcf..5aa34b5 100644
--- a/dlls/xaudio2_7/xaudio_dll.c
+++ b/dlls/xaudio2_7/xaudio_dll.c
@@ -196,6 +196,9 @@ struct _IXAudio2Impl {
 
     ALCdevice *al_device;
     ALCcontext *al_ctx;
+
+    UINT32 ncbs;
+    IXAudio2EngineCallback **cbs;
 };
 
 static inline IXAudio2Impl *impl_from_IXAudio2(IXAudio2 *iface)
@@ -1260,6 +1263,7 @@ static ULONG WINAPI IXAudio2Impl_Release(IXAudio2 *iface)
         for(i = 0; i < This->ndevs; ++i)
             CoTaskMemFree(This->devids[i]);
         HeapFree(GetProcessHeap(), 0, This->devids);
+        HeapFree(GetProcessHeap(), 0, This->cbs);
 
         DeleteCriticalSection(&This->lock);
 
@@ -1272,8 +1276,26 @@ static HRESULT WINAPI IXAudio2Impl_RegisterForCallbacks(IXAudio2 *iface,
         IXAudio2EngineCallback *pCallback)
 {
     IXAudio2Impl *This = impl_from_IXAudio2(iface);
+    int i;
+
+    TRACE("(%p)->(%p)\n", This, pCallback);
+
+    EnterCriticalSection(&This->lock);
+
+    for(i = 0; i < This->ncbs; ++i){
+        if(!This->cbs[i] || This->cbs[i] == pCallback){
+            This->cbs[i] = pCallback;
+            LeaveCriticalSection(&This->lock);
+            return S_OK;
+        }
+    }
 
-    FIXME("(%p)->(%p): stub!\n", This, pCallback);
+    This->ncbs *= 2;
+    This->cbs = HeapReAlloc(GetProcessHeap(), 0, This->cbs, This->ncbs * sizeof(*This->cbs));
+
+    This->cbs[i] = pCallback;
+
+    LeaveCriticalSection(&This->lock);
 
     return E_NOTIMPL;
 }
@@ -1282,8 +1304,24 @@ static void WINAPI IXAudio2Impl_UnregisterForCallbacks(IXAudio2 *iface,
         IXAudio2EngineCallback *pCallback)
 {
     IXAudio2Impl *This = impl_from_IXAudio2(iface);
+    int i;
+
+    TRACE("(%p)->(%p)\n", This, pCallback);
+
+    EnterCriticalSection(&This->lock);
 
-    FIXME("(%p)->(%p): stub!\n", This, pCallback);
+    for(i = 0; i < This->ncbs; ++i){
+        if(This->cbs[i] == pCallback)
+            break;
+    }
+
+    for(; i < This->ncbs - 1 && This->cbs[i + 1]; ++i)
+        This->cbs[i] = This->cbs[i + 1];
+
+    if(i < This->ncbs)
+        This->cbs[i] = NULL;
+
+    LeaveCriticalSection(&This->lock);
 }
 
 static WAVEFORMATEX *copy_waveformat(const WAVEFORMATEX *wfex)
@@ -2071,6 +2109,9 @@ static HRESULT WINAPI XAudio2CF_CreateInstance(IClassFactory *iface, IUnknown *p
         return hr;
     }
 
+    object->ncbs = 4;
+    object->cbs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->ncbs * sizeof(*object->cbs));
+
     return hr;
 }
 




More information about the wine-cvs mailing list