CMAudio/inc/hgl/audio/AudioPlayer.h

164 lines
7.4 KiB
C
Raw Normal View History

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>
#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;
enum class PlayState //播放器状态
{
None=0,
Play,
Pause,
Exit
};
2020-06-18 03:38:48 +08:00
/**
* 使AudioPlayer创建的音频播放器类
* 使线线
*/
class AudioPlayer:public Thread ///音频播放器基类
{
ThreadMutex lock;
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
ALenum format; ///<音频数据格式
ALsizei rate; ///<音频数据采样率
struct
2020-06-18 03:38:48 +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
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: //属性
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
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
void SetGain(float val){audiosource.SetGain(val);} ///<设置音量增益
void SetConeGain(float val){audiosource.SetConeGain(val);} ///<设置音量锥形增益
2020-06-18 03:38:48 +08:00
float GetPitch()const{return audiosource.pitch;} ///<获取播放频率
void SetPitch(float val){audiosource.SetPitch(val);} ///<设置播放频率
2020-06-18 03:38:48 +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);
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); ///<从流中加载一个音频文件
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); ///<设置淡入淡出时间
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