module Graphics.UI.SDL.Mixer.General
( AudioFormat (..)
, tryOpenAudio
, openAudio
, closeAudio
, tryQuerySpec
, querySpec
, defaultFrequency
) where
import Graphics.UI.SDL.General(unwrapMaybe, unwrapBool)
import Graphics.UI.SDL.Audio(AudioFormat(..), fromAudioFormat, toAudioFormat)
import Data.Word(Word16)
import Foreign(Ptr, Storable(peek), alloca)
defaultFrequency :: Int
defaultFrequency = 22050
foreign import ccall unsafe "Mix_OpenAudio" mixOpenAudio :: Int -> Word16 -> Int -> Int -> IO Int
tryOpenAudio :: Int -> AudioFormat -> Int -> Int -> IO Bool
tryOpenAudio frequency format channels chunksize
= fmap (0==) (mixOpenAudio frequency (fromAudioFormat format) channels chunksize)
openAudio :: Int -> AudioFormat -> Int -> Int -> IO ()
openAudio frequency format channels chunksize
= unwrapBool "Mix_OpenAudio" (tryOpenAudio frequency format channels chunksize)
foreign import ccall unsafe "Mix_CloseAudio" closeAudio :: IO ()
foreign import ccall unsafe "Mix_QuerySpec" mixQuerySpec :: Ptr Int -> Ptr Word16 -> Ptr Int -> IO Int
tryQuerySpec :: IO (Maybe (Int,AudioFormat,Int))
tryQuerySpec
= alloca $ \freq ->
alloca $ \format ->
alloca $ \channels ->
do ret <- mixQuerySpec freq format channels
case ret of
0 -> return Nothing
_ -> do [f,c] <- mapM peek [freq,channels]
fm <- peek format
return (Just (f,toAudioFormat fm,c))
querySpec :: IO (Int,AudioFormat,Int)
querySpec = unwrapMaybe "Mix_QuerySpec" tryQuerySpec