irrKlang 从 play2D() 获取 ISound*

Posted

技术标签:

【中文标题】irrKlang 从 play2D() 获取 ISound*【英文标题】:irrKlang get ISound* from play2D() 【发布时间】:2015-11-16 02:42:40 【问题描述】:

我正在尝试使用 irrKlang 库加载声音,它在播放时效果很好,但我想获得 PlayLength()PlayPosition() 属性,但完成后程序崩溃。我就是这样做的:

#define ResX "res.mod"

irrklang::ISoundEngine* se = irrklang::createIrrKlangDevice();
if( !se->isCurrentlyPlaying( ResX ) )
     irrklang::ISound *s = se->play2D( ResX, false, false, false );
     while( s->getPlayPosition() < s->getPlayLength() ) //Do something

当我执行s-&gt;getPlayPosition()s-&gt;getPlayLength() 时程序崩溃

我先在这里澄清一下: 我不能使用while( se-&gt;isCurrentlyPlaying( ResX ) ),因为有时媒体停止播放时isCurrentlyPlaying() 不会返回0。

【问题讨论】:

您不检查 play2D 是否返回有效指针。根据文档Only returns a pointer to an ISound if the parameters 'track', 'startPaused' or 'enableSoundEffects' have been set to true. Note: if this method returns an ISound as result, you HAVE to call ISound::drop() after you don't need the ISound interface anymore. Otherwise this will cause memory waste. This method also may return 0 altough 'track', 'startPaused' or 'enableSoundEffects' have been set to true, if the sound could not be played. 【参考方案1】:

您没有检查 play2D 的返回值以查看它是否是有效指针(实际上不是)

你的代码说:

irrklang::ISound *s = se->play2D( ResX, false, false, false );

根据文档:

仅当参数 'track'、'startPaused' 或 'enableSoundEffects' 设置为 true 时才返回指向 ISound 的指针。注意:如果此方法返回一个 ISound 作为结果,您必须在不再需要 ISound 接口后调用 ISound::drop()。否则会造成内存浪费。如果声音无法播放,则此方法也可能返回 0,尽管 'track'、'startPaused' 或 'enableSoundEffects' 已设置为 true。

因此,您为 'track'、'startPaused' 和 'enableSoundEffects' 传递了 false,文档明确指出,除非其中一个为 true,否则不会返回有效指针。

【讨论】:

大声谢谢!看起来发送 track=true 解决了这个问题:irrklang::ISound *s = se-&gt;play2D( ResX, false, false, true );

以上是关于irrKlang 从 play2D() 获取 ISound*的主要内容,如果未能解决你的问题,请参考以下文章

获取 irrklang - 在 sharpdevelop 工作

irrklang 引擎未在无效时声明 [重复]

二进制文件不可执行 - c++ & irrklang

将 IrrKlang 与 Ogre 一起使用

C++ IrrKlang 声音错误- CreateIrrKlangDevice() 导致未定义的引用(真正的长引用)

无法从 maxmind 返回对象中获取键值