{-# LANGUAGE PatternSynonyms #-}

module Sound.OpenAL.FFI.ALC where

import Foreign (FunPtr, Ptr, nullPtr)
import Foreign.C.Types (CChar(..), CInt(..), CUInt(..))
import Foreign.C.String (CString)
import Sound.OpenAL.FFI.Utils (Dynamic)

-- * Context

newtype Context = Context (Ptr Context)
  deriving (Context -> Context -> Bool
(Context -> Context -> Bool)
-> (Context -> Context -> Bool) -> Eq Context
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Context -> Context -> Bool
$c/= :: Context -> Context -> Bool
== :: Context -> Context -> Bool
$c== :: Context -> Context -> Bool
Eq, Eq Context
Eq Context
-> (Context -> Context -> Ordering)
-> (Context -> Context -> Bool)
-> (Context -> Context -> Bool)
-> (Context -> Context -> Bool)
-> (Context -> Context -> Bool)
-> (Context -> Context -> Context)
-> (Context -> Context -> Context)
-> Ord Context
Context -> Context -> Bool
Context -> Context -> Ordering
Context -> Context -> Context
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Context -> Context -> Context
$cmin :: Context -> Context -> Context
max :: Context -> Context -> Context
$cmax :: Context -> Context -> Context
>= :: Context -> Context -> Bool
$c>= :: Context -> Context -> Bool
> :: Context -> Context -> Bool
$c> :: Context -> Context -> Bool
<= :: Context -> Context -> Bool
$c<= :: Context -> Context -> Bool
< :: Context -> Context -> Bool
$c< :: Context -> Context -> Bool
compare :: Context -> Context -> Ordering
$ccompare :: Context -> Context -> Ordering
$cp1Ord :: Eq Context
Ord, Int -> Context -> ShowS
[Context] -> ShowS
Context -> String
(Int -> Context -> ShowS)
-> (Context -> String) -> ([Context] -> ShowS) -> Show Context
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Context] -> ShowS
$cshowList :: [Context] -> ShowS
show :: Context -> String
$cshow :: Context -> String
showsPrec :: Int -> Context -> ShowS
$cshowsPrec :: Int -> Context -> ShowS
Show)

foreign import ccall unsafe "alcCreateContext"
  alcCreateContext :: Device -> Ptr CInt -> IO Context

foreign import ccall unsafe "alcDestroyContext"
  alcDestroyContext :: Context -> IO ()

foreign import ccall unsafe "alcGetCurrentContext"
  alcGetCurrentContext :: IO Context

foreign import ccall unsafe "alcMakeContextCurrent"
  alcMakeContextCurrent :: Context -> IO CChar

foreign import ccall unsafe "alcSuspendContext"
  alcSuspendContext :: Context -> IO ()

foreign import ccall unsafe "alcProcessContext"
  alcProcessContext :: Context -> IO ()

foreign import ccall unsafe "alcGetContextsDevice"
  alcGetContextsDevice :: Context -> IO Device

-- * Device

newtype Device = Device (Ptr Device)
  deriving (Device -> Device -> Bool
(Device -> Device -> Bool)
-> (Device -> Device -> Bool) -> Eq Device
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Device -> Device -> Bool
$c/= :: Device -> Device -> Bool
== :: Device -> Device -> Bool
$c== :: Device -> Device -> Bool
Eq, Eq Device
Eq Device
-> (Device -> Device -> Ordering)
-> (Device -> Device -> Bool)
-> (Device -> Device -> Bool)
-> (Device -> Device -> Bool)
-> (Device -> Device -> Bool)
-> (Device -> Device -> Device)
-> (Device -> Device -> Device)
-> Ord Device
Device -> Device -> Bool
Device -> Device -> Ordering
Device -> Device -> Device
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Device -> Device -> Device
$cmin :: Device -> Device -> Device
max :: Device -> Device -> Device
$cmax :: Device -> Device -> Device
>= :: Device -> Device -> Bool
$c>= :: Device -> Device -> Bool
> :: Device -> Device -> Bool
$c> :: Device -> Device -> Bool
<= :: Device -> Device -> Bool
$c<= :: Device -> Device -> Bool
< :: Device -> Device -> Bool
$c< :: Device -> Device -> Bool
compare :: Device -> Device -> Ordering
$ccompare :: Device -> Device -> Ordering
$cp1Ord :: Eq Device
Ord, Int -> Device -> ShowS
[Device] -> ShowS
Device -> String
(Int -> Device -> ShowS)
-> (Device -> String) -> ([Device] -> ShowS) -> Show Device
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Device] -> ShowS
$cshowList :: [Device] -> ShowS
show :: Device -> String
$cshow :: Device -> String
showsPrec :: Int -> Device -> ShowS
$cshowsPrec :: Int -> Device -> ShowS
Show)

