Chinaunix首页 | 论坛 | 博客
  • 博客访问: 290053
  • 博文数量: 48
  • 博客积分: 2931
  • 博客等级: 少校
  • 技术积分: 720
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-19 22:12
文章分类

全部博文(48)

文章存档

2012年(1)

2011年(6)

2010年(33)

2009年(5)

2008年(3)

我的朋友

分类:

2010-01-05 13:00:50

Openal 教程(四)

  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。

阅读(2641) | 评论(0) | 转发(0) |
0

上一篇:OpenAL教程(三)

下一篇:OpenAL教程(五)

给主人留下些什么吧!~~