OpenAL跨平台音效API的安装与移植 

zouxy09@qq.com

http://blog.csdn.net/zouxy09

OpenAL(Open Audio Library)是自由软件界的跨平台音效API。它设计给多通道三维位置音效的特效表现。其 API 风格模仿自 OpenGL。

OpenAL 最初是由 Loki Software 所开发。是为了将 Windows 商业游戏移植到 Linux 上。Loki 倒闭以后,这个专案由自由软件/开放源始码社群继续维护。不过现在最大的主导者(并大量发展)是创新科技,并得到来自 Apple 和自由软件/开放源代码爱好者的持续支援。

OpenAL 主要的功能是在来源物体、音效缓冲和收听者中编码。来源物体包含一个指向缓冲区的指标、声音的速度、位置和方向,以及声音强度。收听者物体包含收听者的速度、位置和方向,以及全部声音的整体增益。缓冲里包含 8 或 16 位元、单声道或立体声 PCM 格式的音效资料,表现引擎进行所有必要的计算,如距离衰减、多普勒效应等。

不同于 OpenGL 规格,OpenAL 规格包含两个API分支;以实际 OpenAL 函式组成的核心,和 ALC API,ALC 用于管理表现内容、资源使用情况,并将跨平台风格封在其中。还有“ALUT”程式库,提供高阶“易用”的函式,其定位相当于 OpenGL 的 GLUT。

OpenAL官网:http://www.openal.org/

OpenAL 下载:

到http://connect.creativelabs.com/openal/Downloads/Forms/AllItems.aspx

下载两个东西:

freealut-1.1.0.tar.gz,openal-soft-1.8.466.tar.bz2

下面在PC机和ARM开发板上安装运行OpenAL:

先移植openAL基础库:

一、编译在PC机上运行:
1、解压openal-soft-1.13.tar(可以查看目录下的README和INSTALL文件来了解编译和安装步骤)
2、进入这个目录,再进入build目录,执行cmake.. 就可以检查系统条件和生成makefile文件了,注意要先安装cmake,要求2.6版本以上(ubantu上可以执行apt-get install cmake,其他发行版的话,可能要下载cmake源码回来编译安装),再执行make生成相应库,make install把想要头文件和库安装到指定目录,一般是/usr/local/lib
3、在官网上提供了一个mpstream.c的例子,是通过调用mplayer来播放音乐的,我们可以编译它: gcc -o mpstream mpstream.c -lopenal -lasound –lpthread注意要链接后面三个库,打开源文件可以看出他是通过新建一个子线程来调用mplayer的,所以要加上线程库,还有前面的就是openal和ALSA驱动的库。
4、拷贝一个MP3文件到此目录下,例如love.mp3,再执行./mpstream love.mp3就可以调用mplayer来播放音乐了。

二、编译在开发板上运行:
1、解压openal-soft-1.13.tar
2、在主目录下有一个Xcompile.txt文件,用于添加附件编译选项的,我们也是要通过引入这个文件来完成交叉编译。修改这个文件,这个文件里面有修改说明,我修改后的文件内容为:修改过的地方用红色标注:
# Cross-compiling requires CMake 2.6 or newer. To cross-compile, first modify

# this file to set the proper settings and paths. Then use it from build/ like:

# cmake .. -DCMAKE_TOOLCHAIN_FILE=../XCompile.txt \

#  -DCMAKE_INSTALL_PREFIX=/usr/local/arm-2009q1/bin/arm-none-linux-gnueabi-gcc

# If you already have a toolchain file setup, you may use that instead of this file.

# the name of the target operating system

SET(CMAKE_SYSTEM_NAMELinux)

# which compilers to use for C and C++

SET(CMAKE_C_COMPILERarm-none-linux-gnueabi-gcc)

SET(CMAKE_CXX_COMPILERarm-none-linux-gnueabi-g++)

# here is the target environment located

SET(CMAKE_FIND_ROOT_PATH/usr/local/arm-2009q1/bin/arm-none-linux-gnueabi-gcc)

# adjust the default behaviour of the FIND_XXX() commands:

# search headers and libraries in the target environment, search

# programs in the host environment

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)

