首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SDL-Mixer音频在启动Reactive-Banana输入循环时停止

SDL-Mixer音频在启动Reactive-Banana输入循环时停止
EN

Stack Overflow用户
提问于 2012-09-16 09:47:10
回答 2查看 614关注 0票数 3

我一直在开发一款使用多个音轨的游戏,音量可以根据鼠标的运动进行实时调整。我将SDl-Mixer用于音频,而Reactive-Banana用于游戏。问题是,当输入循环开始时,所有在开始时都已启动的曲目停止播放。原因可能是其他原因,但我想知道SDL和Reactive-Banana之间是否有一些我不理解的奇怪的交互。我已经尝试了一段时间来解决这个问题,但它可能只是我忽略了的一些简单的东西。提前谢谢。下面是一个简单测试的代码:

代码语言:javascript
复制
import Reactive.Banana
import Graphics.UI.SDL
import Graphics.UI.SDL.Mixer
import Control.Monad

musicdir = "/home/silas/code/haskell/river/audio/"

testNet :: AddHandler (Int,Int,[MouseButton]) -> NetworkDescription t ()
testNet mouseHdlr = do
  eMouse <- fromAddHandler mouseHdlr
  reactimate $ (putStrLn . show) <$> eMouse

main = withInit [InitEverything] $ do
         setVideoMode 100 100 32 [SWSurface]
         openAudio defaultFrequency AudioS16Sys 1 1024
         allocateChannels 1
         chunk <- loadWAV $ musicdir ++ "guitar1" ++ ".ogg"
         playChannel 0 chunk (-1)
         (mouseHdlr, mouseAction) <- newAddHandler
         net <- compile $ testNet mouseHdlr
         actuate net
         forever $ getMouseState >>= mouseAction

编辑:问题似乎不一定存在于反应性香蕉中。任何类型的“永久”循环都会导致音频停止。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-17 00:47:25

这可能不是您的问题,但当我遇到类似的问题时,垃圾收集器无法判断我仍在使用SDL音频区块(因为只有SDL在使用它),并且无法从SDL下释放RAM。要解决这个问题,你不仅要确保项目在SDL使用它的整个时间内都在作用域内,而且你的Haskell代码实际上以某种方式利用了它(这样优化器就不会改变你的情况)。像touchForeignPtr这样的调用对此非常有用。

票数 3
EN

Stack Overflow用户

发布于 2012-09-16 11:59:20

这可能与SDL或reactive-banana无关。这样的问题通常可以通过使用-threaded编译器标志进行编译来修复。如果这是一个Cabal项目,则添加

代码语言:javascript
复制
GHC-Options: -W -threaded

到你的Executable区。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12443843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档