47 lines
1.5 KiB
C++
47 lines
1.5 KiB
C++
#pragma once
|
|
#include <iostream>
|
|
#include <Windows.h>
|
|
#include <mmsystem.h>
|
|
#include <thread>
|
|
#include <chrono>
|
|
#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<WAVEOUTCAPS> m_waveOutCaps; //可用音频设备
|
|
}; |