Openal 教程(四)

原文:http://bbs.gameres.com/thread_12742.html

Openal 教程(四)
ALC

  Alut一直为我们做着所有神奇的东西。例如处理音频设备。ALUT库为
  我们提供这些功能,但是一些机灵的程序员想知道他是怎样工作的。
  我们可以这样想,在一些点上直接用ALC。
    在这一章中,我们将讲述ALC层,并看一下他是怎样处理设备的。
    ALCdevice* pDevice;

ALCubyte DeviceName[] = "DirectSound3D";

pDevice = alcOpenDevice(DeviceName);
当然,ALC设备是什么?可以这样想,在共享整个系统下,OPENAL夺取了
设备的句柄。在我们用DIRECTSOUND作为音频设备时,设备能完成的很好。
程序从设备中夺取句柄并为程序准备着。
传递NULL给‘alcOpenDevice',他将使ALC用默认设备。
ALCcontext* pContext;

pContext = alcCreateContext(pDevice, NULL);

alcMakeContextCurrent(pContext);
ALC文本描述是什么? OPENGL程序员能撤消通过不同窗口的
状态管理的控制的精简文本描述。HGLRC能被挑调用建立多次,使多描述
窗口成为可能。并且不同的文本描述状态可以实现。ALC文本描述工作在
相同的原理下。首先,我们告诉他我们用的设备,然后我们做当前的文本
描述。理论上你能为不同的窗口建立多个表达文本描述,并且设置不同的
状态变量,以使他们能很好的工作。尽管“表达文本描述”用于可视表达。

你可能也注意到“alcCreateContext'中的第二个变量是NULL。OPENAL中
下面的变量与他有关。
ALC_FREQUENCY 
ALC_REFRESH 
ALC_SYNC 
你可以调用’alcMakeContextCurrent'替换你建立的多个文本描述。同样
在'alcMakeContextCurrent'中置NULL。他将防止处理其他声音数据。要
意识到当你有多个表达文本描述时,你只能在当前用一个。并且当你的程序
要交换使用两个描述时,必须确定当前使用的描述是在当前。当你想不通过
大的检查,知道用的哪个描述,必须用这些。
ALcontext* pCurContext;
pCurContext = alcGetCurrentContext();
通过文本描述,你能获取设备。
ALdevice* pCurDevice;
pCurDevice = alcGetContextsDevice(pCurContext);
在我们用文本描述时,我们必须收回用的设备。在处理文本描述时,有
更COOL的方法。
alcSuspendContext(pContext);
// 终止pContext.
alcProcessContext(pContext);
// 重置pContext.
当程序停止时,我们必须重置声音数据到文本描述。当程序暂停时,文本
描述中的数据不会产生声音。在程序运行期间,源或缓冲区的‘lifetime'
的有效是由源或缓冲器ID的合法性决定的。
alcMakeContextCurrent(NULL);
alcDestroyContext(pContext);
alcCloseDevice(pDevice);
最后,怎样清出他呢?当前文本描述被初始化为’NULL‘,描述释放并且
设备句柄交还系统。在这里我们只讲了一些ALC的基本功能。
ALenum alcGetError(ALvoid);

ALboolean alcIsExtensionPresent(ALCdevice* device, ALubyte* extName);

ALvoid* alcGetProcAddress(ALCdevice* device, ALubyte* funcName);

ALenum alcGetEnumvalue(ALCdevice* device, ALubyte* enumName);

ALubyte* alcGetString(ALCdevice* device, ALenum token);

ALvoid alcGetIntegerv(ALCdevice* device, ALenum token, ALsizei size, ALint* dest);
这些做什么,我们肯定很清楚,首先,我们用'alcGetError' 检测错误。
下面三个功能是询问ALC的扩展。这在开始就应计划。最后alcGetInteger'
将返回ALC的版本'ALC_MAJOR_VERSION' or 'ALC_MINOR_VERSION'。
函数'alcGetString'返回下面信息:
ALC_DEFAULT_DEVICE_SPECIFIER 
ALC_DEVICE_SPECIFIER 
ALC_EXTENSIONS 
首先是OPENAL完成的设备的信息。OPENAL 返回"DirectSound3D", 
第二个返回"DirectSound" ;
最后一个返回NULL。

Well that's most of Alc for you. I hope it gave you a better
 understanding of how OpenAL interacts with the operation system. 
You might try writing your own initialization routines so you can
 cast off Alut altogether. Either way have fun with it.


See the Java Bindings for OpenAL page for the Java version of
 this tutorial - adapted by: Athomas Goldberg


如果大家有什么问题,请告诉我e-mail:ouyunfei12@mail.china.com.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值