解决OpenAL里调用Alut.alutLoadMemoryFromFile出错

QxAIRobot 2013-12-27 12:36:48
笔者近来正在学习Daniel Schuller著的C# Game Programming For Serious Game Creation(中文译名:《精通C#游戏编程》),感觉收获良多,但也遇到些许问题,其中最让我头疼是是书中第9章,SoundManager类中LoadSound方法里,每次运行到System.Diagnostics.Debug.Assert(data != IntPtr.Zero);都会报错。后来经过一翻钻研,终于是解决了问题。在这里把经验与大家分享一下。

首先贴上书上的相关原代码:
        public void LoadSound(string soundId, string path)
{
//Generate a buffer
int buffer = -1;
Al.alGenBuffers(2, out buffer);
int errorCode = Al.alGetError();
System.Diagnostics.Debug.Assert(errorCode == Al.AL_NO_ERROR);//这里不报错

int format;
float frequency;
int size;
System.Diagnostics.Debug.Assert(File.Exists(path));//这里不出错
IntPtr data = Alut.alutLoadMemoryFromFile(path, out format, out size, out frequency);
System.Diagnostics.Debug.Assert(data != IntPtr.Zero);//这里报错
//Load wav data into the generated buffer.
Al.alBufferData(buffer, format, data, size, (int)frequency);
//Everything seems ok,add it to the library.
_soundIdentifier.Add(soundId, new SoundSource(buffer, path);
);
}


其中参数soundId暂时与本文研究内容无关,而path是一个标准WAV文件的路径,也没有任何问题。

这里的问题出在,当执行过
IntPtr data = Alut.alutLoadMemoryFromFile(path, out format, out size, out frequency);
后,点上断点,会发现format,size,frequency三个变量都还是0,这就说明问题是出在这个函数上。
然后笔者经过一翻百度,竟然只得到了一点点有关的东西:Alut使用指导,其中关于alutGetError的内容提醒我,可以通过这种方法找到出错信息,于是加入如下代码:
            int error = Alut.alutGetError();//this is new line
System.Windows.Forms.MessageBox.Show(error.ToString());//this is new line
加入断点,执行后得到的结果是error=519,这个数字代表什么呢?只要右键Alut,然后点击“转到定义”或按F12键,就可以查看Alut类的公共成员。使用查找命令,可以找到这么一个定义:
        //
public const int ALUT_ERROR_OPEN_DEVICE = 519;
//
那么就可以知道,519表示的就是ALUT_ERROR_OPEN_DEVICE这个错误。
然后笔者就继续百度ALUT_ERROR_OPEN_DEVICE的相关资料,却几乎一无所获。无奈之下,只好打开外网,连上Google查阅。然后笔者发现了原来同一个问题老外们也遇见了,而且似乎也没什么好办法。就在笔者几乎要放弃时,终于在一个帖子里找到一个链接:How To Fix alut error 519
在这个网页的最后,笔者了解到,这个问题多半是出在dll文件或操作系统上。于是笔都重新安装了一下TaoFramework,发现还是没有用,无奈下再次查看Alut类,无意中展开了类说明,却在类说明上发现这么一句话:
namespace Tao.OpenAl
{
// 摘要:
// OpenAL binding for .NET, implementing ALUT 1.1.
//
// 备注:
// ALUT is non-standard.
public static class Alut
{

//省略
}

在备注里,有一句ALUT is non-standard。ALUT是不标准的。
于是作者就想,难道TaoFramework里的ALUT类是简化的吗?
出于这么一种思考,再结合google上查到的一些信息,笔者去下载了一个完整的OpenAL2.0.7,安装过后,终于发现,原来的地方已经不报错了,程序顺利执行。

总结:
啰里啰嗦说了这么多,其实总结起来无非一句话:这个问题是因为Taoframework的OpenAL不完整,只要下载一个完整的OpenAL就行了。我的是在这里下的,不知道其它地方的怎么样。
...全文
280 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
beidia 2014-12-03
  • 打赏
  • 举报
回复
你好,我也遇到同样的问题,但是下载了安装,还是不行, 请问安装后,还要做做么操作呢?
  • 打赏
  • 举报
回复
非常感谢!!!我也是看着那本书学的,也遇到了同样的问题……
在风中的意志 2014-06-03
  • 打赏
  • 举报
回复
看书的时候我也遇到了...感谢,不过再问下,声音变得好奇怪...
UlyssesWu 2014-01-22
  • 打赏
  • 举报
回复
这个问题我倒是没有遇到,但是我想问一下如何读入和播放ogg格式…… Tao附带的库里有ogg的lib,但是我把它复制到项目中也读取不了ogg,出错点还是在那里 System.Diagnostics.Debug.Assert(data != IntPtr.Zero);//这里报错 怎样才能读取ogg呢?求赐教

110,579

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