Files
XCEngine/engine/include/XCEngine/Components/AudioSourceComponent.h

118 lines
3.4 KiB
C++

#pragma once
#include <XCEngine/Components/Component.h>
#include <XCEngine/Components/TransformComponent.h>
#include <XCEngine/Audio/AudioTypes.h>
#include <XCEngine/Resources/AudioClip.h>
#include <XCEngine/Math/Vector3.h>
#include <XCEngine/Math/Quaternion.h>
#include <vector>
#include <deque>
#include <string>
namespace XCEngine {
namespace Audio {
class AudioMixer;
}
namespace Components {
class AudioSourceComponent : public Component {
public:
AudioSourceComponent();
~AudioSourceComponent() override;
void Play();
void Pause();
void Stop(Audio::StopMode mode = Audio::StopMode::Immediate);
bool IsPlaying() const { return m_playState == Audio::PlayState::Playing; }
bool IsPaused() const { return m_playState == Audio::PlayState::Paused; }
void SetClip(Resources::AudioClip* clip);
Resources::AudioClip* GetClip() const { return m_clip; }
void SetVolume(float volume);
float GetVolume() const { return m_volume; }
void SetPitch(float pitch);
float GetPitch() const { return m_pitch; }
void SetPan(float pan);
float GetPan() const { return m_pan; }
void SetLooping(bool loop);
bool IsLooping() const { return m_isLooping; }
void SetSpatialize(bool spatialize);
bool IsSpatialize() const { return m_spatialize; }
void Set3DParams(const Audio::Audio3DParams& params);
const Audio::Audio3DParams& Get3DParams() const { return m_3DParams; }
void SetDopplerLevel(float level);
float GetDopplerLevel() const { return m_3DParams.dopplerLevel; }
void SetSpread(float spread);
float GetSpread() const { return m_3DParams.spread; }
void SetReverbZoneMix(float mix);
float GetReverbZoneMix() const { return m_3DParams.reverbZoneMix; }
void SetOutputMixer(Audio::AudioMixer* mixer);
Audio::AudioMixer* GetOutputMixer() const { return m_outputMixer; }
void SetTime(float seconds);
float GetTime() const;
float GetDuration() const;
float GetEnergy() const { return m_energy; }
void StartEnergyDetect();
void StopEnergyDetect();
bool IsEnergyDetecting() const { return m_isEnergyDetecting; }
void Update(float deltaTime) override;
void OnEnable() override;
void OnDisable() override;
void OnDestroy() override;
void ProcessAudio(float* buffer, Audio::uint32 sampleCount, Audio::uint32 channels,
const Math::Vector3& listenerPosition,
const Math::Quaternion& listenerRotation);
std::string GetName() const override { return "AudioSource"; }
private:
void Apply3DAttenuation(const Math::Vector3& listenerPosition);
void UpdateEnergy(const float* buffer, Audio::uint32 sampleCount);
private:
Resources::AudioClip* m_clip = nullptr;
Audio::AudioMixer* m_outputMixer = nullptr;
Audio::PlayState m_playState = Audio::PlayState::Stopped;
bool m_isLooping = false;
float m_volume = 1.0f;
float m_pitch = 1.0f;
float m_pan = 0.0f;
bool m_spatialize = true;
Audio::Audio3DParams m_3DParams;
Audio::uint64 m_samplePosition = 0;
double m_lastingTime = 0.0;
bool m_isEnergyDetecting = false;
float m_energy = 0.0f;
float m_maxEnergy = 5.0f;
std::deque<float> m_energyHistory;
static constexpr size_t BufferSize = 8192;
std::vector<float> m_outputBuffer;
std::vector<float> m_decodedData;
bool m_isDecoded = false;
};
} // namespace Components
} // namespace XCEngine