set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
3、进入build目录下,执行cmake ..-DCMAKE_TOOLCHAIN_FILE=../XCompile.txt,这样就可以生成满足交叉编译的makefile,然后再make make install一下,就可以把库安装到了/usr/local/lib下了(也可以自己指定);注意,这样的话会覆盖原来的库,所以假如还要编译PC机上的话,就还需要到上面编译在PC的文件夹里面再make install一下就可以了。
4、我们再把相应的头文件和生成的库拷贝到交叉编译工具的相应目录下:
cp /usr/local/lib/libopenal* /usr/local/arm-2009q1/arm-none-linux-gnueabi/lib
还要把头文件拷贝过去,头文件在本目录的include下,把下面的AL整个文件夹一起拷贝到/usr/local/arm-2009q1/arm-none-linux-gnueabi/include下面就可以了
5、然后我们同样交叉编译mpstream.c,运用一下编译指令:
arm-none-linux-gnueabi-gcc -o mpstream mpstream.c -lopenal -lasound –lpthread
6、生成的可执行文件我们把他拷贝到开发板去执行,但是这时候由于我们还没还拷贝openal的库到开发板中,所以执行的话会出现共享库找不到的错误。所以要先拷贝库进去:cp主机上的/usr/local/arm-2009q1/arm-none-linux-gnueabi/lib/libopenal*到开发板的/usr/lib下。
7、执行mpstream会出现无法正常运行的错误,所以我们为了调试而在mpstream.c中各个主要的地方加printf打印信息出来追踪程序停在哪里,并打印出父进程和子进程的ID号,执行后发现可以成功创建子进程,但是程序却停在了125行的地方,暂且咱们也不知道原因,所以先把这两行注销掉:
// close(STDOUT_FILENO);
// dup2(files[1], STDOUT_FILENO);
再编译运行,发现程序可以运行,但是播放却不正常,所以怀疑是mplayer的参数设置不正确,经过调试发现是“-ao”参数的关系,把134行的:
execlp("mplayer", "-nogui", "-really-quiet", "-novideo",

"-noconsolecontrols", "-ao", "pcm:file=/dev/stdout",

argv[1], (char*)NULL);
中的"-ao"参数去掉,这样就可以正常运行并播放音乐了。"-ao"参数是让mplayer选择audio output drivers,我们用mplayer  -ao help就可以显示出可用的音频输出驱动,在PC机上是这些:
Available audio output drivers:

oss   OSS/ioctl audio output

alsa  ALSA-0.9.x-1.x audio output

esd   EsounD audio output

pulse       PulseAudio audio output

jack JACK audio output

nas   NAS audio output

sdl   SDLlib audio output

openal     OpenAL audio output

mpegpes  DVB audio output

v4l2 V4L2 MPEG Audio Decoder output

null  Null audio output

pcm RAW PCM/WAVE file writer audio output
但是在开发板中就比较少了,我不知道去掉-ao这个参数是不是让mplayer选择默认的有效的音频输出驱动,在开发板中的是ALSA的驱动。
另外,execlp这个函数是可以从PATH环境变量中查找可执行文件并执行,在unistd.h中定义,int execlp(const char * file,const char * arg,……);execlp()会从PATH环境变量所指的目录中查找符合参数file的文件名,找到后便执行该文件,然后将第二个以后的参数当做该文件的argv[0]、argv[1]……,最后一个参数必须用空指针(NULL)作结束。如果函数调用成功,进程自己的执行代码就会变成加载程序的代码,execlp()后边的代码也就不会执行了

下面移植alut附加工具库:

一、编译在PC机上运行:
1、解压freealut-1.1.0.tar(要顺利完成以下安装和编译步骤的话要确保openal已经安装好了)

2、进入这个目录,执行./configure生成makefile,再执行make生成库和一些example程序,再make install把头文件和库等拷贝到/usr/local/lib等相关目录(也可以自己指定);这样就安装成功了;

3、进入example目录,把一个.wav格式的音频文件拷贝过来,例如love.wav,他不支持MP3格式,再执行./playfile love.wav就可以播放音乐了

二、编译在开发板上运行:
1、解压freealut-1.1.0.tar(要顺利完成以下安装和编译步骤的话要确保openal已经安装好了,注意,这里的openal也是要求已经是交叉编译过的了,编译过程前面有介绍,编译生成的头文件和库要放到交叉编译工具的相应目录下)
2、进入这个目录,执行./configure –host=arm-linux CC= arm-none-linux-gnueabi-gcc生成makefile,再执行make生成库和一些example程序,再make install把头文件和库等拷贝到/usr/local/lib等相关目录(也可以自己指定);注意,这样的话会覆盖原来的库,所以假如还要编译PC机上的话,就还需要到上面编译在PC的文件夹里面再make install一下就可以了。这样就安装成功了;
3、这时候,把头文件./include/AL/alut.h拷贝到交叉编译工具目录下的include/AL/下;再把生成的库拷贝到交叉编译工具的lib目录下:cp /usr/local/lib/libalut* /usr/local/arm-2009q1/arm-none-linux-gnueabi/lib,这样就可以交叉编译编译程序了
4、进入example目录,由于里面通过makefile编译出来的playfile文件是一个脚本文件,他的运行依赖与路径和现场编译,所以假如直接把他拷贝到开发板中是运行不了的,所以我们必须重新把他编译成可执行文件。首先执行make clean一下,再执行如下编译指令:arm-none-linux-gnueabi-gcc -o playfile playfile.c  -lopenal -lalut –lasound 注意要连接后面这三个库,分别是OpenAL、alut和ALSA驱动的库。
5、把生成的playfile通过nfs弄到开发板中,这时候并不能运行,因为开发板中还缺少alut这个动态链接库,所以我们要先把他拷贝过去:
cp 主机上的/usr/local/arm-2009q1/arm-none-linux-gnueabi/lib/libalut*到开发板的/usr/lib下,库包含有libalut.a  libalut.la  libalut.so  libalut.so.0  libalut.so.0.1.0(.a后缀表示静态链接库,.so结尾表示静态链接库)。

