// Fill out your copyright notice in the Description page of Project Settings.


#include "SurvivalAudioSettings.h"

#include "Sound/SoundClass.h"

FName USurvivalAudioSettings::GetCategoryName() const
{
	return TEXT("Game");
}

USurvivalAudioSettings* USurvivalAudioSettings::Get()
{
	// GetMutableDefault et non GetDefault : les champs Cached* sont remplis a la
	// demande, donc les accesseurs ne peuvent pas etre const. Ce ne sont ni des
	// UPROPERTY ni des donnees serialisees -- muter un CDO n'est un probleme que
	// pour ce qui part sur le disque.
	return GetMutableDefault<USurvivalAudioSettings>();
}

USoundClass* USurvivalAudioSettings::Resolve(const TSoftObjectPtr<USoundClass>& Asset, TStrongObjectPtr<USoundClass>& Cache)
{
	if (Cache.IsValid())
	{
		return Cache.Get();
	}

	if (Asset.IsNull())
	{
		return nullptr;
	}

	// Synchrone assume : une SoundClass est un objet minuscule, et le chargement
	// n'a lieu qu'une fois par lancement.
	//
	// Reset et pas une affectation : c'est ce Reset qui pose l'ancre GC, et la
	// raison pour laquelle ces caches ne sont pas des UPROPERTY (voir le header).
	Cache.Reset(Asset.LoadSynchronous());
	return Cache.Get();
}

USoundClass* USurvivalAudioSettings::GetMasterSoundClass()
{
	return Resolve(MasterSoundClass, CachedMasterSoundClass);
}

USoundClass* USurvivalAudioSettings::GetMusicSoundClass()
{
	return Resolve(MusicSoundClass, CachedMusicSoundClass);
}

USoundClass* USurvivalAudioSettings::GetEffectsSoundClass()
{
	return Resolve(EffectsSoundClass, CachedEffectsSoundClass);
}

USoundClass* USurvivalAudioSettings::GetUiSoundClass()
{
	return Resolve(UiSoundClass, CachedUiSoundClass);
}
