OpenAl编程入门
关于OpenAl我就不多介绍了,这两篇说明对于初步了解已经足够了:
http://baike.baidu.com/view/1355367.htm
http://en.wikipedia.org/wiki/OpenAL
相关的开发包可上google搜索"OPENAL SDK DOWNLOAD".
以下是一个非常简单示例,我们将播放一段正弦音频。
int main(int argc, char *argv[]) { InitOpenAL(); // 初始化openal LoadData(); // 载入WAV数据 Play(); // 播放 UnloadData(); // 卸载WAV数据 ShutdownOpenAL(); // 关闭openal return 0; }
好吧,以上代码不涉及任何OPENAL的东西。我只是想先给个OPENAL的使用流程,同大多数SDK一样,无非是Init\Working\Shutdown的三步曲。
接下来我们实现以上列出的五个函数。
1、全局数据
ALuint Source;// 用于播放声音 ALuint Buffer;// 声音数据
2、InitOpenAL&ShutdownOpenAL
以下就不多作说明,操作都很简单。
bool InitOpenAL() { ALCdevice * pDevice = alcOpenDevice(NULL); // 打开默认音频设备 ALCcontext * pContext = alcCreateContext(pDevice, NULL); alcMakeContextCurrent(pContext); return true; // 注意:这里没有进行失败检测,仅用于示例 } void ShutdownOpenAL() { ALCcontext *pContext; ALCdevice *pDevice; pContext = alcGetCurrentContext(); pDevice = alcGetContextsDevice(pContext); alcMakeContextCurrent(NULL); alcDestroyContext(pContext); alcCloseDevice(pDevice); }
2、LoadData & UnloadData
这里我们使用cosf生成一段正弦波作为音频数据。
bool LoadData() { // 载入变量. const ALsizei size = 800; ALsizei freq = 8000; ALboolean loop = 1; // 循环播放 // 使用一段正弦波作数据 short data[800]; alGenBuffers(1, &Buffer); float max = SHRT_MAX / 4; float rad = 0; for(short & e : data) { e = (short)(max * cosf(rad)); rad += 1.f; } // 载入WAV数据 alBufferData(Buffer, AL_FORMAT_MONO16, data, size, freq); alGenSources(1, &Source); // 源声音的位置 ALfloat SourcePos[] = { 0.0, 0.0, 0.0 }; // 源声音的速度 ALfloat SourceVel[] = { 0.0, 0.0, 0.0 }; 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 ); return true; } void UnloadData() { alDeleteBuffers(1, &Buffer); alDeleteSources(1, &Source); }
3、播放
这里你可以自由发挥了,alSourcePlay/alSourceStop/alSourcePause分别是播放、停止、暂停操作。
void Play() { // 播放 alSourcePlay(Source); printf("Press Enter To Stop Sound\n"); getchar(); alSourceStop(Source); }
4、最后别忘了加上头文件
#include// for printf #include // for cosf #include "al.h" // for glXzzz #include "alc.h" // for glcXzzz
后俩文件需要将OPENAL SDK的 include 目录加入到项目包含路径下。