#pragma once #include #include #include #include #include #include"AudioSource.h" #include"AudioConfig.h" #pragma comment(lib, "winmm.lib") class AudioEngine { public: AudioEngine(); ~AudioEngine(); void Update(double p_deltaTime); void InitAudioEngine(); void ExitAudioEngine(); void SubmitSource(AudioSource* p_audioSource); private: MMRESULT InitAudioThread(); void InitWavFormat(); MMRESULT InitDevice(); MMRESULT InitWavHeader(); MMRESULT PlayFrontData(); void PrepareBackData(); void SwapBuffer(); void OnAudioCallback(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2); static void CALLBACK StaticAudioCallback(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2); private: bool m_isRunning = false; //音频引擎是否开启 std::thread m_audioThread; //音频数据处理线程 AudioSource* m_audioSource{ nullptr }; //TODO::每次play的时候都得增加一个 short m_audioBuffer1[AUDIO_BUFFER_SIZE] = { 0 }; //音频缓冲区1 short m_audioBuffer2[AUDIO_BUFFER_SIZE] = { 0 }; //音频缓冲区2 bool m_isBuffer1Front = true; //标记哪个缓冲区为front bool m_isFBufferUsing = false; //FBuffer-Front Buffer bool m_isBBufferPrepared = false; //BBuffer-Back Buffer HWAVEOUT m_hWaveOut; //正在使用的音频设备 WAVEFORMATEX m_waveFormat; WAVEHDR m_waveHeader1; WAVEHDR m_waveHeader2; std::vector m_waveOutCaps; //可用音频设备 };