void FStreamedAudioPlatformData::Cache(USoundWave& InSoundWave, FName AudioFormatName, uint32 InFlags) { // Flush any existing async task and ignore results. FinishCache(); uint32 Flags = InFlags; static bool bForDDC = FString(FCommandLine::Get()).Contains(TEXT("DerivedDataCache")); if (bForDDC) { Flags |= EStreamedAudioCacheFlags::ForDDCBuild; } bool bForceRebuild = (Flags & EStreamedAudioCacheFlags::ForceRebuild) != 0; bool bAsync = !bForDDC && (Flags & EStreamedAudioCacheFlags::Async) != 0; GetStreamedAudioDerivedDataKey(InSoundWave, AudioFormatName, DerivedDataKey); if (bAsync && !bForceRebuild) { AsyncTask = new FStreamedAudioAsyncCacheDerivedDataTask(this, &InSoundWave, AudioFormatName, Flags); AsyncTask->StartBackgroundTask(); } else { FStreamedAudioCacheDerivedDataWorker Worker(this, &InSoundWave, AudioFormatName, Flags); Worker.DoWork(); Worker.Finalize(); } }
void USoundWave::CachePlatformData(bool bAsyncCache) { FString DerivedDataKey; FName AudioFormat = GetWaveFormatForRunningPlatform(*this); GetStreamedAudioDerivedDataKey(*this, AudioFormat, DerivedDataKey); if (RunningPlatformData == NULL || RunningPlatformData->DerivedDataKey != DerivedDataKey) { if (RunningPlatformData == NULL) { RunningPlatformData = new FStreamedAudioPlatformData(); } RunningPlatformData->Cache(*this, AudioFormat, bAsyncCache ? EStreamedAudioCacheFlags::Async : EStreamedAudioCacheFlags::None); } }
void USoundWave::SerializeCookedPlatformData(FArchive& Ar) { if (IsTemplate()) { return; } DECLARE_SCOPE_CYCLE_COUNTER( TEXT("USoundWave::SerializeCookedPlatformData"), STAT_SoundWave_SerializeCookedPlatformData, STATGROUP_LoadTime ); #if WITH_EDITORONLY_DATA if (Ar.IsCooking() && Ar.IsPersistent()) { check(!Ar.CookingTarget()->IsServerOnly()); FName PlatformFormat = Ar.CookingTarget()->GetWaveFormat(this); FString DerivedDataKey; GetStreamedAudioDerivedDataKey(*this, PlatformFormat, DerivedDataKey); FStreamedAudioPlatformData *PlatformDataToSave = CookedPlatformData.FindRef(DerivedDataKey); if (PlatformDataToSave == NULL) { PlatformDataToSave = new FStreamedAudioPlatformData(); PlatformDataToSave->Cache(*this, PlatformFormat, EStreamedAudioCacheFlags::InlineChunks | EStreamedAudioCacheFlags::Async); CookedPlatformData.Add(DerivedDataKey, PlatformDataToSave); } PlatformDataToSave->FinishCache(); PlatformDataToSave->Serialize(Ar, this); } else #endif // #if WITH_EDITORONLY_DATA { check(!FPlatformProperties::IsServerOnly()); CleanupCachedRunningPlatformData(); check(RunningPlatformData == NULL); // Don't serialize streaming data on servers, even if this platform supports streaming in theory RunningPlatformData = new FStreamedAudioPlatformData(); RunningPlatformData->Serialize(Ar, this); } }
void USoundWave::FinishCachePlatformData() { if (RunningPlatformData == NULL) { // begin cache never called CachePlatformData(); } else { // make sure async requests are finished RunningPlatformData->FinishCache(); } #if DO_CHECK FString DerivedDataKey; FName AudioFormat = GetWaveFormatForRunningPlatform(*this); GetStreamedAudioDerivedDataKey(*this, AudioFormat, DerivedDataKey); check(RunningPlatformData->DerivedDataKey == DerivedDataKey); #endif }