原文: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.