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->getPlayPosition()
或s->getPlayLength()
时程序崩溃
我先在这里澄清一下:
我不能使用while( se->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->play2D( ResX, false, false, true );
以上是关于irrKlang 从 play2D() 获取 ISound*的主要内容,如果未能解决你的问题,请参考以下文章
获取 irrklang - 在 sharpdevelop 工作