Я работал над игрой, в которой используется несколько звуковых дорожек, громкость которых регулируется в реальном времени в зависимости от движения мыши. Я использую 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
Редактировать: проблема, похоже, не обязательно связана с реактивным бананом. Любая «вечная» петля приводит к остановке звука.
forever $ getMouseState >>= print
? - person Heinrich Apfelmus   schedule 16.09.2012