void FAudioStreamingManager::RemoveStreamingSoundSource(FSoundSource* SoundSource) { const FWaveInstance* WaveInstance = SoundSource->GetWaveInstance(); if (WaveInstance && WaveInstance->WaveData && WaveInstance->WaveData->IsStreaming()) { // Make sure there is a request so that unused chunks // can be cleared if this was the last playing instance GetWaveRequest(WaveInstance->WaveData); StreamingSoundSources.Remove(SoundSource); } }
void FAudioStreamingManager::UpdateResourceStreaming(float DeltaTime, bool bProcessEverything /*= false*/) { for (auto& WavePair : StreamingSoundWaves) { WavePair.Value.UpdateStreamingStatus(); } for (auto Source : StreamingSoundSources) { const FWaveInstance* WaveInstance = Source->GetWaveInstance(); USoundWave* Wave = WaveInstance ? WaveInstance->WaveData : nullptr; if (Wave) { FStreamingWaveData* WaveData = StreamingSoundWaves.Find(Wave); if (WaveData && WaveData->PendingChunkChangeRequestStatus.GetValue() == AudioState_ReadyFor_Requests) { // Request the chunk the source is using and the one after that FWaveRequest& WaveRequest = GetWaveRequest(Wave); int32 SourceChunk = Source->GetBuffer()->GetCurrentChunkIndex(); if (SourceChunk >= 0 && SourceChunk < Wave->RunningPlatformData->NumChunks) { WaveRequest.RequiredIndices.AddUnique(SourceChunk); WaveRequest.RequiredIndices.AddUnique((SourceChunk+1)%Wave->RunningPlatformData->NumChunks); if (!WaveData->LoadedChunkIndices.Contains(SourceChunk) || Source->GetBuffer()->GetCurrentChunkOffset() > Wave->RunningPlatformData->Chunks[SourceChunk].DataSize / 2) { // currently not loaded or already read over half, request is high priority WaveRequest.bPrioritiseRequest = true; } } } } } for (auto WaveRequest : WaveRequests) { USoundWave* Wave = WaveRequest.Key; FStreamingWaveData* WaveData = StreamingSoundWaves.Find(Wave); if (WaveData && WaveData->PendingChunkChangeRequestStatus.GetValue() == AudioState_ReadyFor_Requests) { WaveData->UpdateChunkRequests(WaveRequest.Value); WaveData->UpdateStreamingStatus(); WaveRequests.Remove(Wave); } } }