2020-06-18 03:38:48 +08:00
|
|
|
|
#ifndef HGL_AUDIO_PLAYER_INCLUDE
|
|
|
|
|
#define HGL_AUDIO_PLAYER_INCLUDE
|
|
|
|
|
|
|
|
|
|
// #include<hgl/HAC.H>
|
|
|
|
|
#include<hgl/thread/Thread.h>
|
|
|
|
|
#include<hgl/thread/ThreadMutex.h>
|
|
|
|
|
#include<hgl/audio/OpenAL.h>
|
|
|
|
|
#include<hgl/audio/AudioSource.h>
|
2022-03-31 18:16:36 +08:00
|
|
|
|
#include<hgl/math/Math.h>
|
2020-06-18 03:38:48 +08:00
|
|
|
|
using namespace openal;
|
|
|
|
|
namespace hgl
|
|
|
|
|
{
|
|
|
|
|
namespace io
|
|
|
|
|
{
|
|
|
|
|
class InputStream;
|
|
|
|
|
}//namespace io
|
|
|
|
|
|
|
|
|
|
struct AudioPlugInInterface;
|
|
|
|
|
|
2022-03-31 18:16:36 +08:00
|
|
|
|
enum class PlayState //播放器状态
|
|
|
|
|
{
|
|
|
|
|
None=0,
|
|
|
|
|
Play,
|
|
|
|
|
Pause,
|
|
|
|
|
Exit
|
|
|
|
|
};
|
|
|
|
|
|
2020-06-18 03:38:48 +08:00
|
|
|
|
/**
|
|
|
|
|
* 使用AudioPlayer创建的音频播放器类,一般用于背景音乐等独占的音频处理。
|
|
|
|
|
* 这个音频播放器将使用一个单独的线程,在播放器被删除时线程也会被关闭。
|
|
|
|
|
*/
|
|
|
|
|
class AudioPlayer:public Thread ///音频播放器基类
|
|
|
|
|
{
|
|
|
|
|
ThreadMutex lock;
|
|
|
|
|
|
2022-03-31 18:16:36 +08:00
|
|
|
|
protected:
|
|
|
|
|
|
|
|
|
|
ALbyte *audio_data;
|
|
|
|
|
int audio_data_size;
|
|
|
|
|
|
|
|
|
|
void *audio_ptr; ///<音频数据指针
|
|
|
|
|
|
|
|
|
|
char *audio_buffer;
|
|
|
|
|
int audio_buffer_size;
|
|
|
|
|
uint audio_buffer_count; ///<播放数据计数
|
|
|
|
|
|
|
|
|
|
AudioPlugInInterface *decode;
|
2020-06-18 03:38:48 +08:00
|
|
|
|
|
2022-03-31 18:16:36 +08:00
|
|
|
|
ALenum format; ///<音频数据格式
|
|
|
|
|
ALsizei rate; ///<音频数据采样率
|
|
|
|
|
|
|
|
|
|
struct
|
2020-06-18 03:38:48 +08:00
|
|
|
|
{
|
2022-03-31 18:16:36 +08:00
|
|
|
|
bool open;
|
|
|
|
|
uint64 time;
|
|
|
|
|
float gap;
|
|
|
|
|
|
|
|
|
|
struct
|
|
|
|
|
{
|
|
|
|
|
float gain;
|
|
|
|
|
double time;
|
|
|
|
|
}start,end;
|
|
|
|
|
}auto_gain; ///<自动增益
|
|
|
|
|
|
|
|
|
|
bool ReadData(ALuint);
|
|
|
|
|
bool UpdateBuffer();
|
|
|
|
|
void ClearBuffer();
|
|
|
|
|
|
|
|
|
|
bool Playback();
|
|
|
|
|
|
|
|
|
|
bool IsExitDelete()const override{return false;}
|
|
|
|
|
bool Execute() override;
|
2020-06-18 03:38:48 +08:00
|
|
|
|
|
2022-03-31 18:16:36 +08:00
|
|
|
|
void InitPrivate();
|
|
|
|
|
bool Load(AudioFileType);
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
|
|
|
|
volatile bool loop;
|
|
|
|
|
volatile PlayState ps;
|
|
|
|
|
|
|
|
|
|
AudioSource audiosource;
|
|
|
|
|
ALuint source;
|
|
|
|
|
ALuint buffer[3];
|
|
|
|
|
double total_time;
|
|
|
|
|
double wait_time;
|
|
|
|
|
|
|
|
|
|
double gain;
|
|
|
|
|
|
|
|
|
|
double start_time;
|
|
|
|
|
|
|
|
|
|
double fade_in_time;
|
|
|
|
|
double fade_out_time;
|
2020-06-18 03:38:48 +08:00
|
|
|
|
|
|
|
|
|
public: //属性
|
|
|
|
|
|
2022-03-31 18:16:36 +08:00
|
|
|
|
uint GetIndex()const{return audiosource.index;} ///<获取音源索引
|
|
|
|
|
|
|
|
|
|
double GetTotalTime()const{return total_time;} ///<获取音频总时长
|
|
|
|
|
|
|
|
|
|
PlayState GetPlayState()const{return ps;} ///<获取播放器状态
|
|
|
|
|
|
|
|
|
|
int GetSourceState()const{return audiosource.GetState();} ///<获取音源索引
|
|
|
|
|
|
|
|
|
|
bool IsLoop(); ///<是否循环播放
|
|
|
|
|
void SetLoop(bool); ///<设置循环播放
|
2020-06-18 03:38:48 +08:00
|
|
|
|
|
2022-03-31 18:16:36 +08:00
|
|
|
|
float GetGain()const{return audiosource.gain;} ///<获取音量增益
|
|
|
|
|
float GetMinGain()const{return audiosource.GetMinGain();} ///<获取音量最小增益
|
|
|
|
|
float GetMaxGain()const{return audiosource.GetMaxGain();} ///<获取音量最大增益
|
|
|
|
|
float GetConeGain()const{return audiosource.cone_gain;} ///<获取音量锥形增益
|
2020-06-18 03:38:48 +08:00
|
|
|
|
|
2022-03-31 18:16:36 +08:00
|
|
|
|
void SetGain(float val){audiosource.SetGain(val);} ///<设置音量增益
|
|
|
|
|
void SetConeGain(float val){audiosource.SetConeGain(val);} ///<设置音量锥形增益
|
2020-06-18 03:38:48 +08:00
|
|
|
|
|
2022-03-31 18:16:36 +08:00
|
|
|
|
float GetPitch()const{return audiosource.pitch;} ///<获取播放频率
|
|
|
|
|
void SetPitch(float val){audiosource.SetPitch(val);} ///<设置播放频率
|
2020-06-18 03:38:48 +08:00
|
|
|
|
|
2022-03-31 18:16:36 +08:00
|
|
|
|
float GetRolloffFactor()const{return audiosource.rolloff_factor;} ///<获取Rolloff因子
|
|
|
|
|
void SetRolloffFactor(float f){audiosource.SetRolloffFactor(f);} ///<设置Rolloff因子
|
2020-06-18 03:38:48 +08:00
|
|
|
|
|
|
|
|
|
public: //属性方法
|
|
|
|
|
|
|
|
|
|
const Vector3f & GetPosition(){return audiosource.position;} const
|
|
|
|
|
void SetPosition(const Vector3f &pos){audiosource.SetPosition(pos);}
|
|
|
|
|
|
|
|
|
|
const Vector3f & GetVelocity(){return audiosource.velocity;} const
|
|
|
|
|
void SetVelocity(const Vector3f &vel){audiosource.SetVelocity(vel);}
|
|
|
|
|
|
|
|
|
|
const Vector3f & GetDirection(){return audiosource.direction;} const
|
|
|
|
|
void SetDirection(const Vector3f &dir){audiosource.SetDirection(dir);}
|
|
|
|
|
|
|
|
|
|
const void GetDistance(float &ref_distance, float &max_distance)const{audiosource.GetDistance(ref_distance,max_distance);} const
|
|
|
|
|
void SetDistance(const float &ref_distance,const float &max_distance){audiosource.SetDistance(ref_distance,max_distance);}
|
|
|
|
|
|
|
|
|
|
const ConeAngle & GetConeAngle(){return audiosource.angle;} const
|
|
|
|
|
void SetConeAngle(const ConeAngle &ca){audiosource.SetConeAngle(ca);}
|
|
|
|
|
|
|
|
|
|
public: //方法
|
|
|
|
|
|
|
|
|
|
AudioPlayer();
|
|
|
|
|
AudioPlayer(io::InputStream *,int,AudioFileType);
|
2022-03-31 18:16:36 +08:00
|
|
|
|
AudioPlayer(const os_char *,AudioFileType=AudioFileType::None);
|
|
|
|
|
// AudioPlayer(HAC *,const os_char *,AudioFileType=AudioFileType::None);
|
2020-06-18 03:38:48 +08:00
|
|
|
|
virtual ~AudioPlayer();
|
|
|
|
|
|
|
|
|
|
virtual bool Load(io::InputStream *,int,AudioFileType); ///<从流中加载一个音频文件
|
2022-03-31 18:16:36 +08:00
|
|
|
|
virtual bool Load(const os_char *,AudioFileType=AudioFileType::None); ///<加载一个音频文件
|
|
|
|
|
// virtual bool Load(HAC *,const os_char *,AudioFileType=AudioFileType::None); ///<从HAC包中加载一个音频文件
|
2020-06-18 03:38:48 +08:00
|
|
|
|
|
|
|
|
|
virtual void Play(bool=true); ///<播放音频
|
|
|
|
|
virtual void Stop(); ///<停止播放
|
|
|
|
|
virtual void Pause(); ///<暂停播放
|
|
|
|
|
virtual void Resume(); ///<继续播放
|
|
|
|
|
virtual void Clear(); ///<清除音频数据
|
|
|
|
|
|
|
|
|
|
virtual double GetPlayTime(); ///<取得已播放时间(单位秒)
|
|
|
|
|
virtual void SetFadeTime(double,double); ///<设置淡入淡出时间
|
|
|
|
|
|
2022-03-31 18:16:36 +08:00
|
|
|
|
virtual void AutoGain(float,double,const double cur_time); ///<自动音量
|
2020-06-18 03:38:48 +08:00
|
|
|
|
};//class AudioPlayer
|
|
|
|
|
}//namespace hgl
|
|
|
|
|
#endif//HGL_AUDIO_PLAYER_INCLUDE
|