nullDevice :: Device
nullDevice :: Device
nullDevice = Ptr Device -> Device
Device Ptr Device
forall a. Ptr a
nullPtr

foreign import ccall unsafe "alcOpenDevice"
  alcOpenDevice :: CString -> IO Device

foreign import ccall unsafe "alcCloseDevice"
  alcCloseDevice :: Device -> IO CChar

-- * Errors

foreign import ccall unsafe "alcGetError"
  alcGetError :: Device -> IO CInt

pattern INVALID_DEVICE :: (Eq a, Num a) => a
pattern $bINVALID_DEVICE :: a
$mINVALID_DEVICE :: forall r a. (Eq a, Num a) => a -> (Void# -> r) -> (Void# -> r) -> r
INVALID_DEVICE = 0xA001

pattern INVALID_CONTEXT :: (Eq a, Num a) => a
pattern $bINVALID_CONTEXT :: a
$mINVALID_CONTEXT :: forall r a. (Eq a, Num a) => a -> (Void# -> r) -> (Void# -> r) -> r
INVALID_CONTEXT = 0xA002

pattern INVALID_ENUM :: (Eq a, Num a) => a
pattern $bINVALID_ENUM :: a
$mINVALID_ENUM :: forall r a. (Eq a, Num a) => a -> (Void# -> r) -> (Void# -> r) -> r
INVALID_ENUM = 0xA003

pattern INVALID_VALUE :: (Eq a, Num a) => a
pattern $bINVALID_VALUE :: a
$mINVALID_VALUE :: forall r a. (Eq a, Num a) => a -> (Void# -> r) -> (Void# -> r) -> r
INVALID_VALUE = 0xA004

pattern INVALID_OPERATION :: (Eq a, Num a) => a
pattern $bINVALID_OPERATION :: a
$mINVALID_OPERATION :: forall r a. (Eq a, Num a) => a -> (Void# -> r) -> (Void# -> r) -> r
INVALID_OPERATION = 0xA006

pattern OUT_OF_MEMORY :: (Eq a, Num a) => a
pattern $bOUT_OF_MEMORY :: a
$mOUT_OF_MEMORY :: forall r a. (Eq a, Num a) => a -> (Void# -> r) -> (Void# -> r) -> r
OUT_OF_MEMORY = 0xA005

-- * Extensions

foreign import ccall unsafe "alcGetProcAddress"
  alcGetProcAddress :: Device -> CString -> IO (FunPtr a)

foreign import ccall unsafe "alcGetEnumValue"
  alcGetEnumValue :: Device -> CString -> IO CInt

-- * Queries

foreign import ccall unsafe "alcGetString"
  alcGetString :: Device -> CInt -> IO CString

foreign import ccall unsafe "alcGetIntegerv"
  alcGetIntegerv :: Device -> CInt -> CInt -> Ptr CInt -> IO ()

foreign import ccall unsafe "alcIsExtensionPresent"
  alcIsExtensionPresent_ :: Device -> CString -> IO CChar

-- * Capture

foreign import ccall unsafe "dynamic"
  invokeCaptureOpenDevice :: Dynamic (CString -> CUInt -> CInt -> CInt -> IO Device)

foreign import ccall unsafe "dynamic"
  invokeCaptureStartStop :: Dynamic (Device -> IO ())

foreign import ccall unsafe "dynamic"
  invokeCaptureSamples :: Dynamic (Device -> Ptr a -> CInt -> IO ())

foreign import ccall unsafe "dynamic"
  invokeCaptureCloseDevice :: Dynamic (Device -> IO CChar)

-- * Enums

pattern FREQUENCY :: (Eq a, Num a) => a
pattern $bFREQUENCY :: a
$mFREQUENCY :: forall r a. (Eq a, Num a) => a -> (Void# -> r) -> (Void# -> r) -> r
FREQUENCY = 0x1007

pattern REFRESH :: (Eq a, Num a) => a
pattern $bREFRESH :: a
$mREFRESH :: forall r a. (Eq a, Num a) => a -> (Void# -> r) -> (Void# -> r) -> r
REFRESH = 0x1008

pattern SYNC :: (Eq a, Num a) => a
pattern $bSYNC :: a
$mSYNC :: forall r a. (Eq a, Num a) => a -> (Void# -> r) -> (Void# -> r) -> r
SYNC = 0x1009

pattern MONO_SOURCES :: (Eq a, Num a) => a
pattern $bMONO_SOURCES :: a
$mMONO_SOURCES :: forall r a. (Eq a, Num a) => a -> (Void# -> r) -> (Void# -> r) -> r
MONO_SOURCES = 0x1010

pattern STEREO_SOURCES :: (Eq a, Num a) => a
pattern $bSTEREO_SOURCES :: a
$mSTEREO_SOURCES :: forall r a. (Eq a, Num a) => a -> (Void# -> r) -> (Void# -> r) -> r
STEREO_SOURCES = 0x1011

pattern DEFAULT_DEVICE_SPECIFIER :: (Eq a, Num a) => a
pattern $bDEFAULT_DEVICE_SPECIFIER :: a
$mDEFAULT_DEVICE_SPECIFIER :: forall r a. (Eq a, Num a) => a -> (Void# -> r) -> (Void# -> r) -> r
DEFAULT_DEVICE_SPECIFIER = 0x1004

pattern DEVICE_SPECIFIER :: (Eq a, Num a) => a
pattern $bDEVICE_SPECIFIER :: a
$mDEVICE_SPECIFIER :: forall r a. (Eq a, Num a) => a -> (Void# -> r) -> (Void# -> r) -> r
DEVICE_SPECIFIER = 0x1005

pattern EXTENSIONS :: (Eq a, Num a) => a
pattern $bEXTENSIONS :: a
$mEXTENSIONS :: forall r a. (Eq a, Num a) => a -> (Void# -> r) -> (Void# -> r) -> r
EXTENSIONS = 0x1006

pattern CAPTURE_DEFAULT_DEVICE_SPECIFIER :: (Eq a, Num a) => a
pattern $bCAPTURE_DEFAULT_DEVICE_SPECIFIER :: a
$mCAPTURE_DEFAULT_DEVICE_SPECIFIER :: forall r a. (Eq a, Num a) => a -> (Void# -> r) -> (Void# -> r) -> r
CAPTURE_DEFAULT_DEVICE_SPECIFIER = 0x0311

pattern CAPTURE_DEVICE_SPECIFIER :: (Eq a, Num a) => a
pattern $bCAPTURE_DEVICE_SPECIFIER :: a
$mCAPTURE_DEVICE_SPECIFIER :: forall r a. (Eq a, Num a) => a -> (Void# -> r) -> (Void# -> r) -> r
CAPTURE_DEVICE_SPECIFIER = 0x0310

pattern ATTRIBUTES_SIZE :: (Eq a, Num a) => a
pattern $bATTRIBUTES_SIZE :: a
$mATTRIBUTES_SIZE :: forall r a. (Eq a, Num a) => a -> (Void# -> r) -> (Void# -> r) -> r
ATTRIBUTES_SIZE = 0x1002

pattern ALL_ATTRIBUTES :: (Eq a, Num a) => a
pattern $bALL_ATTRIBUTES :: a
$mALL_ATTRIBUTES :: forall r a. (Eq a, Num a) => a -> (Void# -> r) -> (Void# -> r) -> r
ALL_ATTRIBUTES = 0x1003

pattern MAJOR_VERSION :: (Eq a, Num a) => a
pattern $bMAJOR_VERSION :: a
$mMAJOR_VERSION :: forall r a. (Eq a, Num a) => a -> (Void# -> r) -> (Void# -> r) -> r
MAJOR_VERSION = 0x1000

pattern MINOR_VERSION :: (Eq a, Num a) => a
pattern $bMINOR_VERSION :: a
$mMINOR_VERSION :: forall r a. (Eq a, Num a) => a -> (Void# -> r) -> (Void# -> r) -> r
MINOR_VERSION = 0x1001

pattern CAPTURE_SAMPLES :: (Eq a, Num a) => a
pattern $bCAPTURE_SAMPLES :: a
$mCAPTURE_SAMPLES :: forall r a. (Eq a, Num a) => a -> (Void# -> r) -> (Void# -> r) -> r
CAPTURE_SAMPLES = 0x0312