gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:43:11 26 4
gpt4 key购买 nike

我一直在开发一款使用多个音轨的游戏,这些音轨的音量会根据鼠标移动实时调整。我一般使用 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 中。任何类型的“永远”循环都会导致音频停止。

最佳答案

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

关于multithreading - SDL-Mixer 音频在启动 Reactive-Banana 输入循环时停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12443843/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com