3

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

4

2 に答える 2

3

これはあなたの問題ではないかもしれませんが、私が同様の問題を抱えていたとき、ガベージ コレクターは私がまだ SDL オーディオ チャンクを使用していることを認識できず (SDL だけが使用していたため)、SDL の下から RAM を解放しました。 . これを解決するには、SDL がアイテムを使用している間ずっとアイテムがスコープ内にあることを確認するだけでなく、Haskell コードが実際に何らかの方法でアイテムを使用していることを確認する必要があります (オプティマイザーがアイテムを変更しないようにするため)。あなた)。このような呼び出しtouchForeignPtrは非常に便利です。

于 2012-09-16T16:47:24.933 に答える
0

これは、SDL にもリアクティブ バナナにも関係しない可能性があります。そのような問題は、多くの場合、-threadedコンパイラ フラグを使用してコンパイルすることで修正されます。これがカバル プロジェクトの場合は、追加します

GHC-Options: -W -threaded

あなたのExecutableセクションに。

于 2012-09-16T03:59:20.353 に答える