Files
XCEngine/MVS/Music fluctuations/source/audio/AudioEngine.h

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; //可用音频设备
};