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. 贝叶斯公式与最大后验估计(MAP)

    1, 频率派思想 频率派思想认为概率乃事情发生的频率,概率是一固定常量,是固定不变的 2, 最大似然估计 假设有100个水果由苹果和梨混在一起,具体分配比例未知,于是你去随机抽取10次,抽到苹果标记为 ...

  2. UI测试和GUI测试的区别

    UI 测试 包含GUI测试和command line 测试 分享连接 https://www.ranorex.com/resources/testing-wiki/gui-testing/

  3. FileStream说明

    FileStream(String, FileMode)    FileStream(String path, FileMode) 文件打开模式:(FileMode)包括6个枚举 Append:追加  ...

  4. C语言数据结构_严蔚敏+吴伟民 课本源码

    http://www.cnblogs.com/kangjianwei101/category/791617.html

  5. js判断访问浏览器是安卓还是ios还是微信浏览器还是微博

    var u = navigator.userAgent, app = navigator.appVersion; var isAndroid = u.indexOf('Android') > - ...

  6. Java框架spring Boot学习笔记(六):Spring Boot事务管理

    SpringBoot和Java框架spring 学习笔记(十九):事务管理(注解管理)所讲的类似,使用@Transactional注解便可以轻松实现事务管理.

  7. Python学习—数据库篇之SQL补充

    一.SQL注入问题 在使用pymysql进行信息查询时,推荐使用传参的方式,禁止使用字符串拼接方式,因为字符串拼接往往会带来sql注入的问题 # -*- coding:utf-8 -*- # auth ...

  8. 15. 3Sum (JAVA)

    Given an array nums of n integers, are there elements a, b, cin nums such that a + b + c = 0? Find a ...

  9. oracle 按表数据新增一行

    在功能实现时,能尽量用一个sql语句直接实现业务逻辑的话,就不要去写C#代码,便于维护. 以下sql的逻辑是:给明细表新增一条数据,前提是传入的债券代码存在与债券表,否则不新增.此sql返回受影响行数 ...

  10. [BZOJ2252]矩阵距离(BFS)

    题意 输入矩阵m行n列(m<=500,n<=500),只含0.1,输出离每个元素距离最近的1的距离,其中距离定义为D(aij,akl)=abs(i-k)+abs(j-l). 示例: 输入: ...