3

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

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

编辑:问题似乎不一定在于 Reactive Banana。任何形式的“永远”循环都会导致音频停止。

4

2 回答 2

3

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

于 2012-09-16T16:47:24.933 回答
0

这可能与 SDL 或反应香蕉无关。此类问题通常可以通过使用-threaded编译器标志进行编译来解决。如果这是一个阴谋集团项目,请添加

GHC-Options: -W -threaded

到你的Executable部分。

于 2012-09-16T03:59:20.353 回答