FFI (その5)

Audio周りを実装。
今回も考えるところが多くて大変。
とりあえずミキサーをどうするかということなのだが、
やっぱりこれもHaskell側で書くことにした。
コールバックはもともとの仕様と同じ
Ptr() -> Ptr Word8 -> Int -> IO ()
な関数で受け取り、Haskellがわのインターフェースとして
Int -> IO [Word8] な関数で処理をさせるようにした。
音波データが[Word8]になっているが、これは良くないかもしれない。
[Word8] [Int8] [Word16] [Int16] の中から選べて然るべきである。
まぁ、とりあえず、今のところは[Word8]で何とかすることにする。
ミックスしなければ大丈夫…ミックスできないと大丈夫じゃないんだけど。


使用例。

main :: IO ()
main = do
  True <- sdlInit[VIDEO,AUDIO]
  sur  <- sdlSetVideoMode 640 480 32 [SWSURFACE,ANYFORMAT]
  True <- sdlOpenAudio 22050 AUDIO_U8 1 1024 mixAudio
  sdlPauseAudio 0

  loop

  sdlCloseAudio
  sdlQuit

mixAudio :: Int -> IO [Word8]
mixAudio num = do
  putStrLn $ "require "++show num++"bytes."
  return $ take num dat
  where
    dat  = cycle $ [0,2..255]++[255,253..0]

loop = do
  ev <- sdlWaitEvent
  case ev of
    Just QuitEvent ->
      return ()
    _ -> loop

とりあえず、三角波を出力してみる。
三角波が簡単に書けたのでちょっとうれしかった。
気になる実行速度であるが、この程度だとほとんどCPUパワーを使わなかった。
しかし、どれぐらいミックスできるかは不明だが…


とりあえずの成果物。
http://fxp.infoseek.ne.jp/haskell/sdltest3.zip