C++ UE4以C+为单位的播放时间+;

C++ UE4以C+为单位的播放时间+;,c++,audio,unreal-engine4,C++,Audio,Unreal Engine4,我最近正在研究声音处理,但我遇到了一个大问题。 我想要实现的是获得播放时间(例如,到现在为止播放了多长时间的声音,我有10秒的声音,我在3秒后播放,所以我应该得到7的值)。这是我目前的职能: float MyAudioClass::GetPlaybackTime(UAudioComponent* AComponent, float &PlaybackTime) { if (AComponent) { FAudioDevice* AudioDevice =

我最近正在研究声音处理,但我遇到了一个大问题。 我想要实现的是获得播放时间(例如,到现在为止播放了多长时间的声音,我有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

我想象音响系统是在一个独立于游戏线程的线程中运行的。因此,当您进行调用时,您是在错误的线程中执行代码

如果在启动声音时,在同一个调用中执行
FindActiveSound
调用(假设未返回对FActiveSound的引用),并将其存储在MyAudioClass的变量中

然后,当您调用检索播放时间时,使用存储的对FActiveSound对象的引用来检索播放时间


正如格雷姆所说,您必须在音频线程中运行代码

以下是
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));
}