Windows下C++可用的OpenAL demo。

  基于alut工具库的OpenAL例程,涵盖了基本的OpenAL指令,对部分作出了注释,并且可以播放(当然得把对应的音频文件放到正确的路径下)。

  1. #include <iostream>
  2. #include <al/alut.h>//alut includes al.h
  3. #include <math.h>
  4. #include <windows.h>
  5. using namespace std;
  6.  
  7. #define PI 3.14159265359
  8.  
  9. #define TEST_ERROR(_msg) \
  10. error = alGetError(); \
  11. if (error != AL_NO_ERROR) { \
  12. fprintf(stderr, _msg "\n"); \
  13. return -; \
  14. }
  15.  
  16. //ALboolean EnableSource2 = AL_TRUE; //是否播放第二组声音
  17. ALboolean EnableSource2 = AL_FALSE; //是否播放第二组声音
  18. ALboolean EnableSource3 = AL_FALSE; //是否播放第三组声音
  19.  
  20. ALuint buffer2,buffer3;
  21.  
  22. void Init(){
  23. alutInit(NULL, NULL);
  24. }
  25.  
  26. //OS音量40,windows7
  27. void main()
  28. {
  29. ALuint source1[]; //buffer source
  30.  
  31. //Init();//分离到一个单独的函数或类成员中
  32. alutInit(NULL, NULL);
  33.  
  34. //ALuint source1;
  35. alGenSources(, &source1[]);
  36. //短哔声:10217,Music:RevolvingDoorMONO,中国军魂
  37. ALuint buffer1 = alutCreateBufferFromFile("RevolvingDoorMONO.WAV");//要实现空间化效果,必须为单声道文件(monaural)RevolvingDoorMONO
  38.  
  39. if ((alGetError()) != AL_NO_ERROR)std::cout << "Buffer Create error!" << std::endl;
  40.  
  41. alSourcei(source1[], AL_BUFFER, buffer1);
  42.  
  43. if (EnableSource2){
  44. alGenSources(, &source1[]);
  45. buffer2 = alutCreateBufferFromFile("E:\\VS2013\\Projects2013\\OpenALtest\\OpenALtest\\10217.WAV");
  46. alSourcei(source1[], AL_BUFFER, buffer2);
  47. alSourcePlay(source1[]);
  48. alSourcei(source1[], AL_LOOPING, AL_TRUE);//第二个音频是否循环
  49. }
  50.  
  51. if (EnableSource3){
  52. alGenSources(, &source1[]);
  53. ALuint temp = buffer1;
  54. alSourcei(source1[], AL_BUFFER, temp);
  55. alSourcePlay(source1[]);
  56. alSourcei(source1[], AL_LOOPING, AL_TRUE);//第二个音频是否循环
  57. }
  58.  
  59. alSourcei(source1[], AL_SOURCE_RELATIVE, ); // set to relative positioning so we can set everything to 0
  60. if ((alGetError()) != AL_NO_ERROR)std::cout << "AL_SOURCE_RELATIVE error" << std::endl;
  61. /*AL_SOURCE_RELATIVE设为1时,没有衰减,也没有空间化。
  62. */
  63.  
  64. alSourcef(source1[], AL_ROLLOFF_FACTOR, 1.0); // 0 to disable attenuation 滚降衰减模型
  65. /*AL_ROLLOFF_FACTOR设为1时,开启衰减,设为0时,没有衰减
  66. */
  67.  
  68. if ((alGetError()) != AL_NO_ERROR)std::cout << "AL_ROLLOFF_FACTOR error" << std::endl;
  69. alSourcef(source1[], AL_REFERENCE_DISTANCE, ); // doesn't matter
  70.  
  71. alSourcef(source1[], AL_MAX_DISTANCE, .f);//超过AL_MAX_DISTANCE个单位后,将声音gain值限制在AL_MIN_GAIN(如果在cone之外,好像是再乘以AL_MIN_GAIN)
  72. alSourcef(source1[], AL_MIN_GAIN, 0.0f);//设置AL_MIN_GAIN
  73. alSourcef(source1[], AL_MAX_GAIN, .f);//设置AL_MAX_GAIN,即使设得比1大,也会自动回成1,并报输出ERROR
  74.  
  75. alDistanceModel(AL_INVERSE_DISTANCE);//距离模型
  76. //alDistanceModel(AL_NONE);//距离模型
  77. //gain = AL_REFERENCE_DISTANCE / (AL_REFERENCE_DISTANCE + AL_ROLLOFF_FACTOR * (distance – AL_REFERENCE_DISTANCE));
  78.  
  79. alSourcef(source1[], AL_PITCH, .f);//调节音高乘数
  80. if ((alGetError()) != AL_NO_ERROR)std::cout << "AL_PITCH error" << std::endl;
  81. alSourcef(source1[], AL_GAIN, .f);//调节音量,但是受AL_MIN_GAIN影响,即使设得比min低,实际gain也会保持min设的值
  82. if ((alGetError()) != AL_NO_ERROR)std::cout << "AL_GAIN error" << std::endl;
  83.  
  84. //set source direction
  85. alSource3f(source1[], AL_DIRECTION, .f, .f, .f);//朝z轴正方向
  86. //set source position
  87. alSource3f(source1[], AL_POSITION, .f, .f, .f);//初始位置为原点
  88. //set source velocity
  89. alSource3f(source1[], AL_VELOCITY, .f, .f, .f);//多普勒效应影响频率
  90.  
  91. alSourcef(source1[], AL_CONE_OUTER_GAIN, 0.0f);//the gain when outside the oriented cone
  92. if ((alGetError()) != AL_NO_ERROR)std::cout << "AL_CONE_OUTER_GAIN error" << std::endl;
  93. alSourcef(source1[], AL_CONE_INNER_ANGLE, .f);//内角 *PI / 180.f
  94. if ((alGetError()) != AL_NO_ERROR)std::cout << "AL_CONE_INNER_ANGLE error" << std::endl;
  95. alSourcef(source1[], AL_CONE_OUTER_ANGLE, .f);
  96. if ((alGetError()) != AL_NO_ERROR)std::cout << "AL_CONE_OUTER_ANGLE error" << std::endl;
  97.  
  98. //set current listener position
  99. alListener3f(AL_POSITION, -.f,.f,.f);
  100. //-1.f,0.f,1.f 监听者在左,右耳音量较大
  101. //1.f,0.f,1.f 监听者在右,左耳音量较大
  102. //0.f,0.f,-1.f 监听者在后,在外角之外,声音为原来的AL_CONE_OUTER_GAIN倍,好像还要乘以AL_MIN_GAIN系数
  103.  
  104. //set current listener orientation
  105. ALfloat orivec[] = { 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f };
  106. alListenerfv(AL_ORIENTATION, orivec);
  107. //设置好listener位置
  108. //////////////////////////////////////////////////////////////////////////
  109.  
  110. //tell the sound to loop continuously
  111. alSourcei(source1[], AL_LOOPING, AL_TRUE);
  112.  
  113. //play the sound
  114. alSourcePlay(source1[]);//have its state changed to AL_PLAYING,重新播放
  115.  
  116. ALfloat gain,outer_gain,min_gain,max_gain,max_distance;
  117. alGetSourcef(source1[], AL_GAIN, &gain); std::cout << "AL_GAIN: " << gain << std::endl;
  118. alGetSourcef(source1[], AL_CONE_OUTER_GAIN, &outer_gain); std::cout << "AL_CONE_OUTER_GAIN: " << outer_gain << std::endl;
  119. alGetSourcef(source1[], AL_MIN_GAIN, &min_gain); std::cout << "AL_MIN_GAIN: " << min_gain << std::endl;
  120. alGetSourcef(source1[], AL_MAX_GAIN, &max_gain); std::cout << "AL_MAX_GAIN: " << max_gain << std::endl;
  121. alGetSourcef(source1[], AL_MAX_DISTANCE, &max_distance); std::cout << "AL_MAX_DISTANCE: " << max_distance << std::endl;
  122. std::cout << std::endl << "在音锥外角和最远衰减距离之外 gain * outer_gain * min_gain: " << gain*outer_gain*min_gain << std::endl;
  123. std::cout << std::endl;
  124.  
  125. ALint sourceID;
  126. alGetSourcei(source1[], AL_SOURCE_TYPE, &sourceID);
  127. std::cout << "AL_SOURCE_TYPE的ID: "<<sourceID << endl<<endl;
  128.  
  129. ALint state;
  130. ALfloat tick = ;
  131. ALfloat moveStart_posx = -.f, moveStart_posy = .f, moveStart_posz = .f;
  132. do{
  133. std::cout << "playing......" << "\b\b\b\b\b\b\b\b\b\b\b\b\b";
  134.  
  135. ////旋转音锥
  136. //float updatex = -sinf(play_it*PI / 180.f);
  137. //float upadtez = cosf(play_it*PI / 180.f);
  138. //alSource3f(source1, AL_DIRECTION, updatex, 0.f, upadtez);
  139. //if ((alGetError()) != AL_NO_ERROR)std::cout << "AL_POSITION error" << std::endl;
  140. //play_it=play_it+0.1f;
  141.  
  142. ////平移声源
  143. //alSource3f(source1, AL_POSITION, moveStart_posx, moveStart_posy, moveStart_posz);
  144. //moveStart_posx = moveStart_posx + 0.00000011f; moveStart_posz = moveStart_posz + 0.00000015f;
  145.  
  146. alGetSourcei(source1[], AL_SOURCE_STATE, &state);
  147.  
  148. //是否播第二个音频资源
  149. if (EnableSource2)
  150. alGetSourcei(source1[], AL_SOURCE_STATE, &state);
  151.  
  152. if (EnableSource3)
  153. alGetSourcei(source1[], AL_SOURCE_STATE, &state);
  154.  
  155. } while (state == AL_PLAYING || state==AL_PAUSED);//结束时state自动变成AL_STOPPED,source1、2共享一个state
  156.  
  157. // To stop the sound
  158. alSourceStop(source1[]);
  159. //delete our source
  160. alDeleteSources(, &source1[]);
  161. ////delete our buffer
  162. alDeleteBuffers(, &buffer1);
  163. if ((alGetError()) != AL_NO_ERROR)std::cout << "delete buffer1 error " << std::endl;
  164.  
  165. if (EnableSource2){
  166. alSourceStop(source1[]);
  167. alDeleteBuffers(, &buffer2);
  168. if ((alGetError()) != AL_NO_ERROR)std::cout << "delete buffer2 error" << std::endl;
  169. alDeleteSources(, &source1[]);
  170. if ((alGetError()) != AL_NO_ERROR)std::cout << "delete source error" << std::endl;
  171. }
  172. }

