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

15 篇文章 2 订阅
3 篇文章 1 订阅

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(可以查看目录下的READMEINSTALL文件来了解编译和安装步骤)
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的,所以要加上线程库,还有前面的就是openalALSA驱动的库。
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 注意要连接后面这三个库,分别是OpenALalutALSA驱动的库。
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结尾表示静态链接库)。

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值