Alistair Leslie-Hughes : xactengine3_7: Implement callback for supported messages.
Alexandre Julliard
julliard at winehq.org
Thu Aug 4 14:46:39 CDT 2022
Module: wine
Branch: master
Commit: d1c08b1714527213b54144646e050c7878a4a400
URL: https://gitlab.winehq.org/wine/wine/-/commit/d1c08b1714527213b54144646e050c7878a4a400
Author: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date: Fri Jul 22 09:17:06 2022 +1000
xactengine3_7: Implement callback for supported messages.
---
dlls/xactengine3_7/xact_dll.c | 69 +++++++++++++++++++++++++++++++++----------
1 file changed, 53 insertions(+), 16 deletions(-)
diff --git a/dlls/xactengine3_7/xact_dll.c b/dlls/xactengine3_7/xact_dll.c
index 2576d14bb21..cd72f43949f 100644
--- a/dlls/xactengine3_7/xact_dll.c
+++ b/dlls/xactengine3_7/xact_dll.c
@@ -142,6 +142,23 @@ static HRESULT wrapper_add_entry(XACT3EngineImpl *engine, void *fact, void *xact
return S_OK;
}
+/* Must be protected by engine->wrapper_lookup_cs */
+static void* wrapper_find_entry(XACT3EngineImpl *engine, void *faudio)
+{
+ struct wrapper_lookup *lookup;
+ struct wine_rb_entry *entry;
+
+ entry = wine_rb_get(&engine->wrapper_lookup, faudio);
+ if (entry)
+ {
+ lookup = WINE_RB_ENTRY_VALUE(entry, struct wrapper_lookup, entry);
+ return lookup->xact;
+ }
+
+ WARN("cannot find interface in wrapper lookup\n");
+ return NULL;
+}
+
typedef struct _XACT3CueImpl {
IXACT3Cue IXACT3Cue_iface;
FACTCue *fact_cue;
@@ -1000,10 +1017,8 @@ static void FACTCALL fact_notification_cb(const FACTNotification *notification)
{
XACT3EngineImpl *engine = (XACT3EngineImpl *)notification->pvContext;
XACT_NOTIFICATION xnotification;
- struct wrapper_lookup *lookup;
- struct wine_rb_entry *entry;
- TRACE("notification %p\n", notification->pvContext);
+ TRACE("notification %d, context %p\n", notification->type, notification->pvContext);
/* Older versions of FAudio don't pass through the context */
if (!engine)
@@ -1016,28 +1031,50 @@ static void FACTCALL fact_notification_cb(const FACTNotification *notification)
xnotification.timeStamp = notification->timeStamp;
xnotification.pvContext = engine->contexts[notification->type];
+ EnterCriticalSection(&engine->wrapper_lookup_cs);
if (notification->type == XACTNOTIFICATIONTYPE_WAVEBANKPREPARED
|| notification->type == XACTNOTIFICATIONTYPE_WAVEBANKDESTROYED)
{
- EnterCriticalSection(&engine->wrapper_lookup_cs);
- entry = wine_rb_get(&engine->wrapper_lookup, notification->waveBank.pWaveBank);
- if (!entry)
- {
- WARN("cannot find wave bank in wrapper lookup\n");
- xnotification.waveBank.pWaveBank = NULL;
- }
- else
- {
- lookup = WINE_RB_ENTRY_VALUE(entry, struct wrapper_lookup, entry);
- xnotification.waveBank.pWaveBank = lookup->xact;
- }
- LeaveCriticalSection(&engine->wrapper_lookup_cs);
+ xnotification.waveBank.pWaveBank = wrapper_find_entry(engine, notification->waveBank.pWaveBank);
+ }
+ else if(notification->type == XACTNOTIFICATIONTYPE_SOUNDBANKDESTROYED)
+ {
+ xnotification.soundBank.pSoundBank = wrapper_find_entry(engine, notification->soundBank.pSoundBank);
+ }
+ else if (notification->type == XACTNOTIFICATIONTYPE_WAVESTOP
+#if XACT3_VER >= 0x0205
+ || notification->type == XACTNOTIFICATIONTYPE_WAVEDESTROYED
+ || notification->type == XACTNOTIFICATIONTYPE_WAVELOOPED
+ || notification->type == XACTNOTIFICATIONTYPE_WAVEPLAY
+ || notification->type == XACTNOTIFICATIONTYPE_WAVEPREPARED)
+#else
+ )
+#endif
+ {
+ xnotification.wave.cueIndex = notification->wave.cueIndex;
+ xnotification.wave.pCue = wrapper_find_entry(engine, notification->wave.pCue);
+ xnotification.wave.pSoundBank = wrapper_find_entry(engine, notification->wave.pSoundBank);
+#if XACT3_VER >= 0x0205
+ xnotification.wave.pWave = wrapper_find_entry(engine, notification->wave.pWave);
+#endif
+ xnotification.wave.pWaveBank = wrapper_find_entry(engine, notification->wave.pWaveBank);
+ }
+ else if (notification->type == XACTNOTIFICATIONTYPE_CUEPLAY ||
+ notification->type == XACTNOTIFICATIONTYPE_CUEPREPARED ||
+ notification->type == XACTNOTIFICATIONTYPE_CUESTOP ||
+ notification->type == XACTNOTIFICATIONTYPE_CUEDESTROYED)
+ {
+ xnotification.cue.pCue = wrapper_find_entry(engine, notification->cue.pCue);
+ xnotification.cue.cueIndex = notification->cue.cueIndex;
+ xnotification.cue.pSoundBank = wrapper_find_entry(engine, notification->cue.pSoundBank);
}
else
{
+ LeaveCriticalSection(&engine->wrapper_lookup_cs);
FIXME("Unsupported callback type %d\n", notification->type);
return;
}
+ LeaveCriticalSection(&engine->wrapper_lookup_cs);
engine->notification_callback(&xnotification);
}
More information about the wine-cvs
mailing list