2017-05-05 42 views
0

最近、サウンドハンドリングに取り組んでいますが、大きな問題が発生しました。 私が達成したいのは、再生時間を得ることです(例えば、今までに再生された音の長さ、例えば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

HTH。ここで

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オブジェクトに使用して、再生時間を取得します。

グレアムが言ったように、あなたがオーディオのスレッドでコードを実行する必要が

関連する問題