从上面我们可以发现移植的一般步骤了!

OpenAL跨平台音效API的安装与移植相关推荐

  1. 用JSON-server模拟REST API(一) 安装运行

    用JSON-server模拟REST API(一) 安装运行 在开发过程中,前后端不论是否分离,接口多半是滞后于页面开发的.所以建立一个REST风格的API接口,给前端页面提供虚拟的数据,是非常有必要 ...

  2. TensorFlow 2 Object Detection API 教程: 安装

    TensorFlow 2 Object Detection API 教程: 安装 本教程针对的是TensorFlow 2.4,它是TensorFlow 2.x的最新稳定版本. 这是一个循序渐进的教程/ ...

  3. 【教程】在天河上安装、移植并验证CESM2.2.0

    文章目录 基本情况 环境配置 所需环境 CESM2 Software/Operating System Prerequisites 使用source脚本配置模块和环境变量 MPI测试 CESM安装及移 ...

  4. qwt的安装和移植-

    目须要依据实时数据绘制出图表,因此我们找到了qwt库.这个库是一个绘制图表,曲线图,柱状图的统计图标. . .. 以下我们就具体解说一下这个库在Larm上的编译和移植 qwt介绍 QWT,全称是Qt ...

  5. WSO2 API Manager安装部署配置

    1. 系统要求 至少 3GHz CPU 至少 4GB 内存 (2GB给WSO2,2GB给操作系统) 至少 10GB 磁盘 JDK1.8_x64, 其中JDK1.8.0_151版本存在已知的GZIP d ...

  6. 【Android 插件化】VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )

    文章目录 一.目前的 API 现状 二.安装应用源码分析 1.安装按钮执行的操作 2.返回到 HomeActivity 执行的操作 一.目前的 API 现状 下图是 VirtualApp 官方给出的集 ...

  7. ASP.NET跨平台实践:无需安装Mono的Jexus“独立版”

    在Linux上运行ASP.NET网站或webapi的传统步骤一般是先安装libgdiplus,再安装mono,然后安装Jexus.在这个步骤中,安装Jexus非常简单,而安装mono就相对的比较费时费 ...

  8. Zephry_安装与移植到Stm32F746g_disoc

    目录 前言 1. 更新apt仓库 2. 安装依赖 2.1 依赖作用 3. 构建体系 4. 主要依赖最低版本 5. 下载完所有依赖之后可以看下是否满足最小依赖 6. 使用pip3安装west 7. 配置 ...

  9. Paho MQTT Python客户端常用API、安装与使用

    MQTT(Message Queuing Telemetry Transport)是一种轻量级的即时通信协议,相关介绍可见:MQTT简介. Paho 是Eclipse的开源 MQTT 客户端项目,提供 ...

最新文章

  1. oracle查看数据库名和实例名
  2. C#中使用SharpZipLib进行解压缩并使用ProtoBuf进行反序列化
  3. 第15组构建之法团队心得(2)
  4. linux主机添加discuz伪静态规则,Discuz! X2.5论坛win主机与linux主机伪静态设置方法...
  5. 抓包工具 for Mac之paros
  6. 一套开源的 iOS 轻量级框架
  7. php对接监控摄像头源码,摄像头监控录像源代码 (详细的代码,可以直接使用,也可以拿来学习使用)...
  8. 3分钟全面了解元数据和数据元
  9. 网线水晶头制作的线序
  10. jmeterhttp代理服务器_Jmeter使用HTTP代理服务器录制脚本
  11. py实现高斯列选主元消元法
  12. 排序算法总结--希尔排序
  13. 2db多少功率_功率和db换算(功率与db换算表)
  14. Firefox火狐浏览器在http下允许通知
  15. Hadoop搭建之Centos 7.0系统安装
  16. 2022高级Java笔试总结,阿里P8重点推荐的火爆全网MySQL路线笔记
  17. CAP 原理和分布式矩阵的应用
  18. 监控服务zabbix
  19. 截至2022年1月12日,Android Gradle 插件版本对照说明
  20. 一个高频开关电路设计与仿真

热门文章

  1. php smarty 语法,php之Smarty根本语法和三大变量
  2. 偶搜集到的源码列表如下,跟大家分享分享。
  3. 查看oracle小补丁号,oracle 补丁号查询
  4. 怎样让html中元素不被其他元素遮挡_Web前端开发之HTML元素
  5. 【bzoj3119】Book
  6. 命令行运行Jmeter实例
  7. 透过NpetShop 看Web项目开发中的分工合作
  8. Android-Activity中的onNewIntent()方法调用简析
  9. Mr.J-- jQuery学习笔记(十四)--动画显示隐藏
  10. C++中XML的读写操作(生成XML 解析XML)