[转载]OpenAL Tutorial 1
2010-10-18 15:36
302 查看
OpenAL Tutorial 1
OpenAL一直在不断的创新,几乎没有一个
API
能达到她的全部潜能。一个很大的原因是因为
Hardware
加速建立在特殊的板卡上。然而,
Creative Labs
是
OpenAL
的主要支持者,同时也是最大声卡厂商之一。
OpenAL
的另一个主要支持者
LOKI.
OpenAL
不是商业产品,那样做限制了她的发展。我只知道在
PC
游戏中用
OpenAL
。
OpenAL
有许多的潜能,有许多的声音库工作在最地层的
Hardware
上。但
OpenAL
的设计者经过无数的测试使她成为一个高级的
API
。她的风格是自由的,不同的编码风格和
Hardware
部件将充分运用她的功能。有
OpenAL
编程精练的人将很快掌握
OpenAL
。
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", "alu.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
。然后用‘
ALGETERROR
’检测错误。
//
载入
WAV
数据
if (LoadALData() == AL_FALSE)
return -1;
SetListenervalues();
//
设置退出函数
alexit(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;
}
相关文章推荐
- OpenAL Lesson 6: Advanced Loading and Error Handles(转载)
- OpenAL Lesson 7: The Doppler Effect(转载)
- OpenAL Lesson 8: OggVorbis Streaming Using The Source Queue (转载)
- OpenAL Lesson 1: Simple Static Sound(转载)
- Tutorial: Loading Wave files in OpenAL without ALUT
- OpenAL Lesson 2: Looping and Fadeaway(转载)
- OpenAL Lesson 3: Multiple Sources(转载)
- OpenAL Tutorial - Playing WAV files (No ALUT required!)
- OpenAL Lesson 4: The ALC(转载)
- OpenAL Lesson 5: Sources Sharing Buffers(转载)
- 【转载OPEN_CURSORS】oracle参数open_cursors和session_cached_cursor详解!
- Tutorial1 Open a window
- osgi入门文章 转载http://www.ibm.com/developerworks/cn/education/opensource/os-eclipse-osgi/index.html
- Latent Semantic Analysis (LSA) Tutorial 潜语义分析LSA介绍 第二部分 (转载)
- OpenCV Tutorial: 開運算、閉運算(morphologyEx、MORPH_OPEN、MORPH_CLOSE)
- 【转载】open-falcon部署
- window.open详解(转载)
- (转载)HTML:模拟链接被按下,在新标签页打开页面,不使用window.open(可能被拦截)
- OpenAL Sound Engine