在 Audiokinetic 社区问答论坛上,用户可对 Wwise 和 Strata 相关问题进行提问和解答。如需从 Audiokinetic 技术支持团队获取答复,请务必使用技术支持申请单页面。

Cannot post event to secondary device.

0 投票

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.

最新提问 6月 5, 2023 分类:General Discussion | 用户: SNAPtz (250 分)

1个回答

0 投票
 
已采纳

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

最新回答 6月 19, 2023 用户: Philippe M. (540 分)
采纳于 1月 23 用户: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.
...