118 lines
3.4 KiB
C++
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
|