SDL-调音台音频停止起动时无功,香蕉输入回路(SDL-Mixer audio stops upon

2019-09-22 12:09发布

我一直在使用多个音轨,其体积根据鼠标的移动实时调整游戏。 我使用SDL-调音台的音频和无功香蕉的游戏一般。 问题是,轨道,目前都已在年初开始,停止输入循环开始时播放。 原因可能是别的东西,但我不知道是否有SDL和无功,香蕉,我不明白之间的一些奇怪的相互作用。 我一直在试图解这了一会儿,但它可能只是简单的东西,我已经忽视。 提前致谢。 下面是一个简单的测试代码:

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

编辑:看来问题不躺在反应香蕉必然。 任何形式的“永远”循环会导致音频停止。

Answer 1:

这可能不是你的问题,但是当我有一个类似的问题,这是垃圾回收器不能告诉大家,我还是用SDL音频块(因为只有SDL使用它),并从SDL下free'd的RAM出来。 为了解决这个问题,你不仅需要确保该项目在范围为整个时间SDL将使用它,但你的Haskell代码实际上是利用了它以某种方式(以便优化器不会对改变的东西您)。 这样的方法调用touchForeignPtr对于这个非常有用的。



Answer 2:

这可能不相关或者SDL或无功香蕉。 这样的问题通常是由与编制固定-threaded编译器标志。 如果这是一个惊天动地的项目,加

GHC-Options: -W -threaded

你的Executable部分。



文章来源: SDL-Mixer audio stops upon starting Reactive-Banana input loop