Openal教程(一)

摘要:
openal教程(一)简介欢迎来到OPENAL的世界!OPENAL一直在不断的创新,几乎没有一个API能达到她的全部潜能。然而,CreativeLabs是APENAL的主要支持者,同时也是最大声卡厂商之一。但OPENAL的设计者经过无数的测试使她成为一个高级的API。有OPENGL编程精练的人将很快掌握OPENAL。OPENAL是verycool,她是一个非常清晰的API并且能熔入你的代码。=AL_NO_ERROR)returnAL_FALSE;alutLoadWAVFile;alBufferData;alutUnloadWAV;函数alGenBufers用于建立对象内存并把他们存储在我们定义的变量中。voidSetListenervalues(){alListenerfv;alListenerfv;alListenerfv;}我们建立一个函数用于更新听者速度。ALUT通过ALC并设置她为当前建立OPENAL环境描述。
openal教程(一)
简介
欢迎来到OPENAL的世界!OPENAL一直在不断的创新,几乎没有一个API能达到
她的全部潜能。一个很大的原因是因为hardware加速建立在特殊的版卡上。然而,
Creative Labs是APENAL的主要支持者,同时也是最大声卡厂商之一。OPENAL的另
一个主要支持者LOKI。
OPENAL不是商业产品,那样做限制了她的发展。我只知道再PC游戏中用OPENAL。
OPENAL有许多的潜能,有许多的声音库工作在最地层的hardware上。但OPENAL的
设计者经过无数的测试使她成为一个高级的API。她的风格是自由的,不同的编码
风格和hardware部件将充分运用她的功能。有OPENGL编程精练的人将很快掌握OPEN
AL。OPENAL有建立3D环境音效的能力。
OPENAL是very cool,她是一个非常清晰的API并且能熔入你的代码。你将做出
很COOL的音效,下面让我们进入COOL COOL的OPENAL世界。
#include <conio.h>
#include <stdlib.h>
#include <al/al.h>
#include <al/alc.h>
#include <al/alu.h>
#include <al/alut.h>
你会发现再OPENAL头和OPENGL头的定义上有许多的相似之处。除了“al.h","al
u.h","alut.h"与”gl.h","glu.h","glut.h"相似,还增加了一个"alc.h".ALC(
AUDIO LIBRARY CONTEXT)处理声音通过不同的平台,她也处理你在几个窗口下共
享设备的环境。
// 存储声音数据
ALuint Buffer;

// 用于播放声音
ALuint Source;
这是程序处理结构的初始化。在OPENAL中三种不同的结构,所有关于声音播放和
声音数据存储在一个内存中,源(source)是指向放声音的空间。明白源是非常
的重要。源只播放内存中的背景声音数据。源也给出了特殊的属性如位置和速度。
第三个对象是听者,用户就是那唯一的听者。听者属性属于源属性,决定如何
听声音。例如,不同位置将决定声音的速度。
// 源声音的位置
ALfloat SourcePos[] = { 0.0, 0.0, 0.0 };

// 源声音的速度
ALfloat SourceVel[] = { 0.0, 0.0, 0.0 };

// 听者的位置
ALfloat ListenerPos[] = { 0.0, 0.0, 0.0 };

// 听者的速度
ALfloat ListenerVel[] = { 0.0, 0.0, 0.0 };

