OpenAl编程入门:播放一段音频

时间:2022-10-04 17:42:35

OpenAl编程入门

关于OpenAl可参考如下两站,本文不再赘述。
http://baike.baidu.com/view/1355367.htm
http://en.wikipedia.org/wiki/OpenAL

相关的开发包可上网搜索"OPENAL SDK DOWNLOAD".

以下是一个非常简单示例,我们将播放一段正弦音频。

int main(int argc, char *argv[])
{
InitOpenAL(); // 初始化openal
LoadData(); // 载入WAV数据
Play(); // 播放
UnloadData(); // 卸载WAV数据
ShutdownOpenAL(); // 关闭openal
return ;
}

以上代码不涉及任何OPENAL的东西,只是想先给个OPENAL的使用流程。


接下来我们实现以上列出的五个函数。

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 = ;
ALsizei freq = ;
ALboolean loop = ; // 循环播放
// 使用一段正弦波作数据
short data[];
alGenBuffers(, &Buffer);
float max = SHRT_MAX / ;
float rad = ;
for(short & e : data)
{
e = (short)(max * cosf(rad));
rad += .f;
}
// 载入WAV数据
alBufferData(Buffer, AL_FORMAT_MONO16, data, size, freq);
alGenSources(, &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(, &Buffer);
alDeleteSources(, &Source);
}

3、播放

这里你可以*发挥了,alSourcePlay/alSourceStop/alSourcePause分别是播放、停止、暂停操作。

void Play()
{
// 播放
alSourcePlay(Source);
printf("Press Enter To Stop Sound\n");
getchar();
alSourceStop(Source);
}

4、最后别忘了加上头文件

#include <stdio.h> // for printf
#include <math.h> // for cosf
#include "al.h" // for glXzzz
#include "alc.h" // for glcXzzz

后俩文件需要将OPENAL SDK的 include 目录加入到项目包含路径下。

OpenAl编程入门:播放一段音频的更多相关文章

  1. DirectShow 最简单的入门 -- 播放一段视频

    #include <dshow.h> #pragma comment(lib,"strmbase.lib") #pragma comment(lib,"qua ...

  2. 转载自~浮云比翼&colon;Step by Step:Linux C多线程编程入门&lpar;基本API及多线程的同步与互斥&rpar;

    Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)   介绍:什么是线程,线程的优点是什么 线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可 ...

  3. android如何播放和录制音频

    视频录制功能正在走来,在Androidsdk中有与之相关的类:android.media.MediaRecorder.当然,因为模拟器上没有提供必要的硬件设施,所以在学习过程中并不能实现.Media能 ...

  4. WinPcap编程入门实践

    转自:http://www.cnblogs.com/blacksword/archive/2012/03/19/2406098.html WinPcap可能对大多数人都很陌生,我在这里就先简单介绍一下 ...

  5. 【浅墨著作】《OpenCV3编程入门》内容简单介绍&amp&semi;amp&semi;勘误&amp&semi;amp&semi;配套源码下载

    经过近一年的沉淀和总结,<OpenCV3编程入门>一书最终和大家见面了. 近期有为数不少的小伙伴们发邮件给浅墨建议最好在博客里面贴出这本书的文件夹,方便大家更好的了解这本书的内容.事实上近 ...

  6. S3C2416裸机开发系列19&lowbar;Fatfs播放录像wav音频文件

    S3C2416裸机开发系列19 Fatfs播放录像wav音频文件 国际象棋男孩    1048272975 多媒体资源,一般都是以文件的形式存储在固化存储器中.Fatfs所支持的fat32为windo ...

  7. Python游戏编程入门

    <Python游戏编程入门>这些文章负责整理在这本书中的知识点.注意事项和课后习题的尝试实现.并且对每一个章节给出的最终实例进行分析和注释. 初识pygame:pie游戏pygame游戏库 ...

  8. 脑残式网络编程入门&lpar;三&rpar;:HTTP协议必知必会的一些知识

    本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...

  9. 脑残式网络编程入门&lpar;一&rpar;:跟着动画来学TCP三次握手和四次挥手

    .引言 网络编程中TCP协议的三次握手和四次挥手的问题,在面试中是最为常见的知识点之一.很多读者都知道“三次”和“四次”,但是如果问深入一点,他们往往都无法作出准确回答. 本篇文章尝试使用动画图片的方 ...

随机推荐

  1. user-select

    样式详查    http://www.css88.com/book/css/properties/user-interface/user-select.htm 1, user-select: none ...

  2. iar 错误解决

    使用原来备份的项目可以正确烧写并进入调试状态,但使用新项目则报错,错误提示为Failed to load debugee: E:\工作\项目-农业\KaCES-F\Debug\Exe\kaces.tx ...

  3. SAP 如何查看用户登录信息

    1.首先进入事务代码 SM19  配置审计参数文件 2.选择客户端,用户名,并且勾选过滤激活之后点击细节配置,进入如下界面: 配置完成之后,点击保存. 3.并且可以进入SM20界面,选择要查看的客户端 ...

  4. HDU 5432 Rikka with Tree &lpar;BestCoder Round &num;53 &lpar;div&period;2&rpar;&rpar;

    http://acm.hdu.edu.cn/showproblem.php?pid=5423 题目大意:给你一个树 判断这棵树是否是独特的 一颗树是独特的条件:不存在一颗和它本身不同但相似的树 两颗树 ...

  5. JAVA与C&plus;&plus;的区别和联系

    这篇总结的貌似不错: http://wenku.baidu.com/link?url=VixkWGl0BzUkmceaDJnQeUhzKEIex6poGaKKvMTP87P8a7HTmS5uIi87I ...

  6. vb listview 的常用操作

    常用操作:获取当前行数和列数: MsgBox "行数:" & ListView1.ListItems.Count & "列数:" & L ...

  7. 马拉车算法——求回文串起点hdu3294

    #include<bits/stdc++.h> using namespace std; #define maxn 500005 int p[maxn]; ]; int start; in ...

  8. xml ----&gt&semi; 几个常用dtd头文件模板

    环境: idea ce 2018.1 "File --> settings... --> Editor --> file and code templates" ...

  9. &lpar;转&rpar;go语言nsq源码解读二 nsqlookupd、nsqd与nsqadmin

    转自:http://www.baiyuxiong.com/?p=886 ---------------------------------------------------------------- ...

  10. http和socket之长连接和短连接区别(转)

    TCP/IP TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在传输层中有TCP协议与UDP协议. 在应 ...