OpenAL音频库例程
Windows下C++可用的OpenAL demo。
基于alut工具库的OpenAL例程,涵盖了基本的OpenAL指令,对部分作出了注释,并且可以播放(当然得把对应的音频文件放到正确的路径下)。
- #include <iostream>
- #include <al/alut.h>//alut includes al.h
- #include <math.h>
- #include <windows.h>
- using namespace std;
- #define PI 3.14159265359
- #define TEST_ERROR(_msg) \
- error = alGetError(); \
- if (error != AL_NO_ERROR) { \
- fprintf(stderr, _msg "\n"); \
- return -; \
- }
- //ALboolean EnableSource2 = AL_TRUE; //是否播放第二组声音
- ALboolean EnableSource2 = AL_FALSE; //是否播放第二组声音
- ALboolean EnableSource3 = AL_FALSE; //是否播放第三组声音
- ALuint buffer2,buffer3;
- void Init(){
- alutInit(NULL, NULL);
- }
- //OS音量40,windows7
- void main()
- {
- ALuint source1[]; //buffer source
- //Init();//分离到一个单独的函数或类成员中
- alutInit(NULL, NULL);
- //ALuint source1;
- alGenSources(, &source1[]);
- //短哔声:10217,Music:RevolvingDoorMONO,中国军魂
- ALuint buffer1 = alutCreateBufferFromFile("RevolvingDoorMONO.WAV");//要实现空间化效果,必须为单声道文件(monaural)RevolvingDoorMONO
- if ((alGetError()) != AL_NO_ERROR)std::cout << "Buffer Create error!" << std::endl;
- alSourcei(source1[], AL_BUFFER, buffer1);
- if (EnableSource2){
- alGenSources(, &source1[]);
- buffer2 = alutCreateBufferFromFile("E:\\VS2013\\Projects2013\\OpenALtest\\OpenALtest\\10217.WAV");
- alSourcei(source1[], AL_BUFFER, buffer2);
- alSourcePlay(source1[]);
- alSourcei(source1[], AL_LOOPING, AL_TRUE);//第二个音频是否循环
- }
- if (EnableSource3){
- alGenSources(, &source1[]);
- ALuint temp = buffer1;
- alSourcei(source1[], AL_BUFFER, temp);
- alSourcePlay(source1[]);
- alSourcei(source1[], AL_LOOPING, AL_TRUE);//第二个音频是否循环
- }
- alSourcei(source1[], AL_SOURCE_RELATIVE, ); // set to relative positioning so we can set everything to 0
- if ((alGetError()) != AL_NO_ERROR)std::cout << "AL_SOURCE_RELATIVE error" << std::endl;
- /*AL_SOURCE_RELATIVE设为1时,没有衰减,也没有空间化。
- */
- alSourcef(source1[], AL_ROLLOFF_FACTOR, 1.0); // 0 to disable attenuation 滚降衰减模型
- /*AL_ROLLOFF_FACTOR设为1时,开启衰减,设为0时,没有衰减
- */
- if ((alGetError()) != AL_NO_ERROR)std::cout << "AL_ROLLOFF_FACTOR error" << std::endl;
- alSourcef(source1[], AL_REFERENCE_DISTANCE, ); // doesn't matter
- alSourcef(source1[], AL_MAX_DISTANCE, .f);//超过AL_MAX_DISTANCE个单位后,将声音gain值限制在AL_MIN_GAIN(如果在cone之外,好像是再乘以AL_MIN_GAIN)
- alSourcef(source1[], AL_MIN_GAIN, 0.0f);//设置AL_MIN_GAIN
- alSourcef(source1[], AL_MAX_GAIN, .f);//设置AL_MAX_GAIN,即使设得比1大,也会自动回成1,并报输出ERROR
- alDistanceModel(AL_INVERSE_DISTANCE);//距离模型
- //alDistanceModel(AL_NONE);//距离模型
- //gain = AL_REFERENCE_DISTANCE / (AL_REFERENCE_DISTANCE + AL_ROLLOFF_FACTOR * (distance – AL_REFERENCE_DISTANCE));
- alSourcef(source1[], AL_PITCH, .f);//调节音高乘数
- if ((alGetError()) != AL_NO_ERROR)std::cout << "AL_PITCH error" << std::endl;
- alSourcef(source1[], AL_GAIN, .f);//调节音量,但是受AL_MIN_GAIN影响,即使设得比min低,实际gain也会保持min设的值
- if ((alGetError()) != AL_NO_ERROR)std::cout << "AL_GAIN error" << std::endl;
- //set source direction
- alSource3f(source1[], AL_DIRECTION, .f, .f, .f);//朝z轴正方向
- //set source position
- alSource3f(source1[], AL_POSITION, .f, .f, .f);//初始位置为原点
- //set source velocity
- alSource3f(source1[], AL_VELOCITY, .f, .f, .f);//多普勒效应影响频率
- alSourcef(source1[], AL_CONE_OUTER_GAIN, 0.0f);//the gain when outside the oriented cone
- if ((alGetError()) != AL_NO_ERROR)std::cout << "AL_CONE_OUTER_GAIN error" << std::endl;
- alSourcef(source1[], AL_CONE_INNER_ANGLE, .f);//内角 *PI / 180.f
- if ((alGetError()) != AL_NO_ERROR)std::cout << "AL_CONE_INNER_ANGLE error" << std::endl;
- alSourcef(source1[], AL_CONE_OUTER_ANGLE, .f);
- if ((alGetError()) != AL_NO_ERROR)std::cout << "AL_CONE_OUTER_ANGLE error" << std::endl;
- //set current listener position
- alListener3f(AL_POSITION, -.f,.f,.f);
- //-1.f,0.f,1.f 监听者在左,右耳音量较大
- //1.f,0.f,1.f 监听者在右,左耳音量较大
- //0.f,0.f,-1.f 监听者在后,在外角之外,声音为原来的AL_CONE_OUTER_GAIN倍,好像还要乘以AL_MIN_GAIN系数
- //set current listener orientation
- ALfloat orivec[] = { 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f };
- alListenerfv(AL_ORIENTATION, orivec);
- //设置好listener位置
- //////////////////////////////////////////////////////////////////////////
- //tell the sound to loop continuously
- alSourcei(source1[], AL_LOOPING, AL_TRUE);
- //play the sound
- alSourcePlay(source1[]);//have its state changed to AL_PLAYING,重新播放
- ALfloat gain,outer_gain,min_gain,max_gain,max_distance;
- alGetSourcef(source1[], AL_GAIN, &gain); std::cout << "AL_GAIN: " << gain << std::endl;
- alGetSourcef(source1[], AL_CONE_OUTER_GAIN, &outer_gain); std::cout << "AL_CONE_OUTER_GAIN: " << outer_gain << std::endl;
- alGetSourcef(source1[], AL_MIN_GAIN, &min_gain); std::cout << "AL_MIN_GAIN: " << min_gain << std::endl;
- alGetSourcef(source1[], AL_MAX_GAIN, &max_gain); std::cout << "AL_MAX_GAIN: " << max_gain << std::endl;
- alGetSourcef(source1[], AL_MAX_DISTANCE, &max_distance); std::cout << "AL_MAX_DISTANCE: " << max_distance << std::endl;
- std::cout << std::endl << "在音锥外角和最远衰减距离之外 gain * outer_gain * min_gain: " << gain*outer_gain*min_gain << std::endl;
- std::cout << std::endl;
- ALint sourceID;
- alGetSourcei(source1[], AL_SOURCE_TYPE, &sourceID);
- std::cout << "AL_SOURCE_TYPE的ID: "<<sourceID << endl<<endl;
- ALint state;
- ALfloat tick = ;
- ALfloat moveStart_posx = -.f, moveStart_posy = .f, moveStart_posz = .f;
- do{
- std::cout << "playing......" << "\b\b\b\b\b\b\b\b\b\b\b\b\b";
- ////旋转音锥
- //float updatex = -sinf(play_it*PI / 180.f);
- //float upadtez = cosf(play_it*PI / 180.f);
- //alSource3f(source1, AL_DIRECTION, updatex, 0.f, upadtez);
- //if ((alGetError()) != AL_NO_ERROR)std::cout << "AL_POSITION error" << std::endl;
- //play_it=play_it+0.1f;
- ////平移声源
- //alSource3f(source1, AL_POSITION, moveStart_posx, moveStart_posy, moveStart_posz);
- //moveStart_posx = moveStart_posx + 0.00000011f; moveStart_posz = moveStart_posz + 0.00000015f;
- alGetSourcei(source1[], AL_SOURCE_STATE, &state);
- //是否播第二个音频资源
- if (EnableSource2)
- alGetSourcei(source1[], AL_SOURCE_STATE, &state);
- if (EnableSource3)
- alGetSourcei(source1[], AL_SOURCE_STATE, &state);
- } while (state == AL_PLAYING || state==AL_PAUSED);//结束时state自动变成AL_STOPPED,source1、2共享一个state
- // To stop the sound
- alSourceStop(source1[]);
- //delete our source
- alDeleteSources(, &source1[]);
- ////delete our buffer
- alDeleteBuffers(, &buffer1);
- if ((alGetError()) != AL_NO_ERROR)std::cout << "delete buffer1 error " << std::endl;
- if (EnableSource2){
- alSourceStop(source1[]);
- alDeleteBuffers(, &buffer2);
- if ((alGetError()) != AL_NO_ERROR)std::cout << "delete buffer2 error" << std::endl;
- alDeleteSources(, &source1[]);
- if ((alGetError()) != AL_NO_ERROR)std::cout << "delete source error" << std::endl;
- }
- }
OpenAL音频库例程的更多相关文章
- Waud.js – 使用HTML5降级处理的Web音频库
Waud.js 是一个Web音频库,有一个HTML5音频降级处理方案. 它允许您利用Web音频API为你的Web应用程序控制音频功能.在不支持Web音频API的非现代浏览器使用HTML5音频降级方案. ...
- 移植eac3音频库
2016-5-26 移植eac3音频库,从ffmpeg库中移植.经过验证是切实可行的. 感觉开源软件就是时间黑洞,有多少时间搭进去都不为过.已经3周过去了,ffmpeg还是没有熟悉完. 真正的移植工作 ...
- Simple2D-18(音乐播放器)使用 bass 音频库
BASS 简介 BASS是一个在多个平台上用于软件的音频库.其目的是为开发人员提供功能强大且高效的示例流(MP3,MP2,MP1,OGG,WAV,AIFF),MOD 音乐(XM,IT,S3M,MOD ...
- < python音频库:Windows下pydub安装配置、过程出现的问题及常用API >
< python音频库:Windows下pydub安装配置.过程出现的问题及常用API > 背景 刚从B站上看过倒放挑战之后也想体验下,心血来潮一个晚上完成了基本的实现.其中倒放与播放部分 ...
- Linux ALSA 音频库 配置和使用
ALSA应用库是核心功能,而alsa-utils是一些工具功能集合库.单纯地播放一个wav文件,使用alsa-utils即可,如果还需要合成音频.调试音频质量,那么就需要ALSA应用库. 欲安装使用A ...
- Linux ALSA音频库(二) 环境测试+音频合成+语音切换 项目代码分享
1. 环境测试 alsa_test.c #include <alsa/asoundlib.h> #include <stdio.h> // 官方测试代码, 运行后只要有一堆信息 ...
- 运行时库例程-acc_get_num_devices
格式C 或 C++: int acc_get_num_devices( acc_device_t ); 描述例程 acc_get_num_devices 返回主机上指定类型的加速器设备数量.输入参数说 ...
- OpenAL音频播放
// // OpenALPlayer.m // live // // Created by lujunjie on 2016/11/5. // Copyright © 2016年 lujunjie. ...
- C# BASS音频库 + 频谱基本用法
效果图: 使用了 BASS.dll. BASS.NET.dll 和 PeakMeterCtrl.dll 前面两个负责播放 最后一个负责绘制频谱,本文重点讲的是频谱部分,播放音频部分注意一点 ...
随机推荐
- whereis命令详解
1.简介: whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返回所有信息. 和find相比,whereis ...
- VS code自定义用户代码片段snippet
打开VS code,“文件-首选项-用户代码片段-选择新建全局代码片段文件 “ 属性介绍:prefix 就是你自定义的快捷键 body 就是你自定义的代码片段 description 就是这 ...
- 问题:页面输出正常,php写入sqlserver乱码/空白。
问题一:php连接sqlsever2005,输入中文,然后查询sqlserver中对应的数据,由于提交中文是UTF-8,而sqlserver的中文为GBK,所以字段无法匹配,没有查询结果. 问题二,p ...
- OGRE Tutorials 1
[Guide to building OGRE] 1.Preparing the build environment You should now create a build directory f ...
- 每日笔记-redis的理解及相关应用
原文链接:常见面试题 本文大纲与之类似,在其基础上加入了自己在实际项目中对部分知识点的理解 Q1:谈谈对redis的理解 Q2:谈谈实际应用中怎么用redis的 2.1 缓存 2.2 分布式锁 2.3 ...
- Java第一周作业
Java第一周作业 本周作业: 参考<<教材学习指导(http://www.cnblogs.com/rocedu/p/7911138.html)) 学习第一章视频 参考<<使用 ...
- Ubuntu iso下载地址(14、16、18)
Ubuntu镜像,快速下载 ubuntu 14.04: http://mirrors.aliyun.com/ubuntu-releases/14.04/ubuntu 16.04: http://mir ...
- Python小白自问自答
1. 问:python怎么查看命令的含义和用法? 答:查一些简单命令的含义以及用法,直接help(命令)就行了.例如直接输入help(input),这表示查input的用法. 例子如下: help(p ...
- Swift UITableView嵌套UICollectionView点击事件冲突(点击事件穿透)
不管是啥都响应tableviewcell class JYShopCertificationCell: UITableViewCell { override func hitTest(_ point: ...
- django xadmin拓展User模型
django提供四种拓展模型的方法: 1.代理模型 2.Profile拓展模型User 3.AbstractBaseUser拓展模型User 4.AbstractUser拓展模型 之前想通过第四种方法 ...