Audiokinetic's Community Q&A is the forum where users can ask and answer questions within the Wwise and Strata communities. If you would like to get an answer from Audiokinetic's Technical support team, make sure you use the Support Tickets page.

Expanding the UE4 plugin to include callbacks

0 votes

Hey, everyone.

To my surprise, the UE4 integration doesn't seem to support callbacks or play position checking in *any* way. So, following the API, I'm attempting to rewrite some of the code to allow it. Can anyone maybe tell me what I'm doing wrong? I'm performing these actions on an AkAudio Component with 30 seconds of "interactive music" playing at 120 BPM.

In AudioDevice.cpp:

AkPlayingID FAkAudioDevice::PostEvent(
    UAkAudioEvent * in_pEvent, 
    AActor * in_pActor,
    AkUInt32 in_uFlags /*= 0*/,
    AkCallbackFunc in_pfnCallback /*= NULL*/,
    void * in_pCookie /*= NULL*/,
    bool in_bStopWhenOwnerDestroyed /*= false*/
    if (!in_pEvent)
        return AK_INVALID_PLAYING_ID;

    return PostEvent(in_pEvent->GetName(), in_pActor, AK_MusicSyncBeat, MusicCallback, in_pCookie, in_bStopWhenOwnerDestroyed);

void FAkAudioDevice::MusicCallback(
    AkCallbackType in_eType,            // Type of callback reason, in this case it could be AK_MusicSyncBeat
    AkCallbackInfo* in_pCallbackInfo    // Pointer to callback information structure, in this case
                                        // AkMusicSyncCallbackInfo*.
    UE_LOG(LogAkAudio, Warning, TEXT("Currently in Audio Callback!"));

Also couldn't get GetSourcePlaybackPosition to work, even after feeding in 0x100000 in the callback flags argument.

Any ideas? Really beating my head against a wall, here. This stuff is required for *anything* requiring feedback from Wwise to display on-screen, and it's a bit disappointing it isn't available.

asked Jun 27, 2017 in General Discussion by Jason W. (100 points)
Have you solved this problem?

I declare a callback function:
static void EndOfEventCallbackFunc(AkCallbackType in_eType, AkCallbackFunc* in_pCallbackInfo);

and pass it when calling the function declared in AkComponet:

PlayingID = pAkComp->PostAkEventByNameWithCallback((in_pAkEvent)->GetName(), AK_EndOfEvent, &EndOfEventCallbackFunc);

However, it fails to compile and gets the error message:

error C2664: 'AkPlayingID UAkComponent::PostAkEventByNameWithCallback(const FString &,AkUInt32,AkCallbackFunc,void *,const TArray<FAkExternalSourceInfo,FDefaultAllocator> &)': cannot convert argument 3 from 'void (__cdecl *)(AkCallbackType,AkCallbackFunc *)' to 'AkCallbackFunc'

note: This conversion requires a reinterpret_cast, a C-style cast or function-style cast

Any ideas?  I am very appreciative of your assistance.
Almost been a year, but like the compiler suggests this works if you add a cast.
PlayingID = pAkComp->PostAkEventByNameWithCallback((in_pAkEvent)->GetName(), AK_EndOfEvent, AkCallbackFunc(&EndOfEventCallbackFunc));

Please sign-in or register to answer this question.