#pragma once #include #include"AudioClip.h" #include"WavFileReader.h" #include"AudioConfig.h" #include"../global/Base.h" #include"../audio3d/FFTFilter.h" #include"../audio3d/Reberation.h" #include"../audio3d/HRTF.h" #pragma comment(lib,"winmm.lib") class AudioSource { public: AudioSource(); ~AudioSource(); void Play(); void Load(AudioClip* p_clip); void Update(double p_deltaTime); void StartEnergyDetect(); void CloseEnergyDetect(); float GetEnergy(); short* GetBufferData(); void PrepareBufferData(); void SetDirection(int p_elevation, int p_azimuth); bool IsActive() { return m_isActive; } private: void HRTFInitialize(); void ApplyFadeWindow(const std::vector& p_block_last, const std::vector& p_block_next, std::vector* p_fade_result); private: AudioClip* m_audioClip{nullptr}; WavFileReader* m_wavReader{ nullptr }; double m_lastingTime = 0; bool m_isActive = false; bool m_isLoaded = false; bool m_isEnergyDetecting = 0; long long m_avergeEnergy = 0; int m_avergeOldIndex = 0; long long m_thisEnergy = 0; float m_thisEnergyScale = 0; float m_maxEnergyScale = 5.; float m_energyRate = 0; std::deque m_historyEnergys{}; const static int m_bufferSize = AUDIO_BUFFER_SIZE; short m_buffer[m_bufferSize] = { 0 }; int m_sampleIndex = 0; int m_elevation = 0; int m_azimuth = 0; FFTFilter m_filter; Reberation m_reberation; HRTF m_hrtf; FFTFilter m_hrtf_filter_L; FFTFilter m_hrtf_filter_R; std::vector m_fade_window; };