updated codes to today CMCore/CMPlatform

This commit is contained in:
hyzboy 2022-03-31 18:16:36 +08:00
parent 01b01a2343
commit ff8ae8ba02
18 changed files with 316 additions and 377 deletions

View File

@ -3,7 +3,7 @@
#include<hgl/io/InputStream.h>
// #include<hgl/HAC.H>
#include<hgl/type/ObjectBuffer.h>
//#include<hgl/type/ObjectBuffer.h>
#include<hgl/audio/AudioFileType.h>
namespace hgl
@ -30,7 +30,7 @@ namespace hgl
AudioBuffer(void *,int,AudioFileType); ///<本类构造函数
AudioBuffer(InputStream *,int,AudioFileType); ///<本类构造函数
AudioBuffer(const os_char *filename=0,AudioFileType=aftNone); ///<本类构造函数
AudioBuffer(const os_char *filename=0,AudioFileType=AudioFileType::None); ///<本类构造函数
// AudioBuffer(HAC *,const os_char *,AudioFileType=aftNone); ///<本类构造函数
virtual ~AudioBuffer(); ///<本类析构函数
@ -38,7 +38,7 @@ namespace hgl
bool Load(void *,int,AudioFileType); ///<从内存中加载音频数据
bool Load(InputStream *,int,AudioFileType); ///<从流中加载音频数据
bool Load(const os_char *,AudioFileType=aftNone); ///<从文件中加载音频数据
bool Load(const os_char *,AudioFileType=AudioFileType::None); ///<从文件中加载音频数据
// bool Load(HAC *,const os_char *,AudioFileType=aftNone); ///<从HAC包的文件中加载音频数据
void Clear(); ///<清除数据

View File

