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音频库例程的更多相关文章

  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. 【原创】访问Linux进程文件表导致系统异常复位的排查记录

    前提知识: Linux内核.Linux 进程和文件数据结构.vmcore解析.汇编语言 问题背景: 这个问题出自项目的一个安全模块,主要功能是确定某进程是否有权限访问其正在访问的文件. 实现功能时,需 ...

  2. jQuery-UI的使用

    使用效果图: 源码: <!DOCTYPE html><html lang="en"><head> <meta charset=" ...

  3. unfortunately,*********** has stopped及卸载模拟器上的多余不用apk

    虽然不知道是怎么了,但是项目进不去了,害的我一脸雾水,百度了下好像没什么人遇到过这问题,都没找到解决办法,那只好来个简单粗暴的,卸载重新安装apk ,希望有大神知道原因和其他方法的欢迎留言或者评价给出 ...

  4. 【笔记】Python基础六:模块module介绍及常用模块

    一,module模块和包的介绍 1,在Python中,一个.py文件就称之为一个模块(Module). 2,使用模块的好处? 最大的好处是大大提高了代码的可维护性 其次,编写代码不必从零开始,我们编写 ...

  5. python windows环境响铃

    import winsound winsound.Beep(600,1000) #其中600表示声音大小,1000表示发生时长,1000为1秒

  6. Jenkins解析日志(log-parser-plugin)

    Jenkins打包机打包时产生了大量的日志,当报错时,不方便查看error日志 因为日志量太大,查看全部log的时候整个web页面会卡死,所以引用log-parser-plugin可以增加过滤条件显示 ...

  7. 记第一次XSS实战

    前两天偶然挖到一个XSS,在我低谷期的时候给了我些动力,遂写下这篇博客记录 随手在一个搜索框中测试,发现有反应 观察一下标签,需要">把前面的闭合,然后<a 把后面的标签闭合 结 ...

  8. 第五周博客作业 <西北师范大学| 周安伟>

    第五周博客作业 一,助教博客链接https://home.cnblogs.com/u/zaw-315/ 二,本周工作查阅项目汇报,班级微信群.对同学们的中期项目汇报进行查看,解决上周留言问题,对及时出 ...

  9. TZOJ 2289 Help Bob(状压DP)

    描述 Bob loves Pizza but is always out of money. One day he reads in the newspapers that his favorite ...

  10. JavaSE基础知识(5)—面向对象(5.7 final关键字)

    一.说明 final属于一种修饰符,可以用于修饰类和属性.方法.局部变量 二.特点 1.修饰类 该类不能被继承,如String.Integer等 2.修饰方法 该方法不能被重写 3.修饰变量(属性和局 ...