packages feed

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

{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE GeneralisedNewtypeDeriving #-}

module Sound.OpenAL.FFI.AL where

import Foreign (FunPtr, Ptr, Storable)
import Foreign.C.Types
import Foreign.C.String (CString)

import Sound.OpenAL.FFI.Utils (Dynamic)

-- * Source

newtype Source = Source CUInt
  deriving stock (Eq, Ord, Show)
  deriving newtype (Storable)

foreign import ccall unsafe "alGenSources"
  alGenSources :: CInt -> Ptr Source -> IO ()

foreign import ccall unsafe "alDeleteSources"
  alDeleteSources :: CInt -> Ptr Source -> IO ()

foreign import ccall unsafe "alIsSource"
  alIsSource :: Source -> IO CChar

foreign import ccall unsafe "alGetSourcefv"
  alGetSourcefv :: Source -> CInt -> Ptr CFloat -> IO ()

foreign import ccall unsafe "alSourcefv"
  alSourcefv :: Source -> CInt -> Ptr CFloat -> IO ()

foreign import ccall unsafe "alGetSourceiv"
  alGetSourceiv :: Source ->  CInt -> Ptr CInt -> IO ()

foreign import ccall unsafe "alSourcei"
  alSourcei :: Source -> CInt -> CInt -> IO ()

foreign import ccall unsafe "alSourceQueueBuffers"
  alSourceQueueBuffers :: Source -> CInt -> Ptr Buffer -> IO ()

foreign import ccall unsafe "alSourceUnqueueBuffers"
  alSourceUnqueueBuffers :: Source -> CInt -> Ptr Buffer -> IO ()

foreign import ccall unsafe "alSourcePlayv"
  alSourcePlayv :: CInt -> Ptr Source -> IO ()

foreign import ccall unsafe "alSourcePausev"
  alSourcePausev :: CInt -> Ptr Source -> IO ()

foreign import ccall unsafe "alSourceStopv"
  alSourceStopv :: CInt -> Ptr Source -> IO ()

foreign import ccall unsafe "alSourceRewindv"
  alSourceRewindv :: CInt -> Ptr Source -> IO ()

-- * Buffer

newtype Buffer = Buffer CUInt
  deriving stock (Eq, Ord, Show)
  deriving newtype (Storable)

foreign import ccall unsafe "alGenBuffers"
  alGenBuffers :: CInt -> Ptr Buffer -> IO ()

foreign import ccall unsafe "alDeleteBuffers"
  alDeleteBuffers :: CInt -> Ptr Buffer -> IO ()

foreign import ccall unsafe "alBufferData"
  alBufferData :: Buffer -> CInt -> Ptr () -> CInt -> CInt -> IO ()

foreign import ccall unsafe "alGetBufferi"
  alGetBufferi :: Buffer -> CInt -> Ptr CInt -> IO ()

foreign import ccall unsafe "alIsBuffer"
  alIsBuffer :: Buffer -> IO CChar

-- * Errors

foreign import ccall unsafe "alGetError"
  alGetError :: IO CInt

pattern INVALID_NAME :: (Eq a, Num a) => a
pattern INVALID_NAME = 0xA001

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

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

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

pattern OUT_OF_MEMORY :: (Eq a, Num a) => a
pattern OUT_OF_MEMORY = 0xA005

-- * Listener

foreign import ccall unsafe "alListenerf"
  alListenerf :: CInt -> CFloat -> IO ()

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

foreign import ccall unsafe "alGetListenerfv"
  alGetListenerfv :: CInt -> Ptr CFloat -> IO ()

-- * Queries

foreign import ccall unsafe "alGetEnumValue"
  alGetEnumValue :: CString -> IO CInt

foreign import ccall unsafe "alGetFloat"
  alGetFloat :: CInt -> IO CFloat

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

foreign import ccall unsafe "alDistanceModel"
  alDistanceModel :: CInt -> IO ()

-- ** Strings

foreign import ccall unsafe "alGetString"
  alGetString :: CInt -> IO CString

pattern VERSION :: (Eq a, Num a) => a
pattern VERSION = 0xB002

pattern RENDERER :: (Eq a, Num a) => a
pattern RENDERER = 0xB003

pattern VENDOR :: (Eq a, Num a) => a
pattern VENDOR = 0xB001

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

-- ** Extensions

foreign import ccall unsafe "alIsExtensionPresent"
  alIsExtensionPresent_ :: CString -> IO CBool

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

foreign import ccall unsafe "dynamic"
  invokeWithFloat :: Dynamic (CFloat -> IO ())

-- * Enums

pattern DISTANCE_MODEL :: (Eq a, Num a) => a
pattern DISTANCE_MODEL = 0xD000

pattern DOPPLER_FACTOR :: (Eq a, Num a) => a
pattern DOPPLER_FACTOR = 0xC000

pattern SPEED_OF_SOUND :: (Eq a, Num a) => a
pattern SPEED_OF_SOUND = 0xC003


pattern INVERSE_DISTANCE :: (Eq a, Num a) => a
pattern INVERSE_DISTANCE = 0xD001

pattern INVERSE_DISTANCE_CLAMPED :: (Eq a, Num a) => a
pattern INVERSE_DISTANCE_CLAMPED = 0xD002

pattern LINEAR_DISTANCE :: (Eq a, Num a) => a
pattern LINEAR_DISTANCE = 0xD003

pattern LINEAR_DISTANCE_CLAMPED :: (Eq a, Num a) => a
pattern LINEAR_DISTANCE_CLAMPED = 0xD004

pattern EXPONENT_DISTANCE :: (Eq a, Num a) => a
pattern EXPONENT_DISTANCE = 0xD005

pattern EXPONENT_DISTANCE_CLAMPED :: (Eq a, Num a) => a
pattern EXPONENT_DISTANCE_CLAMPED = 0xD006


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

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

pattern GAIN :: (Eq a, Num a) => a
pattern GAIN = 0x100A


pattern ORIENTATION :: (Eq a, Num a) => a
pattern ORIENTATION = 0x100F


pattern SOURCE_RELATIVE :: (Eq a, Num a) => a
pattern SOURCE_RELATIVE = 0x0202

pattern SOURCE_TYPE :: (Eq a, Num a) => a
pattern SOURCE_TYPE = 0x1027

pattern LOOPING :: (Eq a, Num a) => a
pattern LOOPING = 0x1007

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

pattern BUFFERS_QUEUED :: (Eq a, Num a) => a
pattern BUFFERS_QUEUED = 0x1015

pattern BUFFERS_PROCESSED :: (Eq a, Num a) => a
pattern BUFFERS_PROCESSED = 0x1016

pattern MIN_GAIN :: (Eq a, Num a) => a
pattern MIN_GAIN = 0x100D

pattern MAX_GAIN :: (Eq a, Num a) => a
pattern MAX_GAIN = 0x100E

pattern REFERENCE_DISTANCE :: (Eq a, Num a) => a
pattern REFERENCE_DISTANCE = 0x1020

pattern ROLLOFF_FACTOR :: (Eq a, Num a) => a
pattern ROLLOFF_FACTOR = 0x1021

pattern MAX_DISTANCE :: (Eq a, Num a) => a
pattern MAX_DISTANCE = 0x1023

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

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

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

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

pattern CONE_OUTER_GAIN :: (Eq a, Num a) => a
pattern CONE_OUTER_GAIN = 0x1022

pattern SEC_OFFSET :: (Eq a, Num a) => a
pattern SEC_OFFSET = 0x1024

pattern SAMPLE_OFFSET :: (Eq a, Num a) => a
pattern SAMPLE_OFFSET = 0x1025

pattern BYTE_OFFSET :: (Eq a, Num a) => a
pattern BYTE_OFFSET = 0x1026

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


pattern UNDETERMINED :: (Eq a, Num a) => a
pattern UNDETERMINED = 0x1030

pattern STATIC :: (Eq a, Num a) => a
pattern STATIC = 0x1028

pattern STREAMING :: (Eq a, Num a) => a
pattern STREAMING = 0x1029


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

pattern PLAYING :: (Eq a, Num a) => a
pattern PLAYING = 0x1012

pattern PAUSED :: (Eq a, Num a) => a
pattern PAUSED  = 0x1013

pattern STOPPED :: (Eq a, Num a) => a
pattern STOPPED = 0x1014


pattern FREQUENCY :: (Eq a, Num a) => a
pattern FREQUENCY = 0x2001

pattern SIZE :: (Eq a, Num a) => a
pattern SIZE = 0x2004

pattern BITS :: (Eq a, Num a) => a
pattern BITS = 0x2002

pattern CHANNELS :: (Eq a, Num a) => a
pattern CHANNELS = 0x2003


pattern FORMAT_MONO8 :: (Eq a, Num a) => a
pattern FORMAT_MONO8 = 0x1100

pattern FORMAT_MONO16 :: (Eq a, Num a) => a
pattern FORMAT_MONO16 = 0x1101

pattern FORMAT_STEREO8 :: (Eq a, Num a) => a
pattern FORMAT_STEREO8 = 0x1102

pattern FORMAT_STEREO16 :: (Eq a, Num a) => a
pattern FORMAT_STEREO16 = 0x1103