[PATCH 4/4 (try2)] xaudio2: Implement IXAudio2::RegisterForCallbacks
Andrew Eikum
aeikum at codeweavers.com
Tue Aug 25 14:29:19 CDT 2015
---
try2: Fix bugs in UnregisterForCallbacks, thanks slackner
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;
- FIXME("(%p)->(%p): stub!\n", This, pCallback);
+ 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;
+ }
+ }
+
+ 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;
- FIXME("(%p)->(%p): stub!\n", This, pCallback);
+ TRACE("(%p)->(%p)\n", This, pCallback);
+
+ EnterCriticalSection(&This->lock);
+
+ 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;
}
--
2.5.0
More information about the wine-patches
mailing list