UE4在C ++中的播放时间

时间:2017-05-05 08:40:53

标签: c++ audio unreal-engine4

我最近正在处理声音处理,但我遇到了很大的问题。 我想要达到的目的是获得播放时间(到目前为止播放的声音多长时间,例如我有10秒钟的声音,我在3秒钟后播放它,所以我应该得到7的值)。这是我目前的职能:

float MyAudioClass::GetPlaybackTime(UAudioComponent* AComponent, float &PlaybackTime)
{
    if (AComponent)
    {
        FAudioDevice* AudioDevice = AComponent->GetAudioDevice();
        if (AudioDevice)
        {
            FActiveSound* ActiveSound = AudioDevice->FindActiveSound(AComponent->GetAudioComponentID());
            if (ActiveSound)
            {
                PlaybackTime = ActiveSound->PlaybackTime;
                return PlaybackTime;
            }
            return 0;
        }
        return 0;
    }
    return 0;
}

然而,当我尝试使用它时,整个引擎崩溃并且我收到了这个错误:

Assertion failed: IsInAudioThread()
myaudioclass.cpp:173
myaudioclass.h:41

错误行有序:

if (ActiveSound) //173
    GENERATED_BODY() //41

我在这里做错了什么?如果有人帮助我,我会非常感激:3

2 个答案:

答案 0 :(得分:0)

我认为音响系统正在与游戏线程分开播放。因此,当您进行调用时,您正在错误的线程中执行代码。

如果您在启动声音时,在同一个呼叫中执行FindActiveSound呼叫(假设您没有获得对FActiveSound的引用返回),并将其存储在MyAudioClass的变量中。

然后当您拨打电话以检索播放时间时,请使用此存储的FActiveSound对象引用来检索播放时间。

HTH

答案 1 :(得分:0)

正如Graeme所说,你必须在音频线程中运行代码。

以下是AudioComponent.cpp中使用的代码段:

if (FAudioDevice* AudioDevice = GetAudioDevice())
{
    const uint64 MyAudioComponentID = AudioComponentID;
    FAudioThread::RunCommandOnAudioThread([AudioDevice, MyAudioComponentID, InName, InFloat]()
    {
        FActiveSound* ActiveSound = AudioDevice->FindActiveSound(MyAudioComponentID);
        if (ActiveSound)
        {
            ActiveSound->SetFloatParameter(InName, InFloat);
        }
    }, GET_STATID(STAT_AudioSetFloatParameter));
}