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); } }
/** Does the work to cache derived data. Safe to call from any thread. */ void DoWork() { TArray<uint8> RawDerivedData; bool bForceRebuild = (CacheFlags & EStreamedAudioCacheFlags::ForceRebuild) != 0; bool bInlineChunks = (CacheFlags & EStreamedAudioCacheFlags::InlineChunks) != 0; bool bForDDC = (CacheFlags & EStreamedAudioCacheFlags::ForDDCBuild) != 0; bool bAllowAsyncBuild = (CacheFlags & EStreamedAudioCacheFlags::AllowAsyncBuild) != 0; if (!bForceRebuild && GetDerivedDataCacheRef().GetSynchronous(*DerivedData->DerivedDataKey, RawDerivedData)) { FMemoryReader Ar(RawDerivedData, /*bIsPersistent=*/ true); DerivedData->Serialize(Ar, NULL); bSucceeded = true; if (bForDDC) { for (int32 Index = 0; Index < DerivedData->NumChunks; ++Index) { if (!DerivedData->TryLoadChunk(Index, NULL)) { bSucceeded = false; break; } } } else if (bInlineChunks) { bSucceeded = DerivedData->TryInlineChunkData(); } else { bSucceeded = DerivedData->AreDerivedChunksAvailable(); } } else if (bAllowAsyncBuild) { BuildStreamedAudio(); } }