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.

Cannot post event to secondary device.

0 votes

Hello,

I am trying to utilize all of my outputs from my soundcard which are 8 aux outputs + 2 optical outputs.

I would like to create a UE blueprint callable function to post event to secondary outputs.

I have added another system audio device called "System_Optical" and created a master bus for it.

I did follow and combine some of tutorials and findings from users and the documents such as 

Integrating Secondary Outputs (audiokinetic.com)

Blog | Audiokinetic

Q & A | Audiokinetic

I got to a point where I could get my secondary outputs ID and Name correctly but I couldn't do AddOutput();

The result was "AK_NotInitialized(102)".

I don't really know where to start fixing. If anyone has any idea, please shed some light.

Here is my code (C++ Actor Class):


void AMyActor_WwiseCustom::PostEventOn2ndOutput(UAkAudioEvent* Event, UAkComponent* in_pComponent)
{
    FString deviceName = "S/PDIF";
    FString WwiseDeviceName = "System_Optical";
    AKRESULT res = AK_Fail;

    TTuple <AkUInt32, FString> result;
    AkUInt32 immDeviceCount = AK::GetWindowsDeviceCount(AkDeviceState_Active);

    for (AkUInt32 i = 0; i < immDeviceCount; ++i) {
        AkUInt32 deviceId = AK_INVALID_DEVICE_ID;
        AK::GetWindowsDevice(i, deviceId, NULL, AkDeviceState_Active);

        auto deviceNameWstr = AK::GetWindowsDeviceName(i, deviceId, AkDeviceState_Active);
        UE_LOG(LogAkAudio, Warning, TEXT("Windows Audio Device: %s"), deviceNameWstr);

        if (FString(deviceNameWstr).Contains(deviceName)) {
            result.Key = deviceId;
            result.Value = FString(deviceNameWstr);
            break;
        }
    }

    AkOutputDeviceID deviceId = AK_INVALID_DEVICE_ID;

    UE_LOG(LogAkAudio, Warning, TEXT("Device ID: %i"), result.Key);

    if (result.Key) {
        FOnAkPostEventCallback nullCallback;
        AkOutputSettings outputSettings(*WwiseDeviceName, result.Key);
        auto gameObjID = in_pComponent->GetAkGameObjectID();
        res = AK::SoundEngine::AddOutput(outputSettings, &deviceId, &gameObjID, 1);

        UAkGameplayStatics::PostEvent(Event, GetOwner(), int32(0), nullCallback);
    }
}


Really appreciate.

asked Jun 5, 2023 in General Discussion by SNAPtz (250 points)

1 Answer

0 votes
 
Best answer

Hi there,

AK_NotInitialized means AddOutput() was called before the Sound Engine was in state where it is able to add a secondary output. The requirements are:

  1. The Sound Engine is initialized
  2. The Init bank is loaded
  3. The primary output device has been initialized (this is done automatically when the Init bank is finished loading).

If you want to add multiple outputs during the startup phase of your project, the best way would probably be to register a callback the primary device initialization using AK::SoundEngine::RegisterAudioDeviceStatusCallback. When you are notified that the primary device is up and running, now is the time to start adding secondary outputs.

Hope this helps,

Philippe Milot

answered Jun 19, 2023 by Philippe M. (540 points)
selected Jan 23 by SNAPtz
Thank you very much Philippe. Luckily for us, Wwise exposed AddOutput in version 2022.1.6 which made it much easier to setup and call. We get it to work. However, I'll keep your answer in mind, in case we really need to go that route.
...