packages feed

openal-ffi-0.0.1: src/Sound/OpenAL/FFI/ALC.hs

{-# 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 (Eq, Ord, 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 (Eq, Ord, Show)

nullDevice :: Device
nullDevice = Device 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 INVALID_DEVICE = 0xA001

pattern INVALID_CONTEXT :: (Eq a, Num a) => a
pattern INVALID_CONTEXT = 0xA002

pattern INVALID_ENUM :: (Eq a, Num a) => a
pattern INVALID_ENUM = 0xA003

pattern INVALID_VALUE :: (Eq a, Num a) => a
pattern INVALID_VALUE = 0xA004

pattern INVALID_OPERATION :: (Eq a, Num a) => a
pattern INVALID_OPERATION = 0xA006

pattern OUT_OF_MEMORY :: (Eq a, Num a) => a
pattern 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 FREQUENCY = 0x1007

pattern REFRESH :: (Eq a, Num a) => a
pattern REFRESH = 0x1008

pattern SYNC :: (Eq a, Num a) => a
pattern SYNC = 0x1009

pattern MONO_SOURCES :: (Eq a, Num a) => a
pattern MONO_SOURCES = 0x1010

pattern STEREO_SOURCES :: (Eq a, Num a) => a
pattern STEREO_SOURCES = 0x1011

pattern DEFAULT_DEVICE_SPECIFIER :: (Eq a, Num a) => a
pattern DEFAULT_DEVICE_SPECIFIER = 0x1004

pattern DEVICE_SPECIFIER :: (Eq a, Num a) => a
pattern DEVICE_SPECIFIER = 0x1005

pattern EXTENSIONS :: (Eq a, Num a) => a
pattern EXTENSIONS = 0x1006

pattern CAPTURE_DEFAULT_DEVICE_SPECIFIER :: (Eq a, Num a) => a
pattern CAPTURE_DEFAULT_DEVICE_SPECIFIER = 0x0311

pattern CAPTURE_DEVICE_SPECIFIER :: (Eq a, Num a) => a
pattern CAPTURE_DEVICE_SPECIFIER = 0x0310

pattern ATTRIBUTES_SIZE :: (Eq a, Num a) => a
pattern ATTRIBUTES_SIZE = 0x1002

pattern ALL_ATTRIBUTES :: (Eq a, Num a) => a
pattern ALL_ATTRIBUTES = 0x1003

pattern MAJOR_VERSION :: (Eq a, Num a) => a
pattern MAJOR_VERSION = 0x1000

pattern MINOR_VERSION :: (Eq a, Num a) => a
pattern MINOR_VERSION = 0x1001

pattern CAPTURE_SAMPLES :: (Eq a, Num a) => a
pattern CAPTURE_SAMPLES = 0x0312