OpenAL(Open Audio Library)是自由软件界的跨平台音效API。它设计给多通道三维位置音效的特效表现。其 API 风格模仿自 OpenGL。刚开始接触的时候可以下载工具包Alut,里面提供丰富的处理接口文件加载等,不过建议在自己熟悉了整个流程之后研究下Alut的 源代码,之后尽量使用alc.c里面的东西自己实现Alut工具包的功能,这是一个机灵的程序员的想法!
废话不多说,OpenAl的初始化在一个进程中只能有一次,所以需要保证Al的初始化能够仅有的一次的正确性。设计模式不是有单例的嘛,要规范些可以参考一下。装好了OpenAl的SDk等之后会有很多小例子,那可是非常好的学习资料,本人也是从上面的例子学习过来的。OpenAl封装了很多底层的接口,这让我们在使用的时候非常的便利。基本的东西就不说了,相信只要有例子可依了解和掌握它还是非常的简单的。设置好了声音源以及声音buffer只需要调用alSourcePlay即可播放,播放的参数由alBufferData设定。
OpenAl的流缓冲是很容易的就可以实现,使用alSourceQueueBuffers将声音buffer加到声音源的source的队列中,用alGetSourcei(m_uiSource, AL_BUFFERS_PROCESSED,&m_iBuffersProcessed)取得缓冲队列中的空闲的buffer然后往里面添加数据即可。具体见代码吧。
上面说了必须保证OpenAl的初始化仅有一个。所以我把OpenAl的初始化类声明为全局变量。下面是初始化的过程:
CInitAl::CInitAl(void)
{
m_iHasInit = 0;
if(InitOpenAL() == 0)
{
m_iHasInit = 1;
}
}
/** @fn ~CInitAl(void)
*
* @brief al环境初始化类析构函数
*
* @return
*/
CInitAl::~CInitAl(void)
{
if(m_iHasInit == 1)
{
ExitOpenAL();
}
}
int CInitAl::InitOpenAL(void)
{
ALCdevice *pDevice;
ALCcontext *pContext;
const char *deviceSpecifier;
char deviceName[] = "DirectSound3D";
//得到设备句柄
pDevice = alcOpenDevice(deviceName);
//得到设备说明
deviceSpecifier = alcGetString(pDevice, ALC_DEVICE_SPECIFIER);
//建立声音文本描述
pContext = alcCreateContext(pDevice, NULL);
//设置行为文本描述
alcMak