// 听者的方向 (first 3 elements are "at", second 3 are "up")
ALfloat ListenerOri[] = { 0.0, 0.0, -1.0,0.0, 1.0, 0.0 };
在上面的代码中,我们定义了源和听者对象的位置和速度。这些数组是基于笛
卡儿坐标的矢量。你能很容易用结构或类做相同的事情。
ALboolean LoadALData()
{
// 载入变量.

ALenum format;
ALsizei size;
ALvoid* data;
ALsizei freq;
ALboolean loop;
在这里我们建立一个函数用于从一个文件中载入声音数据。变量用于存储适合
我们的ALUT信息。
// 载入WAV数据
alGenBuffers(1, &Buffer);
if (alGetError() != AL_NO_ERROR)
return AL_FALSE;

alutLoadWAVFile("wavdata/FancyPants.wav", &format, &data, &size, &freq, &loop);
alBufferData(Buffer, format, data, size, freq);
alutUnloadWAV(format, data, size, freq);
函数alGenBufers用于建立对象内存并把他们存储在我们定义的变量中。然后判断
数据是否存储。
ALUT库为我们打开文件,提供我们建立内存所需的信息,并且在我们归属所有
数据到内存后,她将处理这些数据。
// 捆绑源
alGenSources(1, &Source);

if (alGetError() != AL_NO_ERROR)
return AL_FALSE;

alSourcei (Source, AL_BUFFER, Buffer );
alSourcef (Source, AL_PITCH,1.0f );
alSourcef (Source, AL_GAIN, 1.0f );
alSourcefv(Source, AL_POSITION, SourcePos);
alSourcefv(Source, AL_VELOCITY, SourceVel);
alSourcei (Source, AL_LOOPING,loop );
我们用建立内存对象的方法建立了源对象。然后,我们定义源属性用于录放。
最重要的属性是她用的内存。这告诉源用于录放。因此,我们只有捆绑她。同时,
我们也告诉她我们定义的源位置和速度。
// 做错误检测并返回
if (alGetError() == AL_NO_ERROR)
return AL_TRUE;

return AL_FALSE;
在函数的结尾,我们将做更多的检测,以确定她的正确。
void SetListenervalues()
{
alListenerfv(AL_POSITION,ListenerPos);
alListenerfv(AL_VELOCITY,ListenerVel);
alListenerfv(AL_ORIENTATION, ListenerOri);
}
我们建立一个函数用于更新听者速度。
void KillALData()
{
alDeleteBuffers(1, &Buffer);
alDeleteSources(1, &Source);
alutExit();
}
这是一个关闭函数,用于释放内存和音频设备。
int main(int argc, char *argv[])
{
// 初始OPENAL并清错误字节

alutInit(&argc, argv);
alGetError();
函数alutInit将安装ALC需要的东西。ALUT通过ALC并设置她为当前建立OPENAL
环境描述。在WINDOWS平台上初始DIRECTSOUND。然后用‘GLGETERROR’检测错误。
// 载入WAV数据
if (LoadALData() == AL_FALSE)
return -1;

SetListenervalues();

// 设置退出函数
atexit(KillALData);
我们将检测WAV文件是否正确载入。如果没有退出程序。
正确后,更新听者参数,最后退出。
ALubyte c = ' ';

while (c != 'q')
{
c = getche();

switch (c)
{
// Pressing 'p' will begin playing the sample.
case 'p': alSourcePlay(Source); break;

// Pressing 's' will stop the sample from playing.
case 's': alSourceStop(Source); break;

// Pressing 'h' will pause (hold) the sample.
case 'h': alSourcePause(Source); break;
};
}

return 0;
}

很简单的,运行程序后按p键就是播放.
在我的环境Centos5.5可以正常编译运行,如果大家有什么问题,可以一起探讨:velun2008@hotmail.com

免责声明:文章转载自《Openal教程(一)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇AWS安装CDH5.3-CentOS6.4中关键操作步骤redis部署到云服务器上的一些坑下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

iOS OpenAL播放声音的流程

iOS移动设备进行音频播放时,可以使用openal 注意:openal 默认开启的是手机听筒(有多个播放设备 :alcopendevice(null)),如果想让声音通过扬声器进行播放,可通过audiosession的audiosessionsetproperty进行设置:kaudiosessionproperty_overridecategorydefa...

【JAVA】将PDF转化成图片

很多的开源库可以完成这个任务,但是效果都不理想,主要会产生以下问题: 1)分辨率很低,就是最后转化成的图片是缩略图,放大之后看不清楚; 2)不能支持中文,所有中文一律乱码; 3)图片各种混淆:大体是对的,但是个别元素出现混乱,尺寸位置不对等等; 上面说到的三种问题在各种类库中或多或少都存在。 A)实验下来效果最好的是QOPPA的开源库,在免费部分的测试情况...

宾得十大名镜

“三公主”: PENTAX SMC FA 31mm F1.8 AL Limited PENTAX SMC FA 43mm F1.9 Limited PENTAX SMC FA 77mm F1.8 Limited    “三饼干”: PENTAX SMC DA 21mm F3.2 AL Limited PENTAX SMC DA 40mm F2.4 Lim...

第十一篇 BCD码调整

无论是X86汇编还是MCS-51的指令集中都会有BCD码调整指令。本博文将浅谈下BCD码调整的 相关情况。 一、BCD码是十进制数在计算机中的表现形式。 我们一直都说计算机只能表示0、1二进制,这毫无疑问是正确的。但人对十进制数较为熟悉,为了 迎合人的方便,8421BCD码用来表示十进制数。当然了,BCD码也是用0、1二进制来表示的。所以, 需要注意理解的...