OpenAL音频库例程的更多相关文章

  1. Waud.js – 使用HTML5降级处理的Web音频库

    Waud.js 是一个Web音频库,有一个HTML5音频降级处理方案. 它允许您利用Web音频API为你的Web应用程序控制音频功能.在不支持Web音频API的非现代浏览器使用HTML5音频降级方案. ...

  2. 移植eac3音频库

    2016-5-26 移植eac3音频库,从ffmpeg库中移植.经过验证是切实可行的. 感觉开源软件就是时间黑洞,有多少时间搭进去都不为过.已经3周过去了,ffmpeg还是没有熟悉完. 真正的移植工作 ...

  3. Simple2D-18(音乐播放器)使用 bass 音频库

    BASS 简介 BASS是一个在多个平台上用于软件的音频库.其目的是为开发人员提供功能强大且高效的示例流(MP3,MP2,MP1,OGG,WAV,AIFF),MOD 音乐(XM,IT,S3M,MOD ...

  4. < python音频库:Windows下pydub安装配置、过程出现的问题及常用API >

    < python音频库:Windows下pydub安装配置.过程出现的问题及常用API > 背景 刚从B站上看过倒放挑战之后也想体验下,心血来潮一个晚上完成了基本的实现.其中倒放与播放部分 ...

  5. Linux ALSA 音频库 配置和使用

    ALSA应用库是核心功能,而alsa-utils是一些工具功能集合库.单纯地播放一个wav文件,使用alsa-utils即可,如果还需要合成音频.调试音频质量,那么就需要ALSA应用库. 欲安装使用A ...

  6. Linux ALSA音频库(二) 环境测试+音频合成+语音切换 项目代码分享

    1. 环境测试 alsa_test.c #include <alsa/asoundlib.h> #include <stdio.h> // 官方测试代码, 运行后只要有一堆信息 ...

  7. 运行时库例程-acc_get_num_devices

    格式C 或 C++: int acc_get_num_devices( acc_device_t ); 描述例程 acc_get_num_devices 返回主机上指定类型的加速器设备数量.输入参数说 ...

  8. OpenAL音频播放

    // // OpenALPlayer.m // live // // Created by lujunjie on 2016/11/5. // Copyright © 2016年 lujunjie. ...

  9. C# BASS音频库 + 频谱基本用法

    效果图: 使用了 BASS.dll.  BASS.NET.dll   和  PeakMeterCtrl.dll 前面两个负责播放   最后一个负责绘制频谱,本文重点讲的是频谱部分,播放音频部分注意一点 ...

随机推荐

  1. whereis命令详解

    1.简介: whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返回所有信息. 和find相比,whereis ...

  2. VS code自定义用户代码片段snippet

    打开VS code,“文件-首选项-用户代码片段-选择新建全局代码片段文件 “ 属性介绍:prefix   就是你自定义的快捷键 body    就是你自定义的代码片段 description 就是这 ...

  3. 问题:页面输出正常,php写入sqlserver乱码/空白。

    问题一:php连接sqlsever2005,输入中文,然后查询sqlserver中对应的数据,由于提交中文是UTF-8,而sqlserver的中文为GBK,所以字段无法匹配,没有查询结果. 问题二,p ...

  4. OGRE Tutorials 1

    [Guide to building OGRE] 1.Preparing the build environment You should now create a build directory f ...

  5. 每日笔记-redis的理解及相关应用

    原文链接:常见面试题 本文大纲与之类似,在其基础上加入了自己在实际项目中对部分知识点的理解 Q1:谈谈对redis的理解 Q2:谈谈实际应用中怎么用redis的 2.1 缓存 2.2 分布式锁 2.3 ...

  6. Java第一周作业

    Java第一周作业 本周作业: 参考<<教材学习指导(http://www.cnblogs.com/rocedu/p/7911138.html)) 学习第一章视频 参考<<使用 ...

  7. Ubuntu iso下载地址(14、16、18)

    Ubuntu镜像,快速下载 ubuntu 14.04: http://mirrors.aliyun.com/ubuntu-releases/14.04/ubuntu 16.04: http://mir ...

  8. Python小白自问自答

    1. 问:python怎么查看命令的含义和用法? 答:查一些简单命令的含义以及用法,直接help(命令)就行了.例如直接输入help(input),这表示查input的用法. 例子如下: help(p ...

  9. Swift UITableView嵌套UICollectionView点击事件冲突(点击事件穿透)

    不管是啥都响应tableviewcell class JYShopCertificationCell: UITableViewCell { override func hitTest(_ point: ...

  10. django xadmin拓展User模型

    django提供四种拓展模型的方法: 1.代理模型 2.Profile拓展模型User 3.AbstractBaseUser拓展模型User 4.AbstractUser拓展模型 之前想通过第四种方法 ...