私は、マウスの動きに基づいてリアルタイムでボリュームが調整される複数のオーディオ トラックを使用するゲームに取り組んできました。オーディオには 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 にあるとは限りません。あらゆる種類の「永久」ループにより、オーディオが停止します。