Tue Oct 27 14:29:53 EET 2009 vasyl.pasternak@gmail.com tagged SDL-0.5.106 Tue Oct 27 14:29:26 EET 2009 vasyl.pasternak@gmail.com * Changed version to patched Wed Oct 14 00:36:34 EEST 2009 vasyl.pasternak@gmail.com * Fixed callback to safe call Sun Oct 11 17:31:19 EEST 2009 vasyl.pasternak@gmail.com * Added pauseAudio binging Sun Oct 11 17:05:36 EEST 2009 vasyl.pasternak@gmail.com * Added AudioSpec and openAudio bindings Sun Oct 11 12:05:15 EEST 2009 vasyl.pasternak@gmail.com * Increased version for local build Tue Oct 27 14:17:56 EET 2009 vasyl.pasternak@gmail.com tagged SDL-0.5.6 diff -rN -u old-SDL/Graphics/UI/SDL/Audio.hsc new-SDL/Graphics/UI/SDL/Audio.hsc --- old-SDL/Graphics/UI/SDL/Audio.hsc 2009-10-27 14:31:14.000000000 +0200 +++ new-SDL/Graphics/UI/SDL/Audio.hsc 2009-10-27 14:31:14.000000000 +0200 @@ -17,9 +17,22 @@ ( AudioFormat (..) , fromAudioFormat , toAudioFormat + , AudioSpec (..) + , openAudio + , AudioBufferFillCb + , AudioBufferFillCbPtr + , mkAudioBufferFillCb + , pauseAudio ) where -import Data.Word (Word16) +import Data.Word (Word8, Word16, Word32) +import Data.List (intersperse) +import Foreign.Marshal.Alloc (alloca) +import Foreign.Marshal.Utils (with) +import Foreign.Storable (Storable (..)) +import Foreign.Ptr (Ptr, nullPtr, FunPtr) +import Foreign.C.Types (CInt) +import Control.Monad (liftM) data AudioFormat = AudioU8 @@ -51,4 +64,85 @@ toAudioFormat #{const AUDIO_S16MSB} = AudioS16MSB toAudioFormat _ = error "Graphics.UI.SDL.Audio.toAudioFormat: bad argument" +-- | added by Vasyl Pasternak +type AudioBufferFillCb = Ptr () -> Ptr Word8 -> Word32 -> IO () +type AudioBufferFillCbPtr = FunPtr AudioBufferFillCb + +foreign import ccall safe "wrapper" mkAudioBufferFillCb :: + AudioBufferFillCb -> IO AudioBufferFillCbPtr + +data AudioSpec = AudioSpec { + freq :: Int + , format :: AudioFormat + , channels :: Word8 + , silence :: Word8 + , samples :: Word16 + , size :: Word32 + , callback :: AudioBufferFillCbPtr + } + +cintToInt :: CInt -> Int +cintToInt = fromIntegral + +intToCint :: Int -> CInt +intToCint = fromIntegral + +instance Show AudioSpec where + show (AudioSpec fr fm ch sl sm sz _) = "AudioSpec: " ++ (concat $ intersperse ", " fields) + where fields = + [ + "freq = " ++ (show fr) + ,"format = " ++ (show fm) + ,"channels = " ++ (show ch) + ,"silence = " ++ (show sl) + ,"samples = " ++ (show sm) + ,"size = " ++ (show sz) + ] + + +instance Storable AudioSpec where + sizeOf _ = #{size SDL_AudioSpec} + alignment = const 1 + peek ptr = do + f <- liftM cintToInt $ #{peek SDL_AudioSpec, freq} ptr + fmt <- liftM toAudioFormat $ #{peek SDL_AudioSpec, format} ptr + ch <- #{peek SDL_AudioSpec, channels} ptr + sl <- #{peek SDL_AudioSpec, silence} ptr + sm <- #{peek SDL_AudioSpec, samples} ptr + sz <- #{peek SDL_AudioSpec, size} ptr + cb <- #{peek SDL_AudioSpec, callback} ptr + return $ AudioSpec f fmt ch sl sm sz cb + poke ptr as = do + #{poke SDL_AudioSpec, freq} ptr (intToCint (freq as)) + #{poke SDL_AudioSpec, format} ptr (fromAudioFormat (format as)) + #{poke SDL_AudioSpec, channels} ptr (channels as) + #{poke SDL_AudioSpec, silence} ptr (silence as) + #{poke SDL_AudioSpec, samples} ptr (samples as) + #{poke SDL_AudioSpec, size} ptr (size as) + #{poke SDL_AudioSpec, callback} ptr (callback as) + #{poke SDL_AudioSpec, userdata} ptr nullPtr + +foreign import ccall unsafe "SDL_OpenAudio" sdlOpenAudio :: + Ptr AudioSpec -> Ptr AudioSpec -> IO CInt + +openAudio :: AudioSpec -> Bool -> IO (Maybe AudioSpec) +openAudio sp True = + with sp $ \des -> do + poke des sp + alloca $ \obt -> do + ret <- sdlOpenAudio des obt + if ret /= 0 then return Nothing else liftM Just $ peek obt +openAudio sp False = + with sp $ \des -> do + poke des sp + ret <- sdlOpenAudio des nullPtr + if ret /= 0 then return Nothing else return (Just sp) + + +foreign import ccall unsafe "SDL_PauseAudio" sdlPauseAudio :: + CInt -> IO () + +pauseAudio :: Bool -> IO () +pauseAudio p = + sdlPauseAudio (if p then 1 else 0) diff -rN -u old-SDL/SDL.cabal new-SDL/SDL.cabal --- old-SDL/SDL.cabal 2009-10-27 14:31:14.000000000 +0200 +++ new-SDL/SDL.cabal 2009-10-27 14:31:14.000000000 +0200 @@ -1,5 +1,5 @@ Name: SDL -Version: 0.5.6 +Version: 0.5.106 Maintainer: Lemmih (lemmih@gmail.com) Author: Lemmih (lemmih@gmail.com) Copyright: 2004-2009, Lemmih