Files
LayaNative2.0/Conch/source/common/resource/Audio/JCAudioWavPlayer.h
T
2020-11-11 16:17:13 +08:00

144 lines
3.3 KiB
C++

/**
@file JCAudioWavPlayer.h
@brief
@author James
@version 1.0
@date 2014_4_22
*/
#ifndef __JCAudioWavPlayer_H__
#define __JCAudioWavPlayer_H__
//包含头文件
#ifdef WIN32
#include <xaudio2.h>
#include <al.h>
#include <alc.h>
#elif __APPLE__
#include <OpenAL/al.h>
#include <OpenAl/alc.h>
#elif ANDROID
#include <AL/al.h>
#include <AL/alc.h>
#endif
#include <stdio.h>
#include <thread>
#include "../../util/JCCommonMethod.h"
#include "JCWaveInfo.h"
#include "JCAudioInterface.h"
#include<unordered_map>
#include <vector>
namespace laya
{
class JCFileResManager;
#define OPENAL_SOURCE_NUM 10
struct OpenALSourceInfo
{
ALuint m_nOpenALSouceID; //OpenAl的ID
ALuint m_nBufferID; //bufferID
ALfloat m_vSourcePos[3]; //源声音的位置
ALfloat m_vSourceVel[3]; //源声音的速度
bool m_bPlaying; //是否为播放状态
JCAudioInterface* m_pAudio; //Audio 为了回调使用
void operator=(const OpenALSourceInfo& other)
{
m_nOpenALSouceID = other.m_nOpenALSouceID;
m_nBufferID = other.m_nBufferID;
m_bPlaying = other.m_bPlaying;
m_pAudio = other.m_pAudio;
for (int i = 0; i < 3; i++)
{
m_vSourcePos[i] = other.m_vSourcePos[i];
m_vSourceVel[i] = other.m_vSourceVel[i];
}
}
};
class JCAudioWavPlayer
{
public:
typedef std::unordered_map<std::string,JCWaveInfo*> MapWaveInfo;
typedef MapWaveInfo::iterator MapWaveInfoIter;
public:
JCAudioWavPlayer(JCFileResManager* pFileResManager);
~JCAudioWavPlayer();
void Release();
public:
OpenALSourceInfo* playAudio( JCAudioInterface* p_pAudio,const std::string& p_sSrc,bool bIsOgg );
void delAudio(JCAudioInterface* p_pAudio);
OpenALSourceInfo* playAudioFromBuffer( JCAudioInterface* p_pAudio,const char* p_pBuffer,unsigned int p_nBufferSize,int p_nRate, int p_nBitsPerSample, int nChannels);
void setVolume(OpenALSourceInfo* pOpenALInfo,float p_nVolume );
void stop(OpenALSourceInfo* pOpenALInfo);
void setAllVolume(float p_nVolume);
void stopAll();
void checkWavePlayEnd();
void pause();
void resume();
public:
/** @brief 添加资源
* @return
*/
JCWaveInfo* AddWaveInfo( const std::string& p_sUrl,unsigned char* p_pBuffer,int p_nSize,const char* p_sFilePath,void* p_pExternalMark,bool p_bIsOgg );
/** @brief 查找资源根据 ulid
* @param[in] ulID
* @return
*/
JCWaveInfo* FindWaveInfo( const std::string& p_sUrl );
/** @brief 清空所有
*/
bool ClearAllWaveInfo( void );
void autoGarbageCollection();
private:
void releaseOpenAL( OpenALSourceInfo* pOpenALInfo );
void createOpenALSource();
OpenALSourceInfo* getOpenALSource();
public:
static int s_nGarbageCollectionTime;
MapWaveInfo m_vWaveInfos; //wave的信息
public:
JCFileResManager* m_pFileResManager;
ALCdevice* m_pDevice; // 打开默认音频设备
ALCcontext* m_pContext; // context
std::vector<OpenALSourceInfo*> m_pOpenALSource; // 播放声音用的
int m_nCurrentIndex; // 记录上次的位置
bool m_bStop;
};
}
#endif //__JCAudioWavPlayer_H__
//-----------------------------END FILE--------------------------------