113 lines
2.7 KiB
C++
113 lines
2.7 KiB
C++
#include "AudioSystem.h"
|
|
|
|
#include "Engine.h"
|
|
#include "src/Scene/Scene.h"
|
|
#include "src/Scene/Entities/Entity.h"
|
|
#include "src/Scene/Components/AudioEmitterComponent.h"
|
|
|
|
#include "src/Audio/AudioManager.h"
|
|
|
|
#include <future>
|
|
|
|
|
|
namespace Nuake
|
|
{
|
|
AudioSystem::AudioSystem(Scene* scene)
|
|
{
|
|
m_Scene = scene;
|
|
}
|
|
|
|
bool AudioSystem::Init()
|
|
{
|
|
AudioManager::Get().StopAll();
|
|
|
|
return true;
|
|
}
|
|
|
|
void AudioSystem::Update(Timestep ts)
|
|
{
|
|
auto& audioManager = AudioManager::Get();
|
|
|
|
// Update 3D listener of the audio system
|
|
auto currentCamera = m_Scene->GetCurrentCamera();
|
|
|
|
Vector3 direction = currentCamera->GetDirection();
|
|
if (Engine::IsPlayMode())
|
|
{
|
|
direction *= -1.0f;
|
|
}
|
|
|
|
audioManager.SetListenerPosition(currentCamera->GetTranslation(), std::move(direction), currentCamera->GetUp());
|
|
|
|
auto view = m_Scene->m_Registry.view<TransformComponent, AudioEmitterComponent>();
|
|
for (auto& e : view)
|
|
{
|
|
auto [transformComponent, audioEmitterComponent] = view.get<TransformComponent, AudioEmitterComponent>(e);
|
|
|
|
if (audioEmitterComponent.FilePath.empty())
|
|
{
|
|
// Doesn't have a file
|
|
continue;
|
|
}
|
|
|
|
const bool isPlaying = audioEmitterComponent.IsPlaying;
|
|
const std::string absoluteFilePath = FileSystem::RelativeToAbsolute(audioEmitterComponent.FilePath);
|
|
const bool isVoiceActive = audioManager.IsVoiceActive(absoluteFilePath);
|
|
|
|
AudioRequest audioRequest;
|
|
audioRequest.audioFile = absoluteFilePath;
|
|
audioRequest.pan = audioEmitterComponent.Pan;
|
|
audioRequest.volume = audioEmitterComponent.Volume;
|
|
audioRequest.speed = audioEmitterComponent.PlaybackSpeed;
|
|
audioRequest.spatialized = audioEmitterComponent.Spatialized;
|
|
audioRequest.Loop = audioEmitterComponent.Loop;
|
|
audioRequest.position = transformComponent.GetGlobalTransform()[3];
|
|
audioRequest.MinDistance = audioEmitterComponent.MinDistance;
|
|
audioRequest.MaxDistance = audioEmitterComponent.MaxDistance;
|
|
audioRequest.AttenuationFactor = audioEmitterComponent.AttenuationFactor;
|
|
|
|
if (isVoiceActive)
|
|
{
|
|
if (!isPlaying && audioEmitterComponent.Loop)
|
|
{
|
|
audioManager.StopVoice(absoluteFilePath); // Stop audio
|
|
}
|
|
else
|
|
{
|
|
// Update the active voice with new params
|
|
audioManager.UpdateVoice(audioRequest);
|
|
}
|
|
}
|
|
|
|
if (isPlaying)
|
|
{
|
|
// Reset the play status to false since the audio has been fired
|
|
if (!audioEmitterComponent.Loop)
|
|
{
|
|
audioManager.QueueWavAudio(std::move(audioRequest));
|
|
audioEmitterComponent.IsPlaying = false;
|
|
}
|
|
else if (!isVoiceActive)
|
|
{
|
|
audioManager.QueueWavAudio(std::move(audioRequest));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void AudioSystem::FixedUpdate(Timestep ts)
|
|
{
|
|
|
|
}
|
|
|
|
void AudioSystem::EditorUpdate()
|
|
{
|
|
|
|
}
|
|
|
|
void AudioSystem::Exit()
|
|
{
|
|
AudioManager::Get().StopAll();
|
|
}
|
|
}
|