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パワーを使わなかった。
しかし、どれぐらいミックスできるかは不明だが…