参考网站:OgreOggSound Forum
经过比较长时间的探索,终于找到一个还可以用的声音库的封装,摒弃了之前的简陋的OpenAL SoundManager,改用一个封装的更好的库——OgreOggSound,支持ogg格式和wav格式的声音处理。
为什么选择OgreOgg可以参考这里,个人觉得Ogg以后前途更好一些。
首先,到这里下载OgreOggSound-v1.18.zip,顺便把下面的TestDemo.zip也下载下来,如果你按照我之前的文章搭建了Ogre的OpenAL平台的话,基本准备工作已经完成了。当然如果你没有配置Ogre还有OpenAL的平台的话,需要事先配置Ogre,OpenAL只需要安装SDK就可以了。可以参考这里。
解压OgreOggSound-v1.18.zip并打开OgreOggSoundLib_vc9.sln(我用的是VS2008SP1),编译会报错:
c1xx : fatal error C1083: 无法打开源文件:“WIN32”: No such file or directory
项目 : warning PRJ0018 : 未找到下列环境变量:
$(OPENAL_SDK)
$(BOOST_ROOT)
$(OGRE)
其中c1xx : fatal error C1083: 无法打开源文件:“WIN32”: No such file or directory这个错误在编译一次就没有了,其他的错误还在,然后你有两种选择:
1.如果你配置了Ogre的OpenAL平台,那么应该包含的东西都已经配置好了,不需要这些环境变量,在 项目 -> 配置属性 -> C/C++ -> 附加包含目录 改为:
./include;
在 项目 -> 配置属性 ->
./dependencies;
注意:你需要同时更改Debug和Release版本的项目配置。
2.新建这些环境变量,创建BOOST_ROOT,OPENAL_SDK以及OGRE_HOME环境变量,其中OGRE_HOME应该是之前就有的,BOOST_ROOT指的就是Ogre_SDK文件夹下的boost_1_42目录,OPENAL_SDK指的是安装OpenALSDK的主目录,创建即可。
另外你需要把OpenAL 1.1 SDK/libs/EFX-Util_MTDLL下的EFX-Util.lib复制出来到OpenAL 1.1 SDK/libs目录下,此时再分别编译Debug和Release版本。
编译时间比较长,此时你可以看看ogreoggsound/include里面的内容,如果之前配置了OpenAL,那么对ogg和vorbis文件夹应该是比较熟悉的,这两个文件夹的东西重复了,不用管,把include目录下的.h文件复制到OpenAL 1.1 SDK/include文件夹下即可。
编译完成后,在ogreoggsound/lib文件夹里生成了dll文件和lib文件:
把OgreOggSound_d.lib放到OgreSDK_vc9_v1-7-1/lib/debug目录下。
把OgreOggSound.lib放到OgreSDK_vc9_v1-7-1/lib/release目录下。
把OgreOggSound_d.dll放到OgreSDK_vc9_v1-7-1/bin/debug目录下,并改动同目录下plugins_d.cfg文件,在最后加上:
把OgreOggSound.dll放到OgreSDK_vc9_v1-7-1/bin/release目录下,并改动同目录下plugins.cfg文件,在最后加上:
环境配置基本完成,确切的说是把OpenAL的函数封装到一个插件里面,我们在配置文件里对插件进行了注册。
好了下面来看TestDemo.zip的东西,解压打开TestDemo_vc9.sln,编译报错:
1>c1xx : fatal error C1083: 无法打开源文件:“../include”: No such file or directory
1>项目 : warning PRJ0018 : 未找到下列环境变量:
1>$(OPENAL_SDK)
1>$(BOOST_ROOT)
仍然金按照上面所述的两种方法处理,不过注意第一种方法的
编译,错误变成了:
error C2440: “初始化”: 无法从“const Ogre::RenderSystemList”转换为“Ogre::RenderSystemList *”
错误指向Ogre::RenderSystemList *rl = Ogre::Root::getSingleton().getAvailableRenderers();这里注意,由于1.7.1版本的getAvailableRenderers方法返回的是一个Ogre::RenderSystemList的引用而不是指针,所以我们需要把指针改成引用,把指针操作改成点操作,将:
改为:
注意我们在这里选用了D3D9的渲染器,此时编译即可通过,设置调试工作目录为运行依然会报错,这是因为一来的DLL不同步导致的,在OgreSDK_vc9_v1-7-1/bin/debug目录下找到OgreMain_d.dll、OgreOggSound_d.dll、OIS_d.dll、RenderSystem_Direct3D9_d.dll覆盖复制到TestDemo/Debug目录下,将Plugins.cfg中
# Define plugin folder
PluginFolder=./plugins
将resources.cfg中的Zip=../media/OgreMesh.zip
替换为
Zip=../media/OgreCore.zip
运行即可听到效果,这个例子比较好的一点是提供了Ogre和MFC整合的一种方案,而且可以清晰的看到Ogre的工作流程,将在下一篇文章里详细的讨论。