我一直在开发一款使用多个音轨的游戏,其音量根据鼠标运动实时调整。我一般使用 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
编辑:问题似乎不一定在于反应性香蕉。任何类型的“永远”循环都会导致音频停止。
这可能不是你的问题,但当我遇到类似的问题时,垃圾收集器无法判断我仍在使用 SDL 音频块(因为只有 SDL 正在使用它)并从 SDL 下释放 RAM 。为了解决这个问题,你不仅必须确保该项目在 SDL 使用它的整个过程中都在范围内,而且你的 Haskell 代码实际上以某种方式使用它(这样优化器就不会改变它)你)。打电话就像touchForeignPtr
对此非常有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)