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. 2017-11-10 Fr Oct 消参

    2017-11-04 Sa $ P(-3, 0) $ 在圆C $ (x-3)^2 + y^2 = 8^2 $ 内,动圆M与圆相切且过P点,求M点轨迹. 设切点 $ A(a, b) $,圆心 \(M(x ...

  2. Ubuntu搜狗拼音输入法崩溃问题

    Ubuntu 14.04.5 LTS 环境下搜狗拼音经常崩溃,似乎也没有什么特别好的解决办法. 以下是重启命令 #!/bin/sh >/dev/>& >/dev/>&a ...

  3. 史上最全最详细的环境搭建教程,行百里者手把手教你在windows下搭建Anaconda+pycharm+库文件(TensorFlow,numpy)环境搭建

    我是在搭建TensorFlow开发环境的道路上走了很多弯路 掉了很多头发,为了让广大同学们不在受苦受累 下面我将手把手教你学习如特快速搭建python环境 快速导入numpy,PIL,pillow,等 ...

  4. Linux 日常用法

    1.ubuntu 中安装vim http://jingyan.baidu.com/article/046a7b3efd165bf9c27fa915.html 2.linux 系统中安装SSH http ...

  5. mui-H5获取当前手机通讯录

    mui.plusReady(function() { // 扩展API加载完毕,现在可以正常调用扩展API plus.contacts.getAddressBook(plus.contacts.ADD ...

  6. python的apidoc使用

    一.apidoc的安装 npm install apidoc -g -g参数表示全局安装,这样在哪儿都能使用. 二.apidoc在python接口代码中的使用 def index(): "& ...

  7. eclipse invalid zip archive lib

    eclipse invalid zip archive lib 修改.class文件的编译内容.删除license或找到相应的jar包,放到lib下面,重新编译.

  8. python中类中的@property

    @property考察 Student 类: class Student(object): def __init__(self, name, score): self.name = name self ...

  9. 19-02【mac电脑操作】最小化应用程序

    最小化应用程序 windows下很简单,直接使用windows+M即可: mac电脑下,官方建议是:option+command+m+h.但实际使用的时候,这个快捷键并不好使: 解决方案:mac系统设 ...

  10. HDU 1522 Marriage is Stable 稳定婚姻匹配

    http://acm.hdu.edu.cn/showproblem.php?pid=1522 #include<bits/stdc++.h> #define INF 0x3f3f3f3f ...