2017-05-05 4 views
0

Ich arbeite in letzter Zeit an Sound Handling, aber ich habe großes Problem festgestellt. Was ich erreichen möchte, ist die Wiedergabezeit (wie lange der Sound bisher gespielt wurde, zum Beispiel habe ich 10 Sekunden Sound und ich füge ihn nach 3 Sekunden ein, also sollte ich den Wert 7 zurück bekommen). Dies ist meine aktuelle Funktion:UE4 Wiedergabezeit in 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; 
} 

Allerdings, wenn ich versuche es, ganzer Motor Abstürze zu verwenden und ich empfange diesen Fehler:

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

Fehlerlinien sind in dieser Reihenfolge:

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

Was mache ich hier falsch? Wenn mir jemand hilft, würde ich das sehr schätzen: 3

Antwort

0

Als Graeme sagte, Sie den Code in dem Audio-Thread ausgeführt hat.

Hier ist ein Ausschnitt in AudioComponent.cpp verwendet:

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

Ich stelle mir vor, das Soundsystem spielt in einem eigenen Thread zum Game Thread. Wenn Sie also den Anruf tätigen, führen Sie den Code im falschen Thread aus.

Wenn Sie den Sound starten, führen Sie im selben Call den Aufruf FindActiveSound aus (vorausgesetzt, Sie erhalten keinen Verweis auf FActiveSound zurück), und speichern Sie diesen in einer Variablen Ihrer MyAudioClass.

Verwenden Sie dann diese gespeicherte Referenz auf das FActiveSound-Objekt, um die Wiedergabezeit abzurufen, wenn Sie Ihren Anruf tätigen, um die Wiedergabezeit abzurufen.

HTH

Verwandte Themen