分类:
2010-01-05 13:00:50
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。