OpenAl音频播放

OpenAL(Open Audio Library)是自由软件界的跨平台音效API。它设计给多通道三维位置音效的特效表现。其 API 风格模仿自 OpenGL。刚开始接触的时候可以下载工具包Alut,里面提供丰富的处理接口文件加载等,不过建议在自己熟悉了整个流程之后研究下Alut的 源代码,之后尽量使用alc.c里面的东西自己实现Alut工具包的功能,这是一个机灵的程序员的想法!废话不多说,O
摘要由CSDN通过智能技术生成

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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值