@ -2,20 +2,21 @@
#define HGL_AUDIO_FILE_TYPE_INCLUDE
#include<hgl/platform/Platform.h>
#include<hgl/TypeFunc.h>
namespace hgl
{
/**
*
*/
enum AudioFileType
enum class AudioFileType
{
aftNone=0, ///<起始定义,如使用表示自动根据扩展名识别
None=0, ///<起始定义,如使用表示自动根据扩展名识别
aftWAV, ///<Wav音波文件
aftVorbis, ///<Vorbis OGG文件
aftOpus, ///<Opus OGG文件
Wav, ///<Wav音波文件
Vorbis, ///<Vorbis OGG文件
Opus, ///<Opus OGG文件
aftEnd
ENUM_CLASS_RANGE(Wav,Opus)
};//enum AudioFileType
AudioFileType CheckAudioExtName(const os_char *ext_name);

View File

@ -1,82 +0,0 @@
protected:
ALbyte *audio_data;
int audio_data_size;
void *audio_ptr; ///<音频数据指针
char *audio_buffer;
int audio_buffer_size;
uint audio_buffer_count; ///<播放数据计数
AudioPlugInInterface *decode;
ALenum format; ///<音频数据格式
ALsizei rate; ///<音频数据采样率
struct
{
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;
void InitPrivate();
bool Load(AudioFileType);
protected:
volatile bool loop;
volatile PlayState ps;
AudioSource audiosource;
ALuint source;
ALuint buffer[3];
double time;
double wait_time;
double gain;
double start_time;
double fade_in_time;
double fade_out_time;
bool GetLoop();
void SetLoop(bool);
public:
uint GetIndex(){return audiosource.index;}
double GetTime(){return time;}
PlayState GetPlayState(){return ps;}
int GetSourceState(){return audiosource.GetState();}
float GetMinGain(){return audiosource.GetMinGain();}
float GetMaxGain(){return audiosource.GetMaxGain();}
float GetPitch(){return audiosource.pitch;}
void SetPitch(float val){audiosource.SetPitch(val);}
float GetGain(){return audiosource.gain;}
void SetGain(float val){audiosource.SetGain(val);}
float GetConeGain(){return audiosource.cone_gain;}
void SetConeGain(float val){audiosource.SetConeGain(val);}
float GetRolloffFactor(){return audiosource.rolloff_factor;}
void SetRolloffFactor(float rf){audiosource.SetRolloffFactor(rf);}

View File

@ -6,7 +6,7 @@
#include<hgl/thread/ThreadMutex.h>
#include<hgl/audio/OpenAL.h>
#include<hgl/audio/AudioSource.h>
#include<hgl/algorithm/VectorMath.h>
#include<hgl/math/Math.h>
using namespace openal;
namespace hgl
{
@ -17,6 +17,14 @@ namespace hgl
struct AudioPlugInInterface;
enum class PlayState //播放器状态
{
None=0,
Play,
Pause,
Exit
};
/**
* 使AudioPlayer创建的音频播放器类
* 使线线
@ -25,35 +33,91 @@ namespace hgl
{
ThreadMutex lock;
public:
protected:
enum PlayState //播放器状态
ALbyte *audio_data;
int audio_data_size;
void *audio_ptr; ///<音频数据指针
char *audio_buffer;
int audio_buffer_size;
uint audio_buffer_count; ///<播放数据计数
AudioPlugInInterface *decode;
ALenum format; ///<音频数据格式
ALsizei rate; ///<音频数据采样率
struct
{
psNone=0,
psPlay,
psPause,
psExit
};
bool open;
uint64 time;
float gap;
#include<hgl/audio/AudioPlayer.Attrib.h>
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;
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;
public: //属性
Property<uint> Index; ///<音源索引
Property<double> Time; ///<音频总时间
uint GetIndex()const{return audiosource.index;} ///<获取音源索引
Property<PlayState> State; ///<播放器状态
Property<int> SourceState; ///<音源状态
Property<float> MinGain; ///<最小增益
Property<float> MaxGain; ///<最大增益
double GetTotalTime()const{return total_time;} ///<获取音频总时长
Property<bool> Loop; ///<是否循环播放虚拟变量
PlayState GetPlayState()const{return ps;} ///<获取播放器状态
Property<float> Pitch; ///<播放频率
Property<float> Gain; ///<音量增益幅度
Property<float> ConeGain; ///<
int GetSourceState()const{return audiosource.GetState();} ///<获取音源索引
Property<float> RolloffFactor; ///<
bool IsLoop(); ///<是否循环播放
void SetLoop(bool); ///<设置循环播放
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;} ///<获取音量锥形增益
void SetGain(float val){audiosource.SetGain(val);} ///<设置音量增益
void SetConeGain(float val){audiosource.SetConeGain(val);} ///<设置音量锥形增益
float GetPitch()const{return audiosource.pitch;} ///<获取播放频率
void SetPitch(float val){audiosource.SetPitch(val);} ///<设置播放频率
float GetRolloffFactor()const{return audiosource.rolloff_factor;} ///<获取Rolloff因子
void SetRolloffFactor(float f){audiosource.SetRolloffFactor(f);} ///<设置Rolloff因子
public: //属性方法
@ -76,13 +140,13 @@ namespace hgl
AudioPlayer();
AudioPlayer(io::InputStream *,int,AudioFileType);
AudioPlayer(const os_char *,AudioFileType=aftNone);
// AudioPlayer(HAC *,const os_char *,AudioFileType=aftNone);
AudioPlayer(const os_char *,AudioFileType=AudioFileType::None);
// AudioPlayer(HAC *,const os_char *,AudioFileType=AudioFileType::None);
virtual ~AudioPlayer();
virtual bool Load(io::InputStream *,int,AudioFileType); ///<从流中加载一个音频文件
virtual bool Load(const os_char *,AudioFileType=aftNone); ///<加载一个音频文件
// virtual bool Load(HAC *,const os_char *,AudioFileType=aftNone); ///<从HAC包中加载一个音频文件
virtual bool Load(const os_char *,AudioFileType=AudioFileType::None); ///<加载一个音频文件
// virtual bool Load(HAC *,const os_char *,AudioFileType=AudioFileType::None); ///<从HAC包中加载一个音频文件
virtual void Play(bool=true); ///<播放音频
virtual void Stop(); ///<停止播放
@ -93,7 +157,7 @@ namespace hgl
virtual double GetPlayTime(); ///<取得已播放时间(单位秒)
virtual void SetFadeTime(double,double); ///<设置淡入淡出时间
virtual void AutoGain(float,double); ///<自动音量
virtual void AutoGain(float,double,const double cur_time); ///<自动音量
};//class AudioPlayer
}//namespace hgl
#endif//HGL_AUDIO_PLAYER_INCLUDE

View File

@ -1,7 +1,7 @@
#ifndef HGL_AUDIO_SCENE_INCLUDE
#define HGL_AUDIO_SCENE_INCLUDE
#include<hgl/algorithm/VectorMath.h>
#include<hgl/math/Math.h>
#include<hgl/type/Pool.h>
#include<hgl/type/Map.h>
#include<hgl/audio/ConeAngle.h>
@ -119,7 +119,7 @@ namespace hgl
AudioListener *listener; ///<收聽者
ObjectPool<AudioSource> source_pool; ///<音源数据池
Set<AudioSourceItem *> source_list; ///<音源列表
SortedSets<AudioSourceItem *> source_list; ///<音源列表
protected:

View File

@ -1,67 +0,0 @@
 friend class AudioPlayer;
private:
void InitPrivate();
AudioBuffer *Buffer;
protected:
uint index;
bool pause;
bool loop;
float pitch;
float gain;
float cone_gain;
Vector3f position;
Vector3f velocity;
Vector3f direction;
float ref_dist,max_dist;
uint distance_model;
float rolloff_factor;
ConeAngle angle;
float doppler_factor;
float doppler_velocity;
public:
uint GetIndex()const{return index;}
double GetCurTime();
void SetCurTime(const double &);
int GetState();
float GetMinGain();
float GetMaxGain();
const bool GetLoop()const{return loop;}
const float GetPitch()const{return pitch;}
const float GetGain()const{return gain;}
const float GetConeGain()const{return cone_gain;}
const uint GetDistanceModel()const{return distance_model;}
const float GetRolloffFactor()const{return rolloff_factor;}
const void GetDistance(float &rd,float &md)const
{
rd=ref_dist;
md=max_dist;
}
void GetDoppler(float &factor,float &velocity)
{
factor=doppler_factor;
velocity=doppler_velocity;
}
virtual void SetLoop(bool);
void SetPitch(float);
void SetGain(float);
void SetConeGain(float);
void SetDistanceModel(uint);
void SetRolloffFactor(float);

View File

@ -3,6 +3,8 @@
#include<hgl/audio/ConeAngle.h>
#include<hgl/audio/AudioBuffer.h>
#include<hgl/al/al.h>
#include<hgl/math/Math.h>
namespace hgl
{
@ -13,41 +15,95 @@ namespace hgl
*/
class AudioSource ///音频源类
{
#include<hgl/audio/AudioSource.Attrib.h>
friend class AudioPlayer;
private:
void InitPrivate();
AudioBuffer *Buffer;
protected:
uint index;
bool pause;
bool loop;
float pitch;
float gain;
float cone_gain;
Vector3f position;
Vector3f velocity;
Vector3f direction;
float ref_dist,max_dist;
uint distance_model;
float rolloff_factor;
ConeAngle angle;
float doppler_factor;
float doppler_velocity;
public: //属性
Property<uint> Index;
uint GetIndex()const{return index;} ///<获取当前音源索引
int GetState()const; ///<获取当前音源状态
Property<double> CurTime; ///<当前播放到的时间
const bool IsNone ()const{return GetState()==AL_NONE; }
const bool IsStopped ()const{return GetState()==AL_STOPPED;}
const bool IsPaused ()const{return GetState()==AL_PAUSED;}
const bool IsPlaying ()const{return GetState()==AL_PLAYING;}
Property<int> State; ///<音源状态
Property<float> MinGain; ///<最小增益
Property<float> MaxGain; ///<最大增益
double GetCurTime()const; ///<获取当前播放到的时间
void SetCurTime(const double &); ///<设置当前播放时间
Property<bool> Loop; ///<是否循环播放虚拟变量
float GetMinGain()const; ///<获取最小增益
float GetMaxGain()const; ///<获取最大增益
Property<float> Pitch; ///<播放频率
Property<float> Gain; ///<音量增益幅度
Property<float> ConeGain; ///<音源锥增益
const bool IsLoop()const{return loop;} ///<是否循环播放
virtual void SetLoop(bool); ///<设置是否循环播放
Property<uint> DistanceModel; ///<距离衰减模型(默认钳位倒数距离模型)
Property<float> RolloffFactor; ///<音源衰减因(>=0,默认1.0)
const float GetPitch()const{return pitch;} ///<获取播放频率
void SetPitch(float); ///<设置播放频率
public: //属性方法
const float GetGain()const{return gain;} ///<获取音量增益幅度
void SetGain(float); ///<设置音量增益幅度
const float GetConeGain()const{return cone_gain;} ///<获取锥形音量增益幅度
void SetConeGain(float); ///<设置锥形音量增益幅度
const Vector3f &GetPosition(){return position;}
const Vector3f &GetVelocity(){return velocity;}
const Vector3f &GetDirection(){return direction;}
const ConeAngle &GetAngle(){return angle;}
const uint GetDistanceModel()const{return distance_model;} ///<获取音量距离衰减模型
void SetDistanceModel(uint); ///<设置音量距离衰减模型
void SetPosition(const Vector3f &);
void SetVelocity(const Vector3f &);
void SetDirection(const Vector3f &);
void SetDistance(const float &ref_distance,const float &max_distance);
void SetConeAngle(const ConeAngle &);
void SetDopplerFactor(const float &); ///<设置多普勒效果强度
void SetDopplerVelocity(const float &); ///<设置多普勒速度
const float GetRolloffFactor()const{return rolloff_factor;} ///<获取音量衰减因子
void SetRolloffFactor(float); ///<设置音量衰减因子(>=0,默认1.0)
void GetDoppler(float &factor,float &velocity)const ///<获取多普勒强度和速度
{
factor=doppler_factor;
velocity=doppler_velocity;
}
void SetDopplerFactor(const float &); ///<设置多普勒效果强度
void SetDopplerVelocity(const float &); ///<设置多普勒速度
const void GetDistance(float &rd,float &md)const ///<获取音源距离范围
{
rd=ref_dist;
md=max_dist;
}
void SetDistance(const float &ref_distance,const float &max_distance); ///<设置音源距离范围
const Vector3f &GetPosition()const{return position;} ///<获取音源位置
void SetPosition(const Vector3f &); ///<设置音源位置
const Vector3f &GetVelocity()const{return velocity;} ///<获取速度
void SetVelocity(const Vector3f &); ///<设置速度
const Vector3f &GetDirection()const{return direction;} ///<获取发声方向
void SetDirection(const Vector3f &); ///<设置发声方向
const ConeAngle &GetAngle()const{return angle;} ///<获取发声锥形角度
void SetConeAngle(const ConeAngle &); ///<设置发声锥形角度
public: //方法
@ -65,8 +121,8 @@ namespace hgl
virtual bool Create(); ///<创建音源
virtual void Close(); ///<关闭音源
bool Link(AudioBuffer *); ///<绑定一个音频缓冲区
void Unlink(); ///<解除绑定
bool Link(AudioBuffer *); ///<绑定一个音频缓冲区
void Unlink(); ///<解除绑定
};//class AudioSource
}//namespace hgl
#endif//HGL_AUDIO_SOURCE_INCLUDE

View File

@ -1,7 +1,7 @@
#ifndef HGL_LISTENER_INCLUDE
#define HGL_LISTENER_INCLUDE
#include<hgl/algorithm/VectorMath.h>
#include<hgl/math/math.h>
namespace hgl
{
/**

View File

@ -136,9 +136,9 @@ namespace hgl
if(alLastError())return(ok=false);
if(aft<=aftNone||aft>=aftEnd)
if(!RangeCheck(aft))
{
LOG_ERROR(OS_TEXT("未知的音频文件类型AudioFileType:")+OSString(aft));
LOG_ERROR(OS_TEXT("未知的音频文件类型AudioFileType:")+OSString::valueOf((int)aft));
alDeleteBuffers(1,&Index);
RETURN_FALSE;
}
@ -168,10 +168,10 @@ namespace hgl
if(!alGenBuffers)RETURN_FALSE;
if(!in)RETURN_FALSE;
if(size<=0)RETURN_FALSE;
if(aft<=aftNone||aft>=aftEnd)
if(!RangeCheck(aft))
{
LOG_ERROR(OS_TEXT("未知的音频文件类型AudioFileType:")+OSString(aft));
LOG_ERROR(OS_TEXT("未知的音频文件类型AudioFileType:")+OSString::valueOf((int)aft));
ok=false;
}
else
@ -198,8 +198,8 @@ namespace hgl
if(!alGenBuffers)RETURN_FALSE;
aft=CheckAudioFileType(filename);
if(!aft)
if(!RangeCheck(aft))
{
LOG_ERROR(OS_TEXT("未知的音频文件类型AudioFile: ")+OSString(filename));
ok=false;

View File

@ -4,13 +4,12 @@
using namespace openal;
namespace hgl
{
/*PlugInManage( AudioInterface, //管理器名称,仅此一次,所以随便命名
AudioPlugInInterface, //接口结构名称,来自外部
AudioInterfaceCheck, //检查接口函数名称,要对外用
u"Audio", //插件前缀
2); //当前所用版本
*/
//PlugInManage( AudioInterface, //管理器名称,仅此一次,所以随便命名
// AudioPlugInInterface, //接口结构名称,来自外部
// AudioInterfaceCheck, //检查接口函数名称,要对外用
// u"Audio", //插件前缀
// 2); //当前所用版本
PlugInManage(Audio,"Audio",2);
PlugInManage(AudioFloat,"Audio",3);
//PlugInManage(Audio,"Audio",2);
//PlugInManage(AudioFloat,"Audio",3);
}//namespace hgl

View File

@ -2,7 +2,7 @@
#define HGL_AUDIO_DECODE_INCLUDE
#include<hgl/audio/OpenAL.h>
#include<hgl/type/BaseString.h>
#include<hgl/type/String.h>
using namespace openal;
namespace hgl

View File

@ -1,5 +1,6 @@
#include<hgl/audio/AudioFileType.h>
#include<hgl/type/StrChar.h>
#include<hgl/TypeFunc.h>
namespace hgl
{
@ -11,17 +12,17 @@ namespace hgl
const AudioFormatExt audio_format_ext_name[]=
{
{OS_TEXT("wav"), aftWAV },
{OS_TEXT("ogg"), aftVorbis },
{OS_TEXT("opus"), aftOpus },
{OS_TEXT(""), aftNone }
{OS_TEXT("wav"), AudioFileType::Wav },
{OS_TEXT("ogg"), AudioFileType::Vorbis },
{OS_TEXT("opus"), AudioFileType::Opus },
{OS_TEXT(""), AudioFileType::None }
};
AudioFileType CheckAudioExtName(const os_char *ext_name)
{
auto *afp=audio_format_ext_name;
while(afp->type)
while(afp->type!=AudioFileType::None)
{
if(hgl::strcmp(ext_name,afp->name)==0)
return(afp->type);
@ -29,7 +30,7 @@ namespace hgl
++afp;
}
return(aftNone);
return(AudioFileType::None);
}
AudioFileType CheckAudioFileType(const os_char *filename)
@ -40,7 +41,7 @@ namespace hgl
ext=hgl::strrchr(filename,hgl::strlen(filename),'.');
if(!ext)
return(aftNone);
return(AudioFileType::None);
++ext;
@ -50,9 +51,8 @@ namespace hgl
return CheckAudioExtName(extname);
}
const os_char audio_decode_name[aftEnd][32]=
const os_char audio_decode_name[size_t(AudioFileType::RANGE_SIZE)][32]=
{
OS_TEXT(""),
OS_TEXT("Wav"),
OS_TEXT("Vorbis"),
OS_TEXT("Opus")
@ -60,8 +60,8 @@ namespace hgl
const os_char *GetAudioDecodeName(const AudioFileType aft)
{
if(aft<=aftNone||aft>=aftEnd)return(nullptr);
if(!RangeCheck(aft))return(nullptr);
return audio_decode_name[aft];
return audio_decode_name[(size_t)aft-(size_t)AudioFileType::BEGIN_RANGE];
}
}//namespace hgl

View File

@ -25,7 +25,7 @@ namespace hgl
{
if(!buffer)return(true);
if(source->State==AL_PLAYING)return(false);
if(source->IsPlaying())return(false);
source->Unlink();
@ -49,7 +49,7 @@ namespace hgl
buffer=new AudioBuffer(filename);
source->Link(buffer);
source->Gain=gain;
source->SetGain(gain);
source->Play(false);
}
}//namespace hgl

View File

@ -1,8 +1,9 @@
#include<hgl/audio/AudioPlayer.h>
#include<hgl/LogInfo.h>
#include<hgl/PlugIn.h>
#include<hgl/log/LogInfo.h>
#include<hgl/plugin/PlugIn.h>
#include<hgl/Time.h>
#include<hgl/io/MemoryInputStream.h>
#include<hgl/io/FileInputStream.h>
#include"AudioDecode.h"
namespace hgl
@ -29,29 +30,13 @@ namespace hgl
decode=nullptr;
ps=psNone;
ps=PlayState::None;
{
hglSetPropertyRead( Index, this,AudioPlayer::GetIndex );
hglSetPropertyRead( Time, this,AudioPlayer::GetTime );
hglSetPropertyRead( State, this,AudioPlayer::GetPlayState );
hglSetPropertyRead( SourceState, this,AudioPlayer::GetSourceState);
hglSetPropertyRead( MinGain, this,AudioPlayer::GetMinGain );
hglSetPropertyRead( MaxGain, this,AudioPlayer::GetMaxGain );
hglSetProperty( Loop, this,AudioPlayer::GetLoop, AudioPlayer::SetLoop );
hglSetProperty( Pitch, this,AudioPlayer::GetPitch, AudioPlayer::SetPitch );
hglSetProperty( Gain, this,AudioPlayer::GetGain, AudioPlayer::SetGain );
hglSetProperty( ConeGain, this,AudioPlayer::GetConeGain, AudioPlayer::SetConeGain );
hglSetProperty( RolloffFactor, this,AudioPlayer::GetRolloffFactor, AudioPlayer::SetRolloffFactor );
}
total_time=0;
if(!audiosource.Create())return;
audiosource.Loop=false;
audiosource.SetLoop(false);
source=audiosource.index;
@ -106,7 +91,7 @@ namespace hgl
if(decode)
{
audio_ptr=decode->Open(audio_data,audio_data_size,&format,&rate,&time);
audio_ptr=decode->Open(audio_data,audio_data_size,&format,&rate,&total_time);
audio_buffer_size=(AudioTime(format,rate)+9)/10; // 1/10 秒
@ -117,8 +102,8 @@ namespace hgl
wait_time=0.1;
if(wait_time>time/3.0f)
wait_time=time/10.0f;
if(wait_time>total_time/3.0f)
wait_time=total_time/10.0f;
return(true);
}
@ -140,9 +125,9 @@ namespace hgl
Clear();
if(aft<=aftNone||aft>=aftEnd)
if(!RangeCheck(aft))
{
LOG_ERROR(OS_TEXT("未支持的音频文件类型AudioFileType: ")+OSString(aft));
LOG_ERROR(OS_TEXT("未支持的音频文件类型AudioFileType: ")+OSString::valueOf((int)aft));
return(false);
}
@ -168,10 +153,10 @@ namespace hgl
if(!alGenBuffers)return(false);
if(!filename||!(*filename))return(false);
if(aft<=aftNone||aft>=aftEnd)
if(!RangeCheck(aft))
aft=CheckAudioFileType(filename);
if(aft<=aftNone||aft>=aftEnd)
if(!RangeCheck(aft))
{
LOG_ERROR(OS_TEXT("未知的音频文件类型AudioFile: ")+OSString(filename));
return(false);
@ -236,10 +221,10 @@ namespace hgl
audio_ptr=nullptr;
time=0;
total_time=0;
}
bool AudioPlayer::GetLoop()
bool AudioPlayer::IsLoop()
{
lock.Lock();
bool rv=loop;
@ -299,12 +284,12 @@ namespace hgl
alSourcePlay(source);
start_time=GetDoubleTime();
ps=psPlay;
ps=PlayState::Play;
return(true);
}
else
{
ps=psExit;
ps=PlayState::Exit;
return(false);
}
@ -322,7 +307,7 @@ namespace hgl
loop=_loop;
if(ps==psNone||ps==psPause) //未启动线程
if(ps==PlayState::None||ps==PlayState::Pause) //未启动线程
Start();
Playback(); //Execute执行有检测Lock所以不必担心该操作会引起线程冲突
@ -342,7 +327,7 @@ namespace hgl
lock.Lock();
if(Thread::IsLive())
ps=psExit;
ps=PlayState::Exit;
else
thread_is_live=false;
@ -351,7 +336,7 @@ namespace hgl
if(thread_is_live)
Thread::WaitExit();
ps=psNone;
ps=PlayState::None;
}
/**
@ -363,8 +348,8 @@ namespace hgl
lock.Lock();
if(ps==psPlay)
ps=psPause;
if(ps==PlayState::Play)
ps=PlayState::Pause;
lock.Unlock();
}
@ -378,9 +363,9 @@ namespace hgl
lock.Lock();
if(ps==psPause)
if(ps==PlayState::Pause)
{
ps=psPlay;
ps=PlayState::Play;
Thread::Start();
}
@ -404,9 +389,9 @@ namespace hgl
audiosource.SetGain(((cur_time-start_time)/fade_in_time)*gain);
}
else
if(cur_time-start_time>time-fade_out_time) //淡出时间
if(cur_time-start_time>total_time-fade_out_time) //淡出时间
{
audiosource.SetGain(((time-(cur_time-start_time))/fade_out_time)*gain);
audiosource.SetGain(((total_time-(cur_time-start_time))/fade_out_time)*gain);
}
if(auto_gain.open)
@ -415,14 +400,14 @@ namespace hgl
{
auto_gain.open=false;
Gain=auto_gain.end.gain;
SetGain(auto_gain.end.gain);
if(auto_gain.end.gain<=0)
ps=psExit;
ps=PlayState::Exit;
}
else
{
Gain=auto_gain.start.gain+auto_gain.gap*((cur_time-auto_gain.start.time)/auto_gain.time);
SetGain(auto_gain.start.gain+auto_gain.gap*((cur_time-auto_gain.start.time)/auto_gain.time));
}
}
@ -468,13 +453,13 @@ namespace hgl
{
lock.Lock();
if(ps==psPlay) //被要求播放
if(ps==PlayState::Play) //被要求播放
{
if(!UpdateBuffer())
{
if(loop) //被要求循环播放
{
if(SourceState!=AL_STOPPED) //等它放完
if(GetSourceState()!=AL_STOPPED) //等它放完
Playback();
}
else
@ -482,18 +467,18 @@ namespace hgl
//退出
lock.Unlock();
ps=psNone;
ps=PlayState::None;
return(false);
}
}
else
{
if(SourceState!=AL_PLAYING)
if(GetSourceState()!=AL_PLAYING)
alSourcePlay(source);
}
}
else
if(ps==psPause) //被要求暂停
if(ps==PlayState::Pause) //被要求暂停
{
alSourcePause(source);
@ -501,7 +486,7 @@ namespace hgl
return(false);
}
else
if(ps==psExit) //被要求暂停或退出
if(ps==PlayState::Exit) //被要求暂停或退出
{
alSourceStop(source);
alSourcei(source,AL_BUFFER,0);
@ -535,14 +520,17 @@ namespace hgl
/**
*
* @param target_gain
* @param adjust_time
* @param cur_time
*/
void AudioPlayer::AutoGain(float target_gain,double adjust_time)
void AudioPlayer::AutoGain(float target_gain,double adjust_time,const double cur_time)
{
if(!audio_data)return;
lock.Lock();
auto_gain.start.gain=Gain;
auto_gain.start.time=GetDoubleTime();
auto_gain.start.gain=GetGain();
auto_gain.start.time=cur_time;
auto_gain.end.gain=target_gain;
auto_gain.end.time=auto_gain.start.time+adjust_time;

View File

@ -169,16 +169,15 @@ namespace hgl
if(!asi->source)
{
asi->source=source_pool.Acquire();
if(!asi->source)return(false);
if(!source_pool.Acquire(asi->source))
return(false);
}
asi->source->Link(asi->buffer);
asi->source->Gain=asi->gain;
asi->source->DistanceModel=asi->distance_model;
asi->source->RolloffFactor=asi->rolloff_factor;
asi->source->SetGain(asi->gain);
asi->source->SetDistanceModel(asi->distance_model);
asi->source->SetRolloffFactor(asi->rolloff_factor);
asi->source->SetDistance(asi->ref_distance,asi->max_distance);
asi->source->SetPosition(asi->cur_pos);
asi->source->SetConeAngle(asi->cone_angle);
@ -187,7 +186,7 @@ namespace hgl
asi->source->SetDopplerFactor(asi->doppler_factor);
asi->source->SetDopplerVelocity(0);
asi->source->CurTime=time_off;
asi->source->SetCurTime(time_off);
asi->source->Play(asi->loop);
OnToHear(asi);
@ -200,7 +199,7 @@ namespace hgl
if(!asi)return(false);
if(!asi->source)return(false);
if(asi->source->State==AL_STOPPED) //停播状态
if(asi->source->GetState()==AL_STOPPED) //停播状态
{
if(!asi->loop) //不是循环播放
{

View File

@ -1,6 +1,6 @@
#include<hgl/audio/AudioSource.h>
#include<hgl/audio/OpenAL.h>
#include<hgl/LogInfo.h>
#include<hgl/log/LogInfo.h>
using namespace openal;
namespace hgl
@ -21,23 +21,6 @@ namespace hgl
{
index=InvalidIndex;
Buffer=nullptr;
hglSetPropertyRead( Index, this,AudioSource::GetIndex);
hglSetProperty( CurTime, this,AudioSource::GetCurTime, AudioSource::SetCurTime);
hglSetPropertyRead( State, this,AudioSource::GetState);
hglSetPropertyRead( MinGain, this,AudioSource::GetMinGain);
hglSetPropertyRead( MaxGain, this,AudioSource::GetMaxGain);
hglSetProperty( Loop, this,AudioSource::GetLoop, AudioSource::SetLoop);
hglSetProperty( Pitch, this,AudioSource::GetPitch, AudioSource::SetPitch);
hglSetProperty( Gain, this,AudioSource::GetGain, AudioSource::SetGain);
hglSetProperty( ConeGain, this,AudioSource::GetConeGain, AudioSource::SetConeGain);
hglSetProperty( DistanceModel, this,AudioSource::GetDistanceModel, AudioSource::SetDistanceModel);
hglSetProperty( RolloffFactor, this,AudioSource::GetRolloffFactor, AudioSource::SetRolloffFactor);
}
/**
@ -69,7 +52,7 @@ namespace hgl
Close();
}
double AudioSource::GetCurTime()
double AudioSource::GetCurTime() const
{
if(!alGetSourcei)return(0);
if(index==InvalidIndex)return(0);
@ -89,7 +72,7 @@ namespace hgl
alSourcef(index,AL_SEC_OFFSET,ct);
}
int AudioSource::GetState()
int AudioSource::GetState() const
{
if(!alGetSourcei)return(0);
if(index==InvalidIndex)return(AL_NONE);
@ -101,7 +84,7 @@ namespace hgl
return(state);
}
float AudioSource::GetMinGain()
float AudioSource::GetMinGain() const
{
if(!alGetSourcef)return(0);
if(index==InvalidIndex)return(0);
@ -113,7 +96,7 @@ namespace hgl
return(min);
}
float AudioSource::GetMaxGain()
float AudioSource::GetMaxGain() const
{
if(!alGetSourcef)return(0);
if(index==InvalidIndex)return(0);
@ -267,7 +250,7 @@ namespace hgl
if(!Buffer
||Buffer->Time<=0)return(false);
if(State==AL_PLAYING)
if(IsPlaying())
alSourceStop(index);
alSourcePlay(index);
@ -288,7 +271,7 @@ namespace hgl
if(!Buffer
||Buffer->Time<=0)return(false);
if(State==AL_PLAYING)
if(IsPlaying())
alSourceStop(index);
alSourcePlay(index);

View File

@ -1,6 +1,6 @@
#include<hgl/audio/Listener.h>
#include<hgl/audio/OpenAL.h>
#include<hgl/LogInfo.h>
#include<hgl/log/LogInfo.h>
using namespace openal;
namespace hgl

View File

@ -3,7 +3,7 @@
#include<hgl/audio/OpenAL.h>
#include<hgl/type/Pair.h>
#include<hgl/type/Stack.h>
#include<hgl/type/BaseString.h>
#include<hgl/type/String.h>
#include<hgl/type/StringList.h>
#include<hgl/platform/ExternalModule.h>
@ -37,90 +37,88 @@ namespace openal
void PutOpenALInfo();
//--------------------------------------------------------------------------------------------------
bool OnFindedOpenALDynamicLinkLibrary(const OSString &filename,void *user_data,bool exist)
{
if(!exist)return(true);
AudioEM=LoadExternalModule(filename);
if(!AudioEM)
{
LOG_INFO(OS_TEXT("找到一个OpenAL动态链接库但加载失败文件名: ")+OSString(filename));
return(true);
}
LOG_INFO(OS_TEXT("加载OpenAL动态链接库功成。文件名: ")+OSString(filename));
return(false);
}
//--------------------------------------------------------------------------------------------------
/**
* OpenAL
* @return OpenAL是否成功
*/
bool LoadOpenAL(const os_char *filename)
{
const os_char oalfn[][HGL_MAX_PATH]=
OSStringList oalpn;
OSStringList oalfn=
{
#if HGL_OS == HGL_OS_Windows
OS_TEXT("\\OpenAL32.dll"),
OS_TEXT("\\ct_oal.dll"),
OS_TEXT("\\nvOpenAL.dll"),
OS_TEXT("\\soft_oal.dll"),
OS_TEXT("\\wrap_oal.dll"),
OS_TEXT("OpenAL32.dll"),
OS_TEXT("ct_oal.dll"),
OS_TEXT("nvOpenAL.dll"),
OS_TEXT("soft_oal.dll"),
OS_TEXT("wrap_oal.dll"),
#elif (HGL_OS == HGL_OS_Linux)||(HGL_OS == HGL_OS_FreeBSD)||(HGL_OS == HGL_OS_NetBSD)||(HGL_OS == HGL_OS_OpenBSD)
OS_TEXT("/libopenal.so"),
OS_TEXT("/libopenal.so.1"),
OS_TEXT("libopenal.so"),
OS_TEXT("libopenal.so.1"),
#elif HGL_OS == HGL_OS_MacOS
OS_TEXT("/libopenal.dylib"),
OS_TEXT("libopenal.dylib"),
#endif//HGL_OS == HGL_OS_Windows
OS_TEXT("\x0")
};
int count=0;
const os_char *pi_path=GetString(hfsPlugInPath);
os_char pifn[HGL_MAX_PATH];
os_char dllfn[HGL_MAX_PATH];
os_char *final_filename=nullptr;
{
OSString pn;
filesystem::GetCurrentPath(pn);
oalpn.Add(pn);
pn=filesystem::MergeFilename(pn,OS_TEXT("Plug-Ins"));
if(filesystem::IsDirectory(pn))
oalpn.Add(pn);
filesystem::GetOSLibararyPath(pn);
oalpn.Add(pn);
}
CloseOpenAL();
if(filename)
{
hgl::strcpy(dllfn,HGL_MAX_PATH,hgl::info::GetString(hgl::info::hfsOSLibraryPath).c_str());
hgl::strcat(dllfn,HGL_MAX_PATH,HGL_DIRECTORY_SEPARATOR);
hgl::strcat(dllfn,HGL_MAX_PATH,filename,HGL_MAX_PATH);
hgl::strcpy(pifn,HGL_MAX_PATH,pi_path);
hgl::strcat(pifn,HGL_MAX_PATH,HGL_DIRECTORY_SEPARATOR);
hgl::strcat(pifn,HGL_MAX_PATH,filename,HGL_MAX_PATH);
if(filesystem::FileExist(filename ))final_filename=(os_char *)filename;else
if(filesystem::FileExist(dllfn ))final_filename=dllfn;else
if(filesystem::FileExist(pifn ))final_filename=pifn;
AudioEM=LoadExternalModule(final_filename);
filesystem::FindFileOnPaths(filename,oalpn,nullptr,OnFindedOpenALDynamicLinkLibrary);
}
else
{
do
{
hgl::strcpy(pifn,HGL_MAX_PATH,pi_path);
hgl::strcat(pifn,HGL_MAX_PATH,oalfn[count],HGL_MAX_PATH);
hgl::strcpy(dllfn,HGL_MAX_PATH,hgl::info::GetString(hgl::info::hfsOSLibraryPath).c_str());
hgl::strcat(dllfn,HGL_MAX_PATH,oalfn[count],HGL_MAX_PATH);
if(filesystem::FileExist(dllfn))final_filename=dllfn;else
if(filesystem::FileExist(pifn ))final_filename=pifn;else
continue;
AudioEM=LoadExternalModule(final_filename);
if(AudioEM)break; //如果加载成功
}while(oalfn[++count][0]);
filesystem::FindFileOnPaths(oalfn,oalpn,nullptr,OnFindedOpenALDynamicLinkLibrary);
}
if(AudioEM)
{
LOG_INFO(OS_TEXT("加载OpenAL成功使用动态链接库: ")+OSString(final_filename));
return (AL_TRUE);
return true;
}
else
{
#if HGL_OS == HGL_OS_Windows
LOG_ERROR( OS_TEXT("加载OpenAL动态链接库失败OpenAL动态链接库可能是: OpenAL32.dll、soft_oal.dll、wrap_oal.dll、ct_oal.dll、nvOpenAL.dll\n")
OS_TEXT("软件实现的OpenAL32.DLL、wrap_oal可在http://www.openal.org上下载、soft_oal.dll可在http://kcat.strangesoft.net/openal.html下载!\n")
OS_TEXT("软件实现的OpenAL32.DLL、wrap_oal可在http://www.openal.or上下载、soft_oal.dll可在https://openal-soft.org下载!\n")
OS_TEXT("硬件实现的OpenAL32.DLL请到对应您声卡的厂商网站下载对应的驱动程序! 下载完成后可其放入Windows\\System32目录下或应用程序Plug-Ins目录下即可!"));
#else
LOG_ERROR( OS_TEXT("加载OpenAL动态链接库失败"));
LOG_ERROR( OS_TEXT("加载OpenAL动态链接库失败或没有找到OpenAL动态链接库"));
#endif//#if HGL_OS == HGL_OS_Windows
return (AL_FALSE);
return false;
}
}