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);
		}
	}
}