我想从PlaybackTime
课程获得FActiveSound
。但是我总是得到这个错误:
Assertion failed: IsInAudioThread()
我称之为:
FActiveSound* ActiveSound = AudioDevice->FindActiveSound(AudioComponent->GetAudioComponentID());
我的问题是为什么?这可能是一个愚蠢的问题,但我不能让它自己工作。
编辑:1
我正在做的是这样的:
Binding delegate : AudioComponent->OnAudioPlaybackPercent.AddDynamic(this, &UAudioController::GimmePlaybackPosition);
然后我的功能看起来像这样:
void UAudioController::GimmePlaybackPosition(const USoundWave* SoundWave, float PlaybackPercent)
{
FAudioDevice* AudioDevice = GEngine->GetAudioDevice();
if (AudioDevice)
{
FActiveSound* ActiveSound;
}
//GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Red, TEXT("Delegate fire"));
}
现在我想知道,我怎样才能到达我的AudioComponent,获得PlaybackTime; /
答案 0 :(得分:1)
您必须通过AudioDevice
运行访问音频线程中FAudioThread::RunCommandOnAudioThread
的代码。
以下是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));
}
答案 1 :(得分:0)
错误通常意味着您尝试从错误的线程访问AudioDevice
。也许,您应该发布您的代码以获得更好的答案。