-- #hide
--------------------------------------------------------------------------------
-- |
-- Module      :  Sound.OpenAL.AL.QueryUtils
-- Copyright   :  (c) Sven Panne 2003-2009
-- License     :  BSD-style (see the file libraries/OpenGL/LICENSE)
-- 
-- Maintainer  :  sven.panne@aedion.de
-- Stability   :  stable
-- Portability :  portable
--
-- This is a purely internal module with utilities to query OpenAL state.
--
--------------------------------------------------------------------------------

module Sound.OpenAL.AL.QueryUtils (
   GetPName(..), marshalGetPName,
   StringName(..), getString
) where

import Foreign.Ptr ( Ptr )
import Sound.OpenAL.AL.BasicTypes ( ALchar, ALenum )
import Sound.OpenAL.AL.String ( peekALString )
import Sound.OpenAL.Constants (
   al_DISTANCE_MODEL, al_DOPPLER_FACTOR, al_SPEED_OF_SOUND, al_POSITION,
   al_VELOCITY, al_GAIN, al_ORIENTATION, al_SOURCE_RELATIVE, al_SOURCE_TYPE,
   al_LOOPING, al_BUFFER, al_BUFFERS_QUEUED, al_BUFFERS_PROCESSED, al_MIN_GAIN,
   al_MAX_GAIN, al_REFERENCE_DISTANCE, al_ROLLOFF_FACTOR, al_MAX_DISTANCE,
   al_PITCH, al_DIRECTION, al_CONE_INNER_ANGLE, al_CONE_OUTER_ANGLE,
   al_CONE_OUTER_GAIN, al_SEC_OFFSET, al_SAMPLE_OFFSET, al_BYTE_OFFSET,
   al_SOURCE_STATE, al_VENDOR, al_RENDERER, al_VERSION, al_EXTENSIONS )

--------------------------------------------------------------------------------

data GetPName =
     GetDistanceModel
   | GetDopplerFactor
   | GetSpeedOfSound

   | GetPosition

   | GetVelocity
   | GetGain

   | GetOrientation

   | GetSourceRelative
   | GetSourceType
   | GetLooping
   | GetBuffer
   | GetBuffersQueued
   | GetBuffersProcessed
   | GetMinGain
   | GetMaxGain
   | GetReferenceDistance
   | GetRolloffFactor
   | GetMaxDistance
   | GetPitch
   | GetDirection
   | GetConeInnerAngle
   | GetConeOuterAngle
   | GetConeOuterGain
   | GetSecOffset
   | GetSampleOffset
   | GetByteOffset
   | GetSourceState

marshalGetPName :: GetPName -> ALenum
marshalGetPName x = case x of
   GetDistanceModel -> al_DISTANCE_MODEL
   GetDopplerFactor -> al_DOPPLER_FACTOR
   GetSpeedOfSound -> al_SPEED_OF_SOUND

   GetPosition -> al_POSITION
   GetVelocity -> al_VELOCITY
   GetGain -> al_GAIN

   GetOrientation -> al_ORIENTATION

   GetSourceRelative -> al_SOURCE_RELATIVE
   GetSourceType -> al_SOURCE_TYPE
   GetLooping -> al_LOOPING
   GetBuffer -> al_BUFFER
   GetBuffersQueued -> al_BUFFERS_QUEUED
   GetBuffersProcessed -> al_BUFFERS_PROCESSED
   GetMinGain -> al_MIN_GAIN
   GetMaxGain -> al_MAX_GAIN
   GetReferenceDistance -> al_REFERENCE_DISTANCE
   GetRolloffFactor -> al_ROLLOFF_FACTOR
   GetMaxDistance -> al_MAX_DISTANCE
   GetPitch -> al_PITCH
   GetDirection -> al_DIRECTION
   GetConeInnerAngle -> al_CONE_INNER_ANGLE
   GetConeOuterAngle -> al_CONE_OUTER_ANGLE
   GetConeOuterGain -> al_CONE_OUTER_GAIN
   GetSecOffset -> al_SEC_OFFSET
   GetSampleOffset -> al_SAMPLE_OFFSET
   GetByteOffset -> al_BYTE_OFFSET
   GetSourceState -> al_SOURCE_STATE

--------------------------------------------------------------------------------

data StringName =
     Vendor
   | Renderer
   | Version
   | Extensions
   | ALErrorCategory ALenum

marshalStringName :: StringName -> ALenum
marshalStringName x = case x of
   Vendor -> al_VENDOR
   Renderer -> al_RENDERER
   Version -> al_VERSION
   Extensions -> al_EXTENSIONS
   ALErrorCategory e -> e

getString :: StringName -> IO String
getString n = alGetString (marshalStringName n) >>= peekALString 

foreign import CALLCONV unsafe "alGetString"
   alGetString :: ALenum -> IO (Ptr ALchar)