2017-05-05 84 views
0

我正在從事Sound Handling的工作,但我遇到了很大的問題。 我想要達到的是獲得播放時間(聲音播放到現在的時間,例如我有10秒的聲音,3秒後我會播放,所以我應該得到7的值)。這是我目前的功能:UE4在C++中的播放時間

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

回答

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)); 
} 
0

我想象聲音系統是在一個單獨的線程中玩遊戲線程。所以當你打電話時,你是在錯誤的線程中執行代碼。

如果當你開始聲音,在同一個調用中你執行FindActiveSound調用(假設你沒有得到對返回的FActiveSound的引用),並將它存儲在MyAudioClass的變量中。

然後,當您撥打電話以檢索播放時間時,使用此存儲的對FActiveSound對象的引用來檢索播放時間。

HTH

相關問題