{-# LINE 1 "Graphics/UI/SDL/Mixer/General.hsc" #-}

-----------------------------------------------------------------------------
-- |
-- Module      :  Graphics.UI.SDL.Mixer.General
-- Copyright   :  (c) David Himmelstrup 2005
-- License     :  BSD-like
--
-- Maintainer  :  lemmih@gmail.com
-- Stability   :  provisional
-- Portability :  portable
--
-----------------------------------------------------------------------------
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 :: Int
defaultFrequency = Int
22050

-- int Mix_OpenAudio(int frequency, Uint16 format, int channels, int chunksize)
foreign import ccall unsafe "Mix_OpenAudio" mixOpenAudio :: Int -> Word16 -> Int -> Int -> IO Int
tryOpenAudio :: Int -> AudioFormat -> Int -> Int -> IO Bool
tryOpenAudio :: Int -> AudioFormat -> Int -> Int -> IO Bool
tryOpenAudio Int
frequency AudioFormat
format Int
channels Int
chunksize
    = (Int -> Bool) -> IO Int -> IO Bool
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Int
0Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==) (Int -> Word16 -> Int -> Int -> IO Int
mixOpenAudio Int
frequency (AudioFormat -> Word16
fromAudioFormat AudioFormat
format) Int
channels Int
chunksize)

openAudio :: Int -> AudioFormat -> Int -> Int -> IO ()
openAudio :: Int -> AudioFormat -> Int -> Int -> IO ()
openAudio Int
frequency AudioFormat
format Int
channels Int
chunksize
    = String -> IO Bool -> IO ()
unwrapBool String
"Mix_OpenAudio" (Int -> AudioFormat -> Int -> Int -> IO Bool
tryOpenAudio Int
frequency AudioFormat
format Int
channels Int
chunksize)

-- void Mix_CloseAudio()
foreign import ccall unsafe "Mix_CloseAudio" closeAudio :: IO ()

-- int Mix_QuerySpec(int *frequency, Uint16 *format, int *channels)
foreign import ccall unsafe "Mix_QuerySpec" mixQuerySpec :: Ptr Int -> Ptr Word16 -> Ptr Int -> IO Int
tryQuerySpec :: IO (Maybe (Int,AudioFormat,Int))
tryQuerySpec :: IO (Maybe (Int, AudioFormat, Int))
tryQuerySpec
    = (Ptr Int -> IO (Maybe (Int, AudioFormat, Int)))
-> IO (Maybe (Int, AudioFormat, Int))
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr Int -> IO (Maybe (Int, AudioFormat, Int)))
 -> IO (Maybe (Int, AudioFormat, Int)))
-> (Ptr Int -> IO (Maybe (Int, AudioFormat, Int)))
-> IO (Maybe (Int, AudioFormat, Int))
forall a b. (a -> b) -> a -> b
$ \Ptr Int
freq ->
      (Ptr Word16 -> IO (Maybe (Int, AudioFormat, Int)))
-> IO (Maybe (Int, AudioFormat, Int))
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr Word16 -> IO (Maybe (Int, AudioFormat, Int)))
 -> IO (Maybe (Int, AudioFormat, Int)))
-> (Ptr Word16 -> IO (Maybe (Int, AudioFormat, Int)))
-> IO (Maybe (Int, AudioFormat, Int))
forall a b. (a -> b) -> a -> b
$ \Ptr Word16
format ->
      (Ptr Int -> IO (Maybe (Int, AudioFormat, Int)))
-> IO (Maybe (Int, AudioFormat, Int))
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr Int -> IO (Maybe (Int, AudioFormat, Int)))
 -> IO (Maybe (Int, AudioFormat, Int)))
-> (Ptr Int -> IO (Maybe (Int, AudioFormat, Int)))
-> IO (Maybe (Int, AudioFormat, Int))
forall a b. (a -> b) -> a -> b
$ \Ptr Int
channels ->
      do Int
ret <- Ptr Int -> Ptr Word16 -> Ptr Int -> IO Int
mixQuerySpec Ptr Int
freq Ptr Word16
format Ptr Int
channels
         case Int
ret of
           Int
0 -> Maybe (Int, AudioFormat, Int) -> IO (Maybe (Int, AudioFormat, Int))
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe (Int, AudioFormat, Int)
forall a. Maybe a
Nothing
           Int
_ -> do [Int
f,Int
c] <- (Ptr Int -> IO Int) -> [Ptr Int] -> IO [Int]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM Ptr Int -> IO Int
forall a. Storable a => Ptr a -> IO a
peek [Ptr Int
freq,Ptr Int
channels]
                   Word16
fm <- Ptr Word16 -> IO Word16
forall a. Storable a => Ptr a -> IO a
peek Ptr Word16
format
                   Maybe (Int, AudioFormat, Int) -> IO (Maybe (Int, AudioFormat, Int))
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ((Int, AudioFormat, Int) -> Maybe (Int, AudioFormat, Int)
forall a. a -> Maybe a
Just (Int
f,Word16 -> AudioFormat
toAudioFormat Word16
fm,Int
c))

querySpec :: IO (Int,AudioFormat,Int)
querySpec :: IO (Int, AudioFormat, Int)
querySpec = String
-> IO (Maybe (Int, AudioFormat, Int)) -> IO (Int, AudioFormat, Int)
forall a. String -> IO (Maybe a) -> IO a
unwrapMaybe String
"Mix_QuerySpec" IO (Maybe (Int, AudioFormat, Int))
tryQuerySpec