hugs98/openal-1.0_1.2.patch

9430 lines
328 KiB
Diff

diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/LICENSE ghc-6.4.2/libraries/OpenAL/LICENSE
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/LICENSE 2004-01-03 04:03:07.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/LICENSE 2006-03-22 00:58:03.000000000 +0900
@@ -1,4 +1,4 @@
-Copyright (c) 2003-2004, Sven Panne
+Copyright (c) 2003-2005, Sven Panne
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Makefile ghc-6.4.2/libraries/OpenAL/Makefile
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Makefile 2005-03-03 01:39:55.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Makefile 2006-03-22 00:58:03.000000000 +0900
@@ -4,6 +4,12 @@
include $(TOP)/mk/boilerplate.mk
-include config.mk
+ifneq "$(findstring clean, $(MAKECMDGOALS))" ""
+# if we're cleaning, then config.mk might have been cleaned already
+AL_BUILD_PACKAGE=yes
+PACKAGE=OpenAL
+endif
+
ifneq "$(AL_BUILD_PACKAGE)" "no"
# -----------------------------------------------------------------------------
@@ -18,19 +24,17 @@
Sound \
Sound/OpenAL \
Sound/OpenAL/AL \
- Sound/OpenAL/ALC \
- Sound/OpenAL/ALUT
+ Sound/OpenAL/ALC
PACKAGE_DEPS = base OpenGL
SRC_HC_OPTS += -Wall -fffi -Iinclude '-\#include "HsOpenAL.h"' -cpp
# WinDoze DLL hell
+# NOTE: For some obscure/unknown reason, OpenAL uses ccall, even on WinDoze...
+SRC_HC_OPTS += -DCALLCONV=ccall
ifeq "$(TARGETPLATFORM)" "i386-unknown-mingw32"
-SRC_HC_OPTS += -DCALLCONV=stdcall
SRC_HC_OPTS := $(subst -mno-cygwin,,$(SRC_HC_OPTS))
-else
-SRC_HC_OPTS += -DCALLCONV=ccall
endif
PACKAGE_CPP_OPTS += -DMAINTAINER=$(MAINTAINER)
@@ -41,18 +45,14 @@
package.conf.inplace \
package.conf.installed \
-Sound/OpenAL/AL/BasicTypes.$(way_)o \
-Sound/OpenAL/AL/Format.$(way_)o \
-Sound/OpenAL/ALC/BasicTypes.$(way_)o \
-Sound/OpenAL/ALC/Errors.$(way_)o \
-Sound/OpenAL/ALC/Queries.$(way_)o : include/HsOpenALConfig.h
+Sound/OpenAL/Config.$(way_)o \
+Sound/OpenAL/Constants.$(way_)o : include/HsOpenALConfig.h
endif
# -----------------------------------------------------------------------------
-DIST_CLEAN_FILES += OpenAL.buildinfo config.cache config.status
-LATE_DIST_CLEAN_FILES += config.mk
+DIST_CLEAN_FILES += OpenAL.buildinfo config.cache config.status config.mk
extraclean::
$(RM) -rf autom4te.cache
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/OpenAL.buildinfo.in ghc-6.4.2/libraries/OpenAL/OpenAL.buildinfo.in
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/OpenAL.buildinfo.in 2005-01-16 22:13:05.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/OpenAL.buildinfo.in 2006-03-22 00:58:03.000000000 +0900
@@ -2,6 +2,7 @@
-- System-dependent values used by Distribution.Simple.defaultUserHooks
--
buildable: @BUILD_PACKAGE_BOOL@
+ghc-options: -DCALLCONV=@CALLCONV@
cc-options: -DCALLCONV=@CALLCONV@
ld-options: @AL_LIBS@
frameworks: @AL_FRAMEWORKS@
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/OpenAL.cabal ghc-6.4.2/libraries/OpenAL/OpenAL.cabal
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/OpenAL.cabal 2005-02-11 10:55:55.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/OpenAL.cabal 2006-03-22 00:58:03.000000000 +0900
@@ -1,5 +1,5 @@
name: OpenAL
-version: 1.0
+version: 1.2
license: BSD3
license-file: LICENSE
maintainer: Sven Panne <sven.panne@aedion.de>
@@ -10,27 +10,36 @@
exposed-modules:
Sound.OpenAL,
Sound.OpenAL.AL,
+ Sound.OpenAL.AL.ALboolean,
+ Sound.OpenAL.AL.Attenuation,
Sound.OpenAL.AL.BasicTypes,
Sound.OpenAL.AL.Buffer,
+ Sound.OpenAL.AL.BufferInternal,
+ Sound.OpenAL.AL.Doppler,
+ Sound.OpenAL.AL.Errors,
+ Sound.OpenAL.AL.Extensions,
+ Sound.OpenAL.AL.Format,
Sound.OpenAL.AL.Listener,
Sound.OpenAL.AL.Source,
+ Sound.OpenAL.AL.StringQueries,
Sound.OpenAL.ALC,
+ Sound.OpenAL.ALC.BasicTypes,
+ Sound.OpenAL.ALC.Capture,
Sound.OpenAL.ALC.Context,
Sound.OpenAL.ALC.Device,
Sound.OpenAL.ALC.Errors,
- Sound.OpenAL.ALC.Extensions,
- Sound.OpenAL.ALUT,
- Sound.OpenAL.ALUT.Initialization,
- Sound.OpenAL.ALUT.WAV
+ Sound.OpenAL.ALC.Extensions
other-modules:
- Sound.OpenAL.AL.ALboolean,
- Sound.OpenAL.AL.Format,
Sound.OpenAL.AL.PeekPoke,
Sound.OpenAL.AL.QueryUtils,
- Sound.OpenAL.ALC.BasicTypes,
- Sound.OpenAL.ALC.Queries,
- Sound.OpenAL.ALUT.Exception
+ Sound.OpenAL.AL.SourceState,
+ Sound.OpenAL.AL.String,
+ Sound.OpenAL.ALC.ALCboolean,
+ Sound.OpenAL.ALC.QueryUtils,
+ Sound.OpenAL.ALC.String,
+ Sound.OpenAL.Config,
+ Sound.OpenAL.Constants
include-dirs: include
includes: "HsOpenAL.h"
build-depends: base, OpenGL
-extensions: CPP
+extensions: CPP, ForeignFunctionInterface
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/ALboolean.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/ALboolean.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/ALboolean.hs 2004-01-03 04:03:08.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/ALboolean.hs 2006-03-22 00:58:03.000000000 +0900
@@ -2,7 +2,7 @@
--------------------------------------------------------------------------------
-- |
-- Module : Sound.OpenAL.AL.ALboolean
--- Copyright : (c) Sven Panne 2003-2004
+-- Copyright : (c) Sven Panne 2003-2005
-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
--
-- Maintainer : sven.panne@aedion.de
@@ -14,16 +14,17 @@
--------------------------------------------------------------------------------
module Sound.OpenAL.AL.ALboolean (
- ALboolean, marshalALboolean, unmarshalALboolean
+ marshalALboolean, unmarshalALboolean
) where
import Sound.OpenAL.AL.BasicTypes ( ALboolean )
+import Sound.OpenAL.Constants ( al_FALSE, al_TRUE )
--------------------------------------------------------------------------------
marshalALboolean :: Bool -> ALboolean
-marshalALboolean False = 0
-marshalALboolean True = 1
+marshalALboolean False = al_FALSE
+marshalALboolean True = al_TRUE
unmarshalALboolean :: ALboolean -> Bool
-unmarshalALboolean = (/= 0)
+unmarshalALboolean = (/= al_FALSE)
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/Attenuation.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/Attenuation.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/Attenuation.hs 1970-01-01 09:00:00.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/Attenuation.hs 2006-03-22 00:58:03.000000000 +0900
@@ -0,0 +1,211 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module : Sound.OpenAL.AL.Attenuation
+-- Copyright : (c) Sven Panne 2005
+-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
+--
+-- Maintainer : sven.panne@aedion.de
+-- Stability : provisional
+-- Portability : portable
+--
+-- This module corresponds to section 3.4 (Attenuation By Distance) of the
+-- OpenAL Specification and Reference (version 1.1).
+--
+--------------------------------------------------------------------------------
+
+module Sound.OpenAL.AL.Attenuation (
+ -- * Introduction
+ -- $Introduction
+
+ -- * Handling the Distance Model
+ DistanceModel(..), distanceModel
+
+ -- * Evaluation of Gain\/Attenuation Related State
+ -- $EvaluationOfGainAttenuationRelatedState
+
+ -- * No Culling By Distance
+ -- $NoCullingByDistance
+) where
+
+import Foreign.Marshal.Alloc ( alloca )
+import Foreign.Ptr ( Ptr )
+import Graphics.Rendering.OpenGL.GL.StateVar ( StateVar, makeStateVar )
+import Sound.OpenAL.AL.BasicTypes ( ALint, ALenum )
+import Sound.OpenAL.AL.PeekPoke ( peek1 )
+import Sound.OpenAL.AL.QueryUtils (
+ GetPName(GetDistanceModel), marshalGetPName )
+import Sound.OpenAL.Constants (
+ al_NONE, al_INVERSE_DISTANCE, al_INVERSE_DISTANCE_CLAMPED,
+ al_LINEAR_DISTANCE, al_LINEAR_DISTANCE_CLAMPED, al_EXPONENT_DISTANCE,
+ al_EXPONENT_DISTANCE_CLAMPED )
+
+#ifdef __HADDOCK__
+import Sound.OpenAL.AL.Source (
+ sourceGain, gainBounds, coneAngles, coneOuterGain, referenceDistance,
+ rolloffFactor, maxDistance )
+#endif
+
+--------------------------------------------------------------------------------
+-- $Introduction
+-- Samples usually use the entire dynamic range of the chosen format\/encoding,
+-- independent of their real world intensity. In other words, a jet engine and a
+-- clockwork both will have samples with full amplitude. The application will
+-- then have to adjust source gain accordingly to account for relative
+-- differences.
+--
+-- Source gain is then attenuated by distance. The effective attenuation of a
+-- source depends on many factors, among which distance attenuation and source
+-- and listener gain are only some of the contributing factors. Even if the
+-- source and listener gain exceed 1 (amplification beyond the guaranteed
+-- dynamic range), distance and other attenuation might ultimately limit the
+-- overall gain to a value below 1.
+
+--------------------------------------------------------------------------------
+-- $EvaluationOfGainAttenuationRelatedState
+-- While amplification\/attenuation commute (multiplication of scaling factors),
+-- clamping operations do not. The order in which various gain related
+-- operations are applied is:
+--
+-- 1. Distance attenuation is calculated first, including minimum
+-- ('referenceDistance') and maximum ('maxDistance') thresholds.
+--
+-- 2. The result is then multiplied by source gain.
+--
+-- 3. If the source is directional (the inner cone angle is less than the outer
+-- cone angle, see 'coneAngles'), an angle-dependent attenuation is calculated
+-- depending on 'coneOuterGain', and multiplied with the distance-dependent
+-- attenuation. The resulting attenuation factor for the given angle and
+-- distance between listener and source is multiplied with 'sourceGain'.
+--
+-- 4. The effective gain computed this way is compared against 'gainBounds'.
+--
+-- 5. The result is guaranteed to be clamped to 'gainBounds', and subsequently
+-- multiplied by listener gain which serves as an overall volume control.
+--
+-- The implementation is free to clamp listener gain if necessary due to
+-- hardware or implementation constraints.
+
+--------------------------------------------------------------------------------
+-- $NoCullingByDistance
+-- With the DS3D compatible inverse clamped distance model, OpenAL provides a
+-- per-source 'maxDistance' attribute that can be used to define a distance
+-- beyond which the source will not be further attenuated by distance. The DS3D
+-- distance attenuation model and its clamping of volume is also extended by a
+-- mechanism to cull (mute) sources from processing, based on distance. However,
+-- the OpenAL does not support culling a source from processing based on a
+-- distance threshold.
+--
+-- At this time OpenAL is not meant to support culling at all. Culling based on
+-- distance, or bounding volumes, or other criteria, is best left to the
+-- application. For example, the application might employ sophisticated
+-- techniques to determine whether sources are audible that are beyond the scope
+-- of OpenAL. In particular, rule based culling inevitably introduces acoustic
+-- artifacts. E.g. if the listener-source distance is nearly equal to the culling
+-- threshold distance, but varies above and below, there will be popping
+-- artifacts in the absence of hysteresis.
+
+--------------------------------------------------------------------------------
+
+-- | OpenAL currently supports six modes of operation with respect to distance
+-- attenuation, including one that is similar to the IASIG I3DL2 model. The
+-- application chooses one of these models (or chooses to disable
+-- distance-dependent attenuation) on a per-context basis.
+--
+-- The distance used in the formulas for the \"clamped\" modes below is clamped
+-- to be in the range between 'referenceDistance' and 'maxDistance':
+--
+-- /clamped distance/ =
+-- max('referenceDistance', min(/distance/, 'maxDistance'))
+--
+-- The linear models are not physically realistic, but do allow full attenuation
+-- of a source beyond a specified distance. The OpenAL implementation is still
+-- free to apply any range clamping as necessary.
+--
+-- With all the distance models, if the formula can not be evaluated then the
+-- source will not be attenuated. For example, if a linear model is being used
+-- with 'referenceDistance' equal to 'maxDistance', then the gain equation will
+-- have a divide-by-zero error in it. In this case, there is no attenuation for
+-- that source.
+
+data DistanceModel =
+ NoAttenuation
+ -- ^ Bypass all distance attenuation calculation for all sources. The
+ -- implementation is expected to optimize this situation.
+ | InverseDistance
+ -- ^ Inverse distance rolloff model, which is equivalent to the IASIG I3DL2
+ -- model with the exception that 'referenceDistance' does not imply any
+ -- clamping.
+ --
+ -- /gain/ = 'referenceDistance' \/ ('referenceDistance' +
+ -- 'rolloffFactor' \* (/distance/ - 'referenceDistance'))
+ --
+ -- The 'referenceDistance' parameter used here is a per-source attribute
+ -- which is the distance at which the listener will experience gain
+ -- (unless the implementation had to clamp effective gain to the available
+ -- dynamic range). 'rolloffFactor' is per-source parameter the application
+ -- can use to increase or decrease the range of a source by decreasing or
+ -- increasing the attenuation, respectively. The default value is 1. The
+ -- implementation is free to optimize for a 'rolloffFactor' value of 0,
+ -- which indicates that the application does not wish any distance
+ -- attenuation on the respective source.
+ | InverseDistanceClamped
+ -- ^ Inverse Distance clamped model, which is essentially the inverse
+ -- distance rolloff model, extended to guarantee that for distances below
+ -- 'referenceDistance', gain is clamped. This mode is equivalent to the
+ -- IASIG I3DL2 distance model.
+ | LinearDistance
+ -- ^ Linear distance rolloff model, modeling a linear dropoff in gain as
+ -- distance increases between the source and listener.
+ --
+ -- /gain/ = (1 - 'rolloffFactor' \* (/distance/ - 'referenceDistance') \/
+ -- ('maxDistance' - 'referenceDistance'))
+ | LinearDistanceClamped
+ -- ^ Linear Distance clamped model, which is the linear model, extended to
+ -- guarantee that for distances below 'referenceDistance', gain is clamped.
+ | ExponentDistance
+ -- ^ Exponential distance rolloff model, modeling an exponential dropoff in
+ -- gain as distance increases between the source and listener.
+ --
+ -- /gain/ = (/distance/ \/ 'referenceDistance') \*\* (- 'rolloffFactor')
+ | ExponentDistanceClamped
+ -- ^ Exponential Distance clamped model, which is the exponential model,
+ -- extended to guarantee that for distances below 'referenceDistance',
+ -- gain is clamped.
+ deriving ( Eq, Ord, Show )
+
+marshalDistanceModel :: DistanceModel -> ALenum
+marshalDistanceModel x = case x of
+ NoAttenuation -> al_NONE
+ InverseDistance -> al_INVERSE_DISTANCE
+ InverseDistanceClamped -> al_INVERSE_DISTANCE_CLAMPED
+ LinearDistance -> al_LINEAR_DISTANCE
+ LinearDistanceClamped -> al_LINEAR_DISTANCE_CLAMPED
+ ExponentDistance -> al_EXPONENT_DISTANCE
+ ExponentDistanceClamped -> al_EXPONENT_DISTANCE_CLAMPED
+
+unmarshalDistanceModel :: ALenum -> DistanceModel
+unmarshalDistanceModel x
+ | x == al_NONE = NoAttenuation
+ | x == al_INVERSE_DISTANCE = InverseDistance
+ | x == al_INVERSE_DISTANCE_CLAMPED = InverseDistanceClamped
+ | x == al_LINEAR_DISTANCE = LinearDistance
+ | x == al_LINEAR_DISTANCE_CLAMPED = LinearDistanceClamped
+ | x == al_EXPONENT_DISTANCE = ExponentDistance
+ | x == al_EXPONENT_DISTANCE_CLAMPED = ExponentDistanceClamped
+ | otherwise = error ("unmarshalDistanceModel: illegal value " ++ show x)
+
+-- | Contains the current per-context distance model.
+
+distanceModel :: StateVar DistanceModel
+distanceModel =
+ makeStateVar
+ (alloca $ \buf -> do
+ alGetIntegerv (marshalGetPName GetDistanceModel) buf
+ peek1 (unmarshalDistanceModel . fromIntegral) buf)
+ (alDistanceModel . marshalDistanceModel)
+
+foreign import CALLCONV unsafe "alGetIntegerv"
+ alGetIntegerv :: ALenum -> Ptr ALint -> IO ()
+
+foreign import CALLCONV unsafe "alDistanceModel"
+ alDistanceModel :: ALenum -> IO ()
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/BasicTypes.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/BasicTypes.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/BasicTypes.hs 2004-01-03 04:03:08.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/BasicTypes.hs 2006-03-22 00:58:03.000000000 +0900
@@ -1,72 +1,49 @@
--------------------------------------------------------------------------------
-- |
-- Module : Sound.OpenAL.AL.BasicTypes
--- Copyright : (c) Sven Panne 2003-2004
+-- Copyright : (c) Sven Panne 2003-2005
-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
--
-- Maintainer : sven.panne@aedion.de
-- Stability : provisional
-- Portability : portable
--
--- This module corresponds to section 2.1.1 (Primitive Types) of the OpenAL
--- Specification and Reference (version 1.0).
+-- This module corresponds to section 2.2 (Primitive Types) of the OpenAL
+-- Specification and Reference (version 1.1).
--
--------------------------------------------------------------------------------
module Sound.OpenAL.AL.BasicTypes (
- ALboolean, ALbyte, ALshort, ALint, ALubyte, ALushort, ALuint, ALsizei,
- ALenum, ALbitfield, ALfloat, ALclampf, ALdouble, ALclampd
-) where
-
---------------------------------------------------------------------------------
+ -- * Primitive Types
+ -- $PrimitiveTypes
-import Data.Int
-import Data.Word
+ -- * Floating-Point Computation
+ -- $FloatingPointComputation
---------------------------------------------------------------------------------
+ ALboolean, ALchar, ALbyte, ALubyte, ALshort, ALushort, ALint, ALuint,
+ ALsizei, ALenum, ALfloat, ALdouble
+) where
-#include "HsOpenALConfig.h"
+import Sound.OpenAL.Config
--------------------------------------------------------------------------------
-
--- | Boolean (min. 1 bit)
-type ALboolean = HTYPE_ALBOOLEAN
-
--- | Signed 2\'s complement binary integer (min. 8 bits)
-type ALbyte = HTYPE_ALBYTE
-
--- | Unsigned binary integer (min. 8 bits)
-type ALubyte = HTYPE_ALUBYTE
-
--- | Signed 2\'s complement binary integer (min. 16 bits)
-type ALshort = HTYPE_ALSHORT
-
--- | Unsigned binary integer (min. 16 bits)
-type ALushort = HTYPE_ALUSHORT
-
--- | Signed 2\'s complement binary integer (min. 32 bits)
-type ALint = HTYPE_ALINT
-
--- | Unsigned binary integer (min. 32 bits)
-type ALuint = HTYPE_ALUINT
-
--- | Non-negatitve binary integer size (min. 32 bits)
-type ALsizei = HTYPE_ALSIZEI
-
--- | Enumerated binary integer value (min. 32 bits)
-type ALenum = HTYPE_ALENUM
-
--- | Bit field (min. 32 bits)
-type ALbitfield = HTYPE_ALBITFIELD
-
--- | Floating-point value (min. 32 bits)
-type ALfloat = HTYPE_ALFLOAT
-
--- | Floating-point value clamped to [0,1] (min. 32 bits)
-type ALclampf = HTYPE_ALCLAMPF
-
--- | Floating-point value (min. 64 bits)
-type ALdouble = HTYPE_ALDOUBLE
-
--- | Floating-point value clamped to [0,1] (min. 64 bits)
-type ALclampd = HTYPE_ALCLAMPD
+-- $PrimitiveTypes
+-- As OpenAL is meant to allow for seamless integration with OpenGL code if
+-- needed, the OpenAL library primitive (scalar) data types mimic the OpenGL
+-- data types. Guaranteed minimum sizes are stated for OpenGL data types, but
+-- the actual choice of C data type is left to the implementation. All
+-- implementations on a given binary architecture, however, must use a common
+-- definition of these data types.
+
+--------------------------------------------------------------------------------
+-- $FloatingPointComputation
+-- Any representable floating-point value is legal as input to an OpenAL command
+-- that requires floating point data. The result of providing a value that is
+-- not a floating point number to such a command is unspecified, but must not
+-- lead to OpenAL being interrupted or terminated. In IEEE arithmetic, for
+-- example, providing a negative zero or a denormalized number to an OpenAL
+-- command yields predictable results, while providing a NaN or infinity yields
+-- unspecified results. Some calculations require division. In such cases
+-- (including implied divisions required by vector normalizations), a division
+-- by zero produces an unspecified result but must not lead to OpenAL
+-- interruption or termination.
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/Buffer.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/Buffer.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/Buffer.hs 2004-05-12 04:31:01.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/Buffer.hs 2006-03-22 00:58:03.000000000 +0900
@@ -1,34 +1,101 @@
--------------------------------------------------------------------------------
-- |
-- Module : Sound.OpenAL.AL.Buffer
--- Copyright : (c) Sven Panne 2003-2004
+-- Copyright : (c) Sven Panne 2003-2005
-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
--
-- Maintainer : sven.panne@aedion.de
-- Stability : provisional
-- Portability : portable
--
+-- This module corresponds to chapter 6 (Buffers) of the OpenAL Specification
+-- and Reference (version 1.1).
+--
+-- A buffer encapsulates OpenAL state related to storing sample data. The
+-- application can request and release buffer objects, and fill them with
+-- data. Data can be supplied compressed and encoded as long as the format is
+-- supported. Buffers can, internally, contain waveform data as uncompressed or
+-- compressed samples.
+--
+-- Unlike source (see "Sound.OpenAL.AL.Source") and listener (see
+-- "Sound.OpenAL.AL.Listener") objects, buffer objects can be shared among AL
+-- contexts. Buffers are referenced by sources. A single buffer can be referred
+-- to by multiple sources. This separation allows drivers and hardware to
+-- optimize storage and processing where applicable.
+--
+-- The simplest supported format for buffer data is PCM. PCM data is assumed to
+-- use the processor\'s native byte order. Other formats use the byte order
+-- native to that format.
+--
+-- At this time, buffer states are defined for purposes of discussion. The
+-- states described in this section are not exposed through the API (can not be
+-- queried, or be set directly), and the state description used in the
+-- implementation might differ from this.
+--
+-- A buffer is considered to be in one of the following states, with respect to
+-- all sources:
+--
+-- [/unused/] The buffer is not included in any queue for any source. In
+-- particular, the buffer is neither pending nor current for any source. The
+-- buffer name can be deleted at this time.
+--
+-- [/processed/] The buffer is listed in the queue of at least one source, but
+-- is neither pending nor current for any source. The buffer can be deleted as
+-- soon as it has been unqueued for all sources it is queued with.
+--
+-- [/pending/] There is at least one source for which the buffer has been queued,
+-- for which the buffer data has not yet been dereferenced. The buffer can only
+-- be unqueued for those sources that have dereferenced the data in the buffer
+-- in its entirety, and cannot be deleted or changed.
+--
+-- The buffer state is dependent on the state of all sources that is has been
+-- queued for. A single queue occurrence of a buffer propagates the buffer state
+-- (over all sources) from /unused/ to /processed/ or higher. Sources that are
+-- in the 'Stopped' or 'Initial' states still have queue entries that cause
+-- buffers to be /processed/.
+--
+-- A single queue entry with a single source for which the buffer is not yet
+-- /processed/ propagates the buffer\'s queuing state to /pending/.
+--
+-- Buffers that are /processed/ for a given source can be unqueued from that
+-- source\'s queue. Buffers that have been unqueued from all sources are
+-- /unused/. Buffers that are /unused/ can be deleted, or changed by writing
+-- 'bufferData'.
+--
--------------------------------------------------------------------------------
module Sound.OpenAL.AL.Buffer (
- Format(..), BufferSize, Frequency, BufferData(..),
- Buffer, bufferData
+ Buffer, MemoryRegion(..), Format(..), BufferData(..), bufferData
) where
-import Control.Monad ( liftM )
import Foreign.Marshal.Alloc ( alloca )
-import Foreign.Marshal.Array ( withArrayLen, peekArray, allocaArray )
import Foreign.Ptr ( Ptr, nullPtr )
-import Foreign.Storable ( Storable(peek) )
-import Graphics.Rendering.OpenGL.GL.BufferObjects ( ObjectName(..) )
import Graphics.Rendering.OpenGL.GL.StateVar ( StateVar, makeStateVar )
-import Sound.OpenAL.AL.BasicTypes
+import Sound.OpenAL.AL.BufferInternal ( Buffer )
+import Sound.OpenAL.AL.BasicTypes ( ALint, ALsizei, ALenum )
import Sound.OpenAL.AL.Format ( Format(..), marshalFormat )
-import Sound.OpenAL.AL.ALboolean ( unmarshalALboolean )
+import Sound.OpenAL.AL.PeekPoke ( peek1 )
+import Sound.OpenAL.ALC.Context ( Frequency )
+import Sound.OpenAL.Constants ( al_FREQUENCY, al_SIZE, al_BITS, al_CHANNELS )
+
+#ifdef __HADDOCK__
+import Sound.OpenAL.AL.SourceState ( SourceState(..) )
+import Sound.OpenAL.AL.Errors ( ALErrorCategory(..) )
+#endif
--------------------------------------------------------------------------------
-data BufferData a = BufferData Format (Ptr a) BufferSize Frequency
+data MemoryRegion a = MemoryRegion (Ptr a) ALsizei
+#ifdef __HADDOCK__
+-- Help Haddock a bit, because it doesn't do any instance inference.
+instance Eq (MemoryRegion a)
+instance Ord (MemoryRegion a)
+instance Show (MemoryRegion a)
+#else
+ deriving ( Eq, Ord, Show )
+#endif
+
+data BufferData a = BufferData (MemoryRegion a) Format Frequency
#ifdef __HADDOCK__
-- Help Haddock a bit, because it doesn't do any instance inference.
instance Eq (BufferData a)
@@ -38,37 +105,25 @@
deriving ( Eq, Ord, Show )
#endif
-type BufferSize = ALsizei
-
-type Frequency = ALsizei -- or Float???
-
--------------------------------------------------------------------------------
-newtype Buffer = Buffer { bufferID :: ALuint }
- deriving ( Eq, Ord, Show )
-
-instance ObjectName Buffer where
- genObjectNames n =
- allocaArray n $ \buf -> do
- alGenBuffers (fromIntegral n) buf
- liftM (map Buffer) $ peekArray n buf
-
- deleteObjectNames buffers =
- withArrayLen (map bufferID buffers) $
- alDeleteBuffers . fromIntegral
-
- isObjectName = liftM unmarshalALboolean . alIsBuffer . bufferID
-
-foreign import CALLCONV unsafe "alGenBuffers"
- alGenBuffers :: ALsizei -> Ptr ALuint -> IO ()
-
-foreign import CALLCONV unsafe "alDeleteBuffers"
- alDeleteBuffers :: ALsizei -> Ptr ALuint -> IO ()
-
-foreign import CALLCONV unsafe "alIsBuffer"
- alIsBuffer :: ALuint -> IO ALboolean
-
---------------------------------------------------------------------------------
+-- | A special case of buffer state is the actual sound sample data stored in
+-- association with the buffer. Applications can specify sample data using
+-- 'bufferData'.
+--
+-- The data specified is copied to an internal software, or if possible,
+-- hardware buffer. The implementation is free to apply decompression,
+-- conversion, resampling, and filtering as needed. The internal format of the
+-- buffer is not exposed to the application, and not accessible.
+--
+-- Buffers containing audio data with more than one channel will be played
+-- without 3D spatialization features, these formats are normally used for
+-- background music. Applications should always check for an error condition
+-- after attempting to specify buffer data in case an implementation has to
+-- generate an 'ALOutOfMemory' or a conversion related 'ALInvalidValue' error.
+-- The application is free to reuse the memory specified by the data pointer
+-- once 'bufferData' is set. The implementation has to dereference, e.g. copy,
+-- the data while accessing 'bufferData' execution.
bufferData :: Buffer -> StateVar (BufferData a)
bufferData buffer = makeStateVar (getBufferData buffer) (setBufferData buffer)
@@ -80,11 +135,11 @@
raw <- return nullPtr -- ToDo: AL_DATA query missing!!!
size <- getBufferi buffer Size
frequency <- getBufferi buffer Frequency
- return $ BufferData (makeFormat channels bits) raw size frequency
+ return $ BufferData (MemoryRegion raw size) (makeFormat channels bits) frequency
setBufferData :: Buffer -> BufferData a -> IO ()
-setBufferData buffer (BufferData format raw size frequency) =
- alBufferData buffer (marshalFormat format) raw size frequency
+setBufferData buffer (BufferData (MemoryRegion raw size) format frequency) =
+ alBufferData buffer (marshalFormat format) raw size (round frequency)
foreign import CALLCONV unsafe "alBufferData"
alBufferData :: Buffer -> ALenum -> Ptr a -> ALsizei -> ALsizei -> IO ()
@@ -95,10 +150,8 @@
makeFormat :: ALint -> ALint -> Format
makeFormat 1 8 = Mono8
makeFormat 2 8 = Stereo8
-makeFormat 4 8 = Quad8
makeFormat 1 16 = Mono16
makeFormat 2 16 = Stereo16
-makeFormat 4 16 = Quad16
makeFormat channels bits =
error ("makeFormat: illegal values " ++ show (channels, bits))
@@ -106,17 +159,16 @@
data BufferQuery =
Frequency
+ | Size
| Bits
| Channels
- | Size
- -- AL_DATA ???
marshalBufferQuery :: BufferQuery -> ALenum
marshalBufferQuery x = case x of
- Frequency -> 0x2001
- Bits -> 0x2002
- Channels -> 0x2003
- Size -> 0x2004
+ Frequency -> al_FREQUENCY
+ Size -> al_SIZE
+ Bits -> al_BITS
+ Channels -> al_CHANNELS
--------------------------------------------------------------------------------
@@ -124,7 +176,7 @@
getBufferi buffer query =
alloca $ \buf -> do
alGetBufferi buffer (marshalBufferQuery query) buf
- liftM fromIntegral $ peek buf
+ peek1 fromIntegral buf
foreign import CALLCONV unsafe "alGetBufferi"
alGetBufferi :: Buffer -> ALenum -> Ptr ALint -> IO ()
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/BufferInternal.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/BufferInternal.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/BufferInternal.hs 1970-01-01 09:00:00.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/BufferInternal.hs 2006-03-22 00:58:03.000000000 +0900
@@ -0,0 +1,75 @@
+-- #hide
+--------------------------------------------------------------------------------
+-- |
+-- Module : Sound.OpenAL.AL.BufferInternal
+-- Copyright : (c) Sven Panne 2003-2005
+-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
+--
+-- Maintainer : sven.panne@aedion.de
+-- Stability : provisional
+-- Portability : portable
+--
+-- This is a purely internal module for (un-)marshaling Buffer.
+--
+--------------------------------------------------------------------------------
+
+module Sound.OpenAL.AL.BufferInternal (
+ Buffer, marshalBuffer, unmarshalBuffer
+) where
+
+import Foreign.Marshal.Array ( withArrayLen, peekArray, allocaArray )
+import Foreign.Ptr ( Ptr, castPtr )
+import Foreign.Storable ( Storable(..) )
+import Graphics.Rendering.OpenGL.GL.BufferObjects ( ObjectName(..) )
+import Sound.OpenAL.AL.ALboolean ( unmarshalALboolean )
+import Sound.OpenAL.AL.BasicTypes ( ALboolean, ALuint, ALsizei )
+import Sound.OpenAL.AL.PeekPoke ( peek1, poke1 )
+
+--------------------------------------------------------------------------------
+
+-- | The abstract buffer type.
+
+newtype Buffer = Buffer { bufferID :: ALuint }
+ deriving ( Eq, Ord, Show )
+
+-- | A dummy buffer.
+
+nullBuffer :: Buffer
+nullBuffer = Buffer 0
+
+marshalBuffer :: Maybe Buffer -> ALuint
+marshalBuffer = bufferID . maybe nullBuffer id
+
+unmarshalBuffer :: ALuint -> Maybe Buffer
+unmarshalBuffer b =
+ if b == bufferID nullBuffer then Nothing else Just (Buffer b)
+
+instance Storable Buffer where
+ sizeOf ~(Buffer b) = sizeOf b
+ alignment ~(Buffer b) = alignment b
+ peek = peek1 Buffer . castPtr
+ poke ptr (Buffer b) = poke1 (castPtr ptr) b
+
+--------------------------------------------------------------------------------
+-- This should really be in Sound.OpenAL.AL.Buffer, but we have it here to
+-- avoid an orphan module.
+
+instance ObjectName Buffer where
+ genObjectNames n =
+ allocaArray n $ \buf -> do
+ alGenBuffers (fromIntegral n) buf
+ peekArray n buf
+
+ deleteObjectNames buffers =
+ withArrayLen buffers $ alDeleteBuffers . fromIntegral
+
+ isObjectName = fmap unmarshalALboolean . alIsBuffer
+
+foreign import CALLCONV unsafe "alGenBuffers"
+ alGenBuffers :: ALsizei -> Ptr Buffer -> IO ()
+
+foreign import CALLCONV unsafe "alDeleteBuffers"
+ alDeleteBuffers :: ALsizei -> Ptr Buffer -> IO ()
+
+foreign import CALLCONV unsafe "alIsBuffer"
+ alIsBuffer :: Buffer -> IO ALboolean
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/Doppler.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/Doppler.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/Doppler.hs 1970-01-01 09:00:00.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/Doppler.hs 2006-03-22 00:58:03.000000000 +0900
@@ -0,0 +1,92 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module : Sound.OpenAL.AL.Doppler
+-- Copyright : (c) Sven Panne 2005
+-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
+--
+-- Maintainer : sven.panne@aedion.de
+-- Stability : provisional
+-- Portability : portable
+--
+-- This module corresponds to section 3.5.2. (Velocity Dependent Doppler Effect)
+-- of the OpenAL Specification and Reference (version 1.1).
+--
+--------------------------------------------------------------------------------
+
+module Sound.OpenAL.AL.Doppler (
+ -- * Introduction
+ -- $Introduction
+ dopplerFactor, speedOfSound
+) where
+
+import Foreign.Ptr ( FunPtr )
+import Graphics.Rendering.OpenGL.GL.StateVar (
+ HasGetter(get), StateVar, makeStateVar )
+import Sound.OpenAL.AL.BasicTypes ( ALenum, ALfloat )
+import Sound.OpenAL.AL.Extensions ( alProcAddress )
+import Sound.OpenAL.AL.QueryUtils (
+ GetPName(GetDopplerFactor,GetSpeedOfSound), marshalGetPName )
+
+#ifdef __HADDOCK__
+import Sound.OpenAL.AL.Errors ( ALError(ALInvalidValue) )
+#endif
+
+--------------------------------------------------------------------------------
+
+-- | 'dopplerFactor' is a simple scaling of source and listener velocities to
+-- exaggerate or deemphasize the Doppler (pitch) shift resulting from the
+-- calculation. Setting 'dopplerFactor' to a negative value will result in an
+-- 'ALInvalidValue' error, the command is then ignored. The default value is 1.
+-- The implementation is free to optimize the case of 'dopplerFactor' containing
+-- zero, as this effectively disables the effect.
+
+dopplerFactor :: StateVar ALfloat
+dopplerFactor = makeDopplerVar GetDopplerFactor "alDopplerFactor"
+
+--------------------------------------------------------------------------------
+
+-- | 'speedOfSound' allows the application to change the reference (propagation)
+-- speed used in the Doppler calculation. The source and listener velocities
+-- should be expressed in the same units as the speed of sound. Setting
+-- 'speedOfSound' to a negative or zero value will result in an 'ALInvalidValue'
+-- error, the command is ignored then. The default value is 343.3 (appropriate
+-- for velocity units of meters and air as the propagation medium).
+
+speedOfSound :: StateVar ALfloat
+speedOfSound = makeDopplerVar GetSpeedOfSound "alSpeedOfSound"
+
+--------------------------------------------------------------------------------
+
+makeDopplerVar :: GetPName -> String -> StateVar ALfloat
+makeDopplerVar p apiEntryName =
+ makeStateVar
+ (alGetFloat (marshalGetPName p))
+ (\value -> do
+ -- ToDo: Should we check alcVersion or alIsExtensionPresent here?
+ funPtr <- get (alProcAddress apiEntryName)
+ invokeWithFloat funPtr value)
+
+foreign import CALLCONV unsafe "alGetFloat"
+ alGetFloat :: ALenum -> IO ALfloat
+
+type Invoker a = FunPtr a -> a
+
+foreign import CALLCONV unsafe "dynamic"
+ invokeWithFloat :: Invoker (ALfloat -> IO ())
+
+--------------------------------------------------------------------------------
+-- $Introduction
+-- The Doppler Effect depends on the velocities of source and listener relative
+-- to the medium, and the propagation speed of sound in that medium. The
+-- application might want to emphasize or de-emphasize the Doppler Effect as
+-- physically accurate calculation might not give the desired results.
+-- The amount of frequency shift (pitch change) is proportional to the speed of
+-- listener and source along their line of sight.
+--
+-- The Doppler Effect as implemented by OpenAL is described in detail in section
+-- 3.5.2 of the OpenAL 1.1 specification. Note that effects of the medium (air,
+-- water) moving with respect to listener and source are ignored. There are two
+-- API calls global to the current context that provide control of the Doppler
+-- factor and the speed of sound. Distance and velocity units are completely
+-- independent of one another (so you could use different units for each if
+-- desired).
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/Errors.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/Errors.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/Errors.hs 1970-01-01 09:00:00.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/Errors.hs 2006-03-22 00:58:03.000000000 +0900
@@ -0,0 +1,88 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module : Sound.OpenAL.AL.Errors
+-- Copyright : (c) Sven Panne 2003-2005
+-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
+--
+-- Maintainer : sven.panne@aedion.de
+-- Stability : provisional
+-- Portability : portable
+--
+-- This module corresponds to section 2.7 (AL Errors) of the OpenAL
+-- Specification and Reference (version 1.1).
+--
+--------------------------------------------------------------------------------
+
+module Sound.OpenAL.AL.Errors (
+ ALError(..), ALErrorCategory(..), alErrors
+) where
+
+import Graphics.Rendering.OpenGL.GL.StateVar (
+ GettableStateVar, makeGettableStateVar )
+import Sound.OpenAL.AL.BasicTypes ( ALenum )
+import Sound.OpenAL.Constants (
+ al_NO_ERROR, al_INVALID_NAME, al_INVALID_ENUM, al_INVALID_VALUE,
+ al_INVALID_OPERATION, al_OUT_OF_MEMORY )
+import Sound.OpenAL.AL.QueryUtils ( StringName(..), getString )
+
+--------------------------------------------------------------------------------
+
+-- | AL errors consist of a general error category and a description of what
+-- went wrong.
+
+data ALError = ALError ALErrorCategory String
+ deriving ( Eq, Ord, Show )
+
+--------------------------------------------------------------------------------
+
+-- | General AL error categories.
+
+data ALErrorCategory =
+ ALInvalidEnum
+ | ALInvalidValue
+ | ALInvalidOperation
+ | ALInvalidName
+ | ALOutOfMemory
+ deriving ( Eq, Ord, Show )
+
+unmarshalALErrorCategory :: ALenum -> ALErrorCategory
+unmarshalALErrorCategory x
+ | x == al_INVALID_ENUM = ALInvalidEnum
+ | x == al_INVALID_VALUE = ALInvalidValue
+ | x == al_INVALID_OPERATION = ALInvalidOperation
+ | x == al_INVALID_NAME = ALInvalidName
+ | x == al_OUT_OF_MEMORY = ALOutOfMemory
+ | otherwise = error ("unmarshalALErrorCategory: illegal value " ++ show x)
+
+--------------------------------------------------------------------------------
+
+-- | OpenAL detects only a subset of those conditions that could be considered
+-- errors. This is because in many cases error checking would adversely impact
+-- the performance of an error-free program. The state variable 'alErrors' is
+-- used to obtain error information. When an error is detected by AL, a flag is
+-- set and the error code is recorded. Further errors, if they occur, do not
+-- affect this recorded code. When 'alErrors' is read, the error is returned and
+-- the flag is cleared, so that a further error will again record its code. If
+-- reading 'alErrors' returns @\[\]@ then there has been no detectable error
+-- since the last time 'alErrors' (or since the AL was initialized).
+--
+-- When an error flag is set, results of AL operations are undefined only if
+-- 'ALOutOfMemory' has occurred. In other cases, the command generating the
+-- error is ignored so that it has no effect on AL state or output buffer
+-- contents. If the error generating command returns a value, it returns zero.
+-- If the generating command modifies values through a pointer argument, no
+-- change is made to these values. These error semantics apply only to AL
+-- errors, not to system errors such as memory access errors.
+
+alErrors :: GettableStateVar [ALError]
+alErrors =
+ makeGettableStateVar $ do
+ c <- alGetError
+ if c == al_NO_ERROR
+ then return []
+ else do
+ s <- getString (ALErrorCategory c)
+ return [ ALError (unmarshalALErrorCategory c) s ]
+
+foreign import CALLCONV unsafe "alGetError"
+ alGetError :: IO ALenum
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/Extensions.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/Extensions.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/Extensions.hs 1970-01-01 09:00:00.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/Extensions.hs 2006-03-22 00:58:03.000000000 +0900
@@ -0,0 +1,102 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module : Sound.OpenAL.AL.Extensions
+-- Copyright : (c) Sven Panne 2003-2005
+-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
+--
+-- Maintainer : sven.panne@aedion.de
+-- Stability : provisional
+-- Portability : portable
+--
+-- This module corresponds to section 3.1.2 (String Queries) and chapter 7
+-- (Appendix: Extensions) of the OpenAL Specification and Reference (version
+-- 1.1).
+--
+--------------------------------------------------------------------------------
+
+module Sound.OpenAL.AL.Extensions (
+ alExtensions, alIsExtensionPresent, alProcAddress, alEnumValue, alVersion
+) where
+
+import Foreign.Ptr ( Ptr, FunPtr )
+import Graphics.Rendering.OpenGL.GL.StateVar (
+ GettableStateVar, makeGettableStateVar )
+import Sound.OpenAL.AL.ALboolean ( unmarshalALboolean )
+import Sound.OpenAL.AL.BasicTypes ( ALboolean, ALchar, ALenum )
+import Sound.OpenAL.AL.QueryUtils ( StringName(..), getString )
+import Sound.OpenAL.AL.String ( withALString )
+
+#ifdef __HADDOCK__
+import Foreign.Ptr ( nullFunPtr )
+#endif
+
+--------------------------------------------------------------------------------
+
+-- | Contains the list of available extensions.
+
+alExtensions :: GettableStateVar [String]
+alExtensions = makeGettableStateVar (fmap words $ getString Extensions)
+
+--------------------------------------------------------------------------------
+
+-- | Contains a version string in the format @\"/\<spec major number\>/./\<spec
+-- minor number\>/ /\<optional vendor version information\>/\"@.
+
+alVersion :: GettableStateVar String
+alVersion = makeGettableStateVar (getString Version)
+
+--------------------------------------------------------------------------------
+
+-- | To verify that a given extension is available for the current context, use
+-- 'alIsExtensionPresent'. For invalid and unsupported string tokens it contains
+-- 'False'. The extension name is not case sensitive: The implementation will
+-- convert the name to all upper-case internally (and will express extension
+-- names in upper-case).
+
+alIsExtensionPresent :: String -> GettableStateVar Bool
+alIsExtensionPresent extensionName =
+ makeGettableStateVar $
+ fmap unmarshalALboolean $
+ withALString extensionName alIsExtensionPresent_
+
+foreign import CALLCONV unsafe "alIsExtensionPresent"
+ alIsExtensionPresent_ :: Ptr ALchar -> IO ALboolean
+
+--------------------------------------------------------------------------------
+
+-- | To retrieving function entry addresses, applications can use
+-- 'alProcAddress'. It contains 'nullFunPtr' if no entry point with the given
+-- name can be found. Implementations are free to use 'nullFunPtr' if an
+-- entry point is present, but not applicable for the current context. However
+-- the specification does not guarantee this behavior. Applications can use
+-- 'alProcAddress' to obtain core API entry points, not just extensions. This
+-- is the recommended way to dynamically load and unload OpenAL DLLs as sound
+-- drivers.
+
+alProcAddress :: String -> GettableStateVar (FunPtr a)
+alProcAddress funcName = makeGettableStateVar $
+ withALString funcName alGetProcAddress
+
+foreign import CALLCONV unsafe "alGetProcAddress"
+ alGetProcAddress :: Ptr ALchar -> IO (FunPtr a)
+
+--------------------------------------------------------------------------------
+
+-- | To obtain enumeration values for extensions, the application has to use
+-- 'alEnumValue' of an extension token. Enumeration values are defined within
+-- the OpenAL name space and allocated according to specification of the core
+-- API and the extensions, thus they are context-independent.
+--
+-- 'alEnumValue' contains 0 if the enumeration can not be found. The presence of
+-- an enum value does not guarantee the applicability of an extension to the
+-- current context. A non-zero value indicates merely that the implementation is
+-- aware of the existence of this extension. Implementations should not attempt
+-- to use 0 to indicate that the extensions is not supported for the current
+-- context.
+
+alEnumValue :: String -> GettableStateVar ALenum
+alEnumValue enumName = makeGettableStateVar $
+ withALString enumName alGetEnumValue
+
+foreign import CALLCONV unsafe "alGetEnumValue"
+ alGetEnumValue :: Ptr ALchar -> IO ALenum
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/Format.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/Format.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/Format.hs 2004-04-05 21:55:40.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/Format.hs 2006-03-22 00:58:03.000000000 +0900
@@ -2,13 +2,15 @@
--------------------------------------------------------------------------------
-- |
-- Module : Sound.OpenAL.AL.Format
--- Copyright : (c) Sven Panne 2003-2004
+-- Copyright : (c) Sven Panne 2003-2005
-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
--
-- Maintainer : sven.panne@aedion.de
-- Stability : provisional
-- Portability : portable
--
+-- This is a purely internal module for (un-)marshaling Format.
+--
--------------------------------------------------------------------------------
module Sound.OpenAL.AL.Format (
@@ -16,49 +18,33 @@
) where
import Sound.OpenAL.AL.BasicTypes ( ALenum )
+import Sound.OpenAL.Constants (
+ al_FORMAT_MONO8, al_FORMAT_MONO16, al_FORMAT_STEREO8, al_FORMAT_STEREO16 )
--------------------------------------------------------------------------------
-#include "HsOpenALConfig.h"
-
---------------------------------------------------------------------------------
+-- | Valid sound formats. An implementation may expose other formats, see
+-- "Sound.OpenAL.ALC.Extensions" for information on determining if additional
+-- formats are supported.
data Format =
Mono8
| Mono16
| Stereo8
| Stereo16
- | IMAADPCMMono16
- | IMAADPCMStereo16
- | Wave
- | Vorbis
- | Quad8
- | Quad16
deriving ( Eq, Ord, Show )
marshalFormat :: Format -> ALenum
marshalFormat x = case x of
- Mono8 -> 0x1100
- Mono16 -> 0x1101
- Stereo8 -> 0x1102
- Stereo16 -> 0x1103
- IMAADPCMMono16 -> 0x10000
- IMAADPCMStereo16 -> 0x10001
- Wave -> 0x10002
- Vorbis -> CONST_AL_FORMAT_VORBIS_EXT
- Quad8 -> 0x10004
- Quad16 -> 0x10005
+ Mono8 -> al_FORMAT_MONO8
+ Mono16 -> al_FORMAT_MONO16
+ Stereo8 -> al_FORMAT_STEREO8
+ Stereo16 -> al_FORMAT_STEREO16
unmarshalFormat :: ALenum -> Format
unmarshalFormat x
- | x == 0x1100 = Mono8
- | x == 0x1101 = Mono16
- | x == 0x1102 = Stereo8
- | x == 0x1103 = Stereo16
- | x == 0x10000 = IMAADPCMMono16
- | x == 0x10001 = IMAADPCMStereo16
- | x == 0x10002 = Wave
- | x == CONST_AL_FORMAT_VORBIS_EXT = Vorbis
- | x == 0x10004 = Quad8
- | x == 0x10005 = Quad16
+ | x == al_FORMAT_MONO8 = Mono8
+ | x == al_FORMAT_MONO16 = Mono16
+ | x == al_FORMAT_STEREO8 = Stereo8
+ | x == al_FORMAT_STEREO16 = Stereo16
| otherwise = error ("unmarshalFormat: illegal value " ++ show x)
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/Listener.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/Listener.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/Listener.hs 2004-01-03 04:03:09.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/Listener.hs 2006-03-22 00:58:03.000000000 +0900
@@ -1,70 +1,112 @@
--------------------------------------------------------------------------------
-- |
-- Module : Sound.OpenAL.AL.Listener
--- Copyright : (c) Sven Panne 2003-2004
+-- Copyright : (c) Sven Panne 2003-2005
-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
--
-- Maintainer : sven.panne@aedion.de
-- Stability : provisional
-- Portability : portable
--
---------------------------------------------------------------------------------
+-- This module corresponds to sections 4.1 (Basic Listener and Source
+-- Attributes) and 4.2 (Listener Object) of the OpenAL Specification and
+-- Reference (version 1.1).
+--
+-- The listener object defines various properties that affect processing of the
+-- sound for the actual output. The listener is unique for an OpenAL Context,
+-- and has no name. By controlling the listener, the application controls the
+-- way the user experiences the virtual world, as the listener defines the
+-- sampling\/pickup point and orientation, and other parameters that affect the
+-- output stream.
+--
+-- It is entirely up to the driver and hardware configuration, i.e. the
+-- installation of OpenAL as part of the operating system and hardware setup,
+-- whether the output stream is generated for headphones or 2 speakers, 4.1
+-- speakers, or other arrangements, whether (and which) HRTFs are applied,
+-- etc...
+--
+---------------------------------------------------------------------------------
module Sound.OpenAL.AL.Listener (
- listenerGain, listenerPosition, listenerVelocity, orientation
+ listenerPosition, listenerVelocity, Gain, listenerGain, orientation
) where
-import Foreign.Marshal.Alloc ( alloca )
import Foreign.Marshal.Array ( allocaArray, withArray )
import Foreign.Marshal.Utils ( with )
import Foreign.Ptr ( Ptr )
+import Foreign.Storable ( Storable )
import Graphics.Rendering.OpenGL.GL.CoordTrans ( Vector3(..) )
import Graphics.Rendering.OpenGL.GL.VertexSpec ( Vertex3(..) )
import Graphics.Rendering.OpenGL.GL.StateVar ( StateVar, makeStateVar )
import Sound.OpenAL.AL.BasicTypes ( ALenum, ALfloat )
import Sound.OpenAL.AL.PeekPoke ( peek1, peek3, peek6 )
import Sound.OpenAL.AL.QueryUtils (
- GetPName(GetGain,GetPosition,GetVelocity,GetOrientation), marshalGetPName )
+ GetPName(GetPosition,GetVelocity,GetGain,GetOrientation), marshalGetPName )
--------------------------------------------------------------------------------
-listenerGain :: StateVar ALfloat
-listenerGain =
- makeStateVar
- (do alloca $ \buf -> do
- getListenerfv GetGain buf
- peek1 id buf)
- (listenerf GetGain)
-
---------------------------------------------------------------------------------
+-- | 'listenerPosition' contains the current location of the listener in the
+-- world coordinate system. Any 3-tuple of valid float values is allowed.
+-- Implementation behavior on encountering NaN and infinity is not defined. The
+-- initial position is ('Vertex3' 0 0 0).
listenerPosition :: StateVar (Vertex3 ALfloat)
-listenerPosition =
- makeStateVar
- (do allocaArray 3 $ \buf -> do
- getListenerfv GetPosition buf
- peek3 Vertex3 buf)
- (\pos -> with pos $ listenerVertex3 GetPosition)
+listenerPosition = makeListenerVar GetPosition 3 (peek3 Vertex3) listener3f
--------------------------------------------------------------------------------
+-- | 'listenerVelocity' contains current velocity (speed and direction) of the
+-- listener in the world coordinate system. Any 3-tuple of valid float
+-- values is allowed, and the initial velocity is ('Vector3' 0 0 0).
+-- 'listenerVelocity' does not affect 'listenerPosition'. OpenAL does not
+-- calculate the velocity from subsequent position updates, nor does it
+-- adjust the position over time based on the specified velocity. Any
+-- such calculation is left to the application. For the purposes of sound
+-- processing, position and velocity are independent parameters affecting
+-- different aspects of the sounds.
+--
+-- 'listenerVelocity' is taken into account by the driver to synthesize the
+-- Doppler effect perceived by the listener for each source, based on the
+-- velocity of both source and listener, and the Doppler related parameters.
+
listenerVelocity :: StateVar (Vector3 ALfloat)
-listenerVelocity =
- makeStateVar
- (do allocaArray 3 $ \buf -> do
- getListenerfv GetVelocity buf
- peek3 Vector3 buf)
- (\vel -> with vel $ listenerVector3 GetVelocity)
+listenerVelocity = makeListenerVar GetVelocity 3 (peek3 Vector3) listener3f
+
+--------------------------------------------------------------------------------
+
+-- | A scalar amplitude multiplier.
+type Gain = ALfloat
+
+-- | 'listenerGain' contains a scalar amplitude multiplier, which is effectively
+-- applied to all sources in the current context. The initial value 1 means
+-- that the sound is unattenuated. A 'listenerGain' value of 0.5 is equivalent
+-- to an attenuation of 6dB. The value zero equals silence (no output). Driver
+-- implementations are free to optimize this case and skip mixing and processing
+-- stages where applicable. The implementation is in charge of ensuring
+-- artifact-free (click-free) changes of gain values and is free to defer actual
+-- modification of the sound samples, within the limits of acceptable latencies.
+--
+-- A 'listenerGain' larger than 1 (amplification) is permitted. However, the
+-- implementation is free to clamp the total gain (effective gain per source
+-- times listener gain) to 1 to prevent overflow.
+
+listenerGain :: StateVar Gain
+listenerGain = makeListenerVar GetGain 1 (peek1 id) listenerf
--------------------------------------------------------------------------------
+-- | 'orientation' contains an \"at\" vector and an \"up\" vector, where the
+-- \"at\" vector represents the \"forward\" direction of the listener and the
+-- orthogonal projection of the \"up\" vector into the subspace perpendicular to
+-- the \"at\" vector represents the \"up\" direction for the listener. OpenAL
+-- expects two vectors that are linearly independent. These vectors are not
+-- expected to be normalized. If the two vectors are linearly dependent,
+-- behavior is undefined. The initial orientation is ('Vector3' 0 0 (-1),
+-- 'Vector3' 0 1 0), i.e. looking down the Z axis with the Y axis pointing
+-- upwards.
+
orientation :: StateVar (Vector3 ALfloat, Vector3 ALfloat)
-orientation =
- makeStateVar
- (do allocaArray 6 $ \buf -> do
- getListenerfv GetOrientation buf
- peek6 Vector3 buf)
- (\(at, up) -> withArray [at, up] $ listenerVector3 GetOrientation)
+orientation = makeListenerVar GetOrientation 6 (peek6 Vector3) listenerVector6
--------------------------------------------------------------------------------
@@ -74,31 +116,35 @@
foreign import CALLCONV unsafe "alListenerf"
alListenerf :: ALenum -> ALfloat -> IO ()
-listenerVertex3 :: GetPName -> Ptr (Vertex3 ALfloat) -> IO ()
-listenerVertex3 = alListenerfv . marshalGetPName
+--------------------------------------------------------------------------------
+
+listener3f :: Storable a => GetPName -> a -> IO ()
+listener3f n x = with x $ listenerfv n
-listenerVector3 :: GetPName -> Ptr (Vector3 ALfloat) -> IO ()
-listenerVector3 = alListenerfv . marshalGetPName
+listenerVector6 :: GetPName -> (Vector3 ALfloat, Vector3 ALfloat) -> IO ()
+listenerVector6 n (x, y) = withArray [x, y] $ listenerfv n
+
+listenerfv :: GetPName -> Ptr a -> IO ()
+listenerfv = alListenerfv . marshalGetPName
foreign import CALLCONV unsafe "alListenerfv"
alListenerfv :: ALenum -> Ptr a -> IO ()
+--------------------------------------------------------------------------------
+
getListenerfv :: GetPName -> Ptr ALfloat -> IO ()
getListenerfv = alGetListenerfv . marshalGetPName
foreign import CALLCONV unsafe "alGetListenerfv"
alGetListenerfv :: ALenum -> Ptr ALfloat -> IO ()
-{-
-listenerf:
-AL_GAIN_LINEAR_LOKI
-AL_GAIN
-
-listenerfv:
-AL_POSITION
-AL_VELOCITY
-AL_ORIENTATION (6: at + up)
-
-getlistenerfv:
-all above
--}
+--------------------------------------------------------------------------------
+
+makeListenerVar :: GetPName -> Int -> (Ptr ALfloat -> IO a)
+ -> (GetPName -> a -> IO ()) -> StateVar a
+makeListenerVar pname size reader writer =
+ makeStateVar
+ (allocaArray size $ \buf -> do
+ getListenerfv pname buf
+ reader buf)
+ (writer pname)
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/PeekPoke.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/PeekPoke.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/PeekPoke.hs 2004-01-03 04:03:09.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/PeekPoke.hs 2006-03-22 00:58:03.000000000 +0900
@@ -2,7 +2,7 @@
--------------------------------------------------------------------------------
-- |
-- Module : Sound.OpenAL.AL.PeekPoke
--- Copyright : (c) Sven Panne 2003-2004
+-- Copyright : (c) Sven Panne 2003-2005
-- License : BSD-style (see the file libraries/OpenGL/LICENSE)
--
-- Maintainer : sven.panne@aedion.de
@@ -14,8 +14,7 @@
--------------------------------------------------------------------------------
module Sound.OpenAL.AL.PeekPoke (
- poke1, poke3, poke6,
- peek1, peek3, peek6
+ poke1, peek1, peek3, peek6
) where
import Foreign.Ptr ( Ptr )
@@ -32,23 +31,6 @@
poke1 ptr x =
pokeElemOff ptr 0 x
-{-# INLINE poke3 #-}
-poke3 :: Storable a => Ptr a -> a -> a -> a -> IO ()
-poke3 ptr x y z = do
- pokeElemOff ptr 0 x
- pokeElemOff ptr 1 y
- pokeElemOff ptr 2 z
-
-{-# INLINE poke6 #-}
-poke6 :: Storable a => Ptr a -> (a, a, a) -> (a, a, a) -> IO ()
-poke6 ptr (x, y, z) (u, v, w) = do
- pokeElemOff ptr 0 x
- pokeElemOff ptr 1 y
- pokeElemOff ptr 2 z
- pokeElemOff ptr 3 u
- pokeElemOff ptr 4 v
- pokeElemOff ptr 5 w
-
--------------------------------------------------------------------------------
{-# INLINE peek1 #-}
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/QueryUtils.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/QueryUtils.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/QueryUtils.hs 2004-01-03 04:03:09.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/QueryUtils.hs 2006-03-22 00:58:03.000000000 +0900
@@ -2,7 +2,7 @@
--------------------------------------------------------------------------------
-- |
-- Module : Sound.OpenAL.AL.QueryUtils
--- Copyright : (c) Sven Panne 2003-2004
+-- Copyright : (c) Sven Panne 2003-2005
-- License : BSD-style (see the file libraries/OpenGL/LICENSE)
--
-- Maintainer : sven.panne@aedion.de
@@ -15,124 +15,108 @@
module Sound.OpenAL.AL.QueryUtils (
GetPName(..), marshalGetPName,
- getFloat1, getFloat3, getFloat6
+ StringName(..), getString
) where
-import Control.Monad ( liftM )
-import Foreign.Marshal.Array ( allocaArray )
import Foreign.Ptr ( Ptr )
-import Sound.OpenAL.AL.BasicTypes ( ALenum, ALfloat )
-import Sound.OpenAL.AL.PeekPoke ( peek3, peek6 )
+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 =
- GetSourceType
- | GetSourceRelative
- | GetConeInnerAngle
- | GetConeOuterAngle
- | GetPitch
+ GetDistanceModel
+ | GetDopplerFactor
+ | GetSpeedOfSound
+
| GetPosition
- | GetDirection
+
| GetVelocity
- | GetLooping
- | GetStreaming
- | GetBuffer
| GetGain
- | GetByte
- | GetMinGain
- | GetMaxGain
+
| GetOrientation
- | GetSourceState
+
+ | GetSourceRelative
+ | GetSourceType
+ | GetLooping
+ | GetBuffer
| GetBuffersQueued
| GetBuffersProcessed
- | GetPending
- | GetProcessed
+ | GetMinGain
+ | GetMaxGain
| GetReferenceDistance
| GetRolloffFactor
- | GetConeOuterGain
| GetMaxDistance
- | GetFrequency
- | GetBits
- | GetChannels
- | GetSize
- | GetVendor
- | GetVersion
- | GetRenderer
- | GetExtensions
- | GetDopplerFactor
- | GetDopplerVelocity
- | GetDistanceScale
- | GetDistanceModel
- | GetInverseDistance
- | GetInverseDistanceClamped
+ | GetPitch
+ | GetDirection
+ | GetConeInnerAngle
+ | GetConeOuterAngle
+ | GetConeOuterGain
+ | GetSecOffset
+ | GetSampleOffset
+ | GetByteOffset
+ | GetSourceState
marshalGetPName :: GetPName -> ALenum
marshalGetPName x = case x of
- GetSourceType -> 0x0200
- GetSourceRelative -> 0x0202
- GetConeInnerAngle -> 0x1001
- GetConeOuterAngle -> 0x1002
- GetPitch -> 0x1003
- GetPosition -> 0x1004
- GetDirection -> 0x1005
- GetVelocity -> 0x1006
- GetLooping -> 0x1007
- GetStreaming -> 0x1008
- GetBuffer -> 0x1009
- GetGain -> 0x100A
- GetByte -> 0x100C
- GetMinGain -> 0x100D
- GetMaxGain -> 0x100E
- GetOrientation -> 0x100F
- GetSourceState -> 0x1010
- GetBuffersQueued -> 0x1015
- GetBuffersProcessed -> 0x1016
- GetPending -> 0x1017
- GetProcessed -> 0x1018
- GetReferenceDistance -> 0x1020
- GetRolloffFactor -> 0x1021
- GetConeOuterGain -> 0x1022
- GetMaxDistance -> 0x1023
- GetFrequency -> 0x2001
- GetBits -> 0x2002
- GetChannels -> 0x2003
- GetSize -> 0x2004
- GetVendor -> 0xB001
- GetVersion -> 0xB002
- GetRenderer -> 0xB003
- GetExtensions -> 0xB004
- GetDopplerFactor -> 0xC000
- GetDopplerVelocity -> 0xC001
- GetDistanceScale -> 0xC002
- GetDistanceModel -> 0xD000
- GetInverseDistance -> 0xD001
- GetInverseDistanceClamped -> 0xD002
+ 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
--------------------------------------------------------------------------------
--- Note: OpenAL is not yet orthogonal enough to use getFloatv here, too.
-
-getFloat1 :: (ALfloat -> a) -> GetPName -> IO a
-getFloat1 f = liftM f . alGetFloat . marshalGetPName
-
-foreign import CALLCONV unsafe "alGetFloat"
- alGetFloat :: ALenum -> IO ALfloat
-
-getFloat3 :: (ALfloat -> ALfloat -> ALfloat -> a) -> GetPName -> IO a
-getFloat3 f n = allocaArray 3 $ \buf -> do
- getFloatv n buf
- peek3 f buf
-
-getFloat6 ::
- (ALfloat -> ALfloat -> ALfloat -> a)
- -> GetPName -> IO (a, a)
-getFloat6 f n = allocaArray 6 $ \buf -> do
- getFloatv n buf
- peek6 f buf
+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
-getFloatv :: GetPName -> Ptr ALfloat -> IO ()
-getFloatv = alGetFloatv . marshalGetPName
+getString :: StringName -> IO String
+getString n = alGetString (marshalStringName n) >>= peekALString
-foreign import CALLCONV unsafe "alGetFloatv"
- alGetFloatv :: ALenum -> Ptr ALfloat -> IO ()
+foreign import CALLCONV unsafe "alGetString"
+ alGetString :: ALenum -> IO (Ptr ALchar)
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/Source.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/Source.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/Source.hs 2004-03-30 16:07:15.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/Source.hs 2006-03-22 00:58:03.000000000 +0900
@@ -1,119 +1,775 @@
--------------------------------------------------------------------------------
-- |
-- Module : Sound.OpenAL.AL.Source
--- Copyright : (c) Sven Panne 2003-2004
+-- Copyright : (c) Sven Panne 2003-2005
-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
--
-- Maintainer : sven.panne@aedion.de
-- Stability : provisional
-- Portability : portable
--
+-- This module corresponds to sections 4.1 (Basic Listener and Source
+-- Attributes) and 4.3 (Source Objects) of the OpenAL Specification and
+-- Reference (version 1.1).
+--
+-- Sources specify attributes like position, velocity, and a buffer with sample
+-- data. By controlling a source\'s attributes the application can modify and
+-- parameterize the static sample data provided by the buffer referenced by the
+-- source. Sources define a localized sound, and encapsulate a set of attributes
+-- applied to a sound at its origin, i.e. in the very first stage of the
+-- processing on the way to the listener. Source related effects have to be
+-- applied before listener related effects unless the output is invariant to any
+-- collapse or reversal of order. OpenAL also provides additional functions to
+-- manipulate and query the execution state of sources: the current playing
+-- status of a source, including access to the current sampling position within
+-- the associated buffer.
+--
--------------------------------------------------------------------------------
module Sound.OpenAL.AL.Source (
- Source
+ -- * The Source Type
+ Source,
+
+ -- * Source Attributes
+
+ -- ** Basic Source Attributes
+ sourcePosition, sourceVelocity, sourceGain,
+
+ -- ** Source Positioning
+ SourceRelative(..), sourceRelative,
+
+ -- ** Source Type
+ SourceType(..), sourceType,
+
+ -- ** Buffer Looping
+ LoopingMode(..), loopingMode,
+
+ -- ** Current Buffer
+ buffer,
+
+ -- ** Queue State Queries
+ buffersQueued, buffersProcessed,
+
+ -- ** Bounds on Gain
+ gainBounds,
+
+ -- ** Distance Model Attributes
+ referenceDistance, rolloffFactor, maxDistance,
+
+ -- ** Frequency Shift by Pitch
+ pitch,
+
+ -- ** Direction and Cone
+ -- $DirectionAndCone
+ direction, coneAngles, coneOuterGain,
+
+ -- ** Offset
+ secOffset, sampleOffset, byteOffset,
+
+ -- * Queuing Buffers with a Source
+ -- $QueuingBuffersWithASource
+ queueBuffers, unqueueBuffers,
+
+ -- * Managing Source Execution
+ -- $ManagingSourceExecution
+ SourceState(..), sourceState, play, pause, stop, rewind
) where
-import Control.Monad ( liftM )
+import Control.Monad ( liftM2 )
import Foreign.Marshal.Array ( withArrayLen, peekArray, allocaArray )
-import Foreign.Ptr ( Ptr )
+import Foreign.Marshal.Utils ( with )
+import Foreign.Ptr ( Ptr, castPtr )
+import Foreign.Storable ( Storable(..) )
import Graphics.Rendering.OpenGL.GL.BufferObjects ( ObjectName(..) )
+import Graphics.Rendering.OpenGL.GL.CoordTrans ( Vector3(..) )
+import Graphics.Rendering.OpenGL.GL.VertexSpec ( Vertex3(..) )
+import Graphics.Rendering.OpenGL.GL.StateVar (
+ HasGetter(get), HasSetter(($=)), makeStateVar, StateVar, GettableStateVar,
+ makeGettableStateVar )
+import Sound.OpenAL.AL.ALboolean ( marshalALboolean, unmarshalALboolean )
import Sound.OpenAL.AL.BasicTypes
-import Sound.OpenAL.AL.ALboolean ( unmarshalALboolean )
+import Sound.OpenAL.AL.Buffer ( Buffer )
+import Sound.OpenAL.AL.BufferInternal ( marshalBuffer, unmarshalBuffer )
+import Sound.OpenAL.AL.Listener ( Gain )
+import Sound.OpenAL.AL.PeekPoke ( peek1, poke1, peek3 )
+import Sound.OpenAL.AL.SourceState ( SourceState(..), unmarshalSourceState )
+import Sound.OpenAL.AL.QueryUtils (
+ GetPName(GetPosition,GetVelocity,GetGain,GetSourceRelative,GetSourceType,
+ GetLooping,GetBuffer,GetBuffersQueued,GetBuffersProcessed,
+ GetMinGain,GetMaxGain,GetReferenceDistance,GetRolloffFactor,
+ GetMaxDistance,GetPitch,GetDirection,GetConeInnerAngle,
+ GetConeOuterAngle,GetConeOuterGain,GetSecOffset,GetSampleOffset,
+ GetByteOffset,GetSourceState),
+ marshalGetPName )
+import Sound.OpenAL.Constants ( al_UNDETERMINED, al_STATIC, al_STREAMING )
+
+#ifdef __HADDOCK__
+import Sound.OpenAL.AL.Listener ( listenerGain )
+import Sound.OpenAL.AL.Errors ( ALErrorCategory(..) )
+#endif
--------------------------------------------------------------------------------
-newtype Source = Source { sourceID :: ALuint }
+-- | The abstract buffer type.
+
+newtype Source = Source ALuint
deriving ( Eq, Ord, Show )
+instance Storable Source where
+ sizeOf ~(Source b) = sizeOf b
+ alignment ~(Source b) = alignment b
+ peek = peek1 Source . castPtr
+ poke ptr (Source b) = poke1 (castPtr ptr) b
+
instance ObjectName Source where
genObjectNames n =
allocaArray n $ \buf -> do
alGenSources (fromIntegral n) buf
- liftM (map Source) $ peekArray n buf
+ peekArray n buf
- deleteObjectNames sources =
- withArrayLen (map sourceID sources) $
- alDeleteSources . fromIntegral
+ deleteObjectNames = withArraySizei alDeleteSources
- isObjectName = liftM unmarshalALboolean . alIsSource . sourceID
+ isObjectName = fmap unmarshalALboolean . alIsSource
foreign import CALLCONV unsafe "alGenSources"
- alGenSources :: ALsizei -> Ptr ALuint -> IO ()
+ alGenSources :: ALsizei -> Ptr Source -> IO ()
foreign import CALLCONV unsafe "alDeleteSources"
- alDeleteSources :: ALsizei -> Ptr ALuint -> IO ()
+ alDeleteSources :: ALsizei -> Ptr Source -> IO ()
foreign import CALLCONV unsafe "alIsSource"
- alIsSource :: ALuint -> IO ALboolean
+ alIsSource :: Source -> IO ALboolean
+
+--------------------------------------------------------------------------------
+
+-- | 'sourcePosition' contains the current location of the source in the world
+-- coordinate system. Any 3-tuple of valid float values is allowed.
+-- Implementation behavior on encountering NaN and infinity is not defined. The
+-- initial position is ('Vertex3' 0 0 0).
+
+sourcePosition :: Source -> StateVar (Vertex3 ALfloat)
+sourcePosition = makeSourceStateVar dictVertex3ALfloat GetPosition
+
+-- | 'sourceVelocity' contains current velocity (speed and direction) of the
+-- source in the world coordinate system. Any 3-tuple of valid float values is
+-- allowed, and the initial velocity is ('Vector3' 0 0 0). 'sourceVelocity' does
+-- not affect 'sourcePosition'. OpenAL does not calculate the velocity from
+-- subsequent position updates, nor does it adjust the position over time based
+-- on the specified velocity. Any such calculation is left to the application.
+-- For the purposes of sound processing, position and velocity are independent
+-- parameters affecting different aspects of the sounds.
+--
+-- 'sourceVelocity' is taken into account by the driver to synthesize the
+-- Doppler effect perceived by the listener for each source, based on the
+-- velocity of both source and listener, and the Doppler related parameters.
+
+sourceVelocity :: Source -> StateVar (Vector3 ALfloat)
+sourceVelocity = makeSourceStateVar dictVector3ALfloat GetVelocity
+
+-- | 'sourceGain' contains a scalar amplitude multiplier for the given source.
+-- The initial value 1 means that the sound is unattenuated. A 'sourceGain'
+-- value of 0.5 is equivalent to an attenuation of 6dB. The value zero equals
+-- silence (no output). Driver implementations are free to optimize this case
+-- and skip mixing and processing stages where applicable. The implementation is
+-- in charge of ensuring artifact-free (click-free) changes of gain values and
+-- is free to defer actual modification of the sound samples, within the limits
+-- of acceptable latencies.
+--
+-- A 'sourceGain' larger than 1 (amplification) is permitted. However, the
+-- implementation is free to clamp the total gain (effective gain per source
+-- times listener gain) to 1 to prevent overflow.
+
+sourceGain :: Source -> StateVar Gain
+sourceGain = makeSourceStateVar dictALfloat GetGain
+
+--------------------------------------------------------------------------------
+
+-- | The entity to which the source attributes 'sourcePosition',
+-- 'sourceVelocity' and 'direction' are to be interpreted.
+
+data SourceRelative =
+ World
+ | Listener
+ deriving ( Eq, Ord, Show )
+
+marshalSourceRelative :: SourceRelative -> Bool
+marshalSourceRelative = (== Listener)
+
+unmarshalSourceRelative :: Bool -> SourceRelative
+unmarshalSourceRelative x = if x then Listener else World
+
+-- | If 'sourceRelative' contains 'Listener', it indicates indicates that the
+-- values specified by 'sourcePosition', 'sourceVelocity' and 'direction' are to
+-- be interpreted relative to the listener position. The initial value is
+-- 'World', indicating that those source attributes are to be interpreted
+-- relative to the world, i.e. they are considered absolute.
+sourceRelative :: Source -> StateVar SourceRelative
+sourceRelative = makeSourceStateVar dictSourceRelative GetSourceRelative
+
+--------------------------------------------------------------------------------
+
+-- | When first created, a source will be in the 'Undetermined' state. If a
+-- buffer is then attached using 'buffer', then the source will enter the
+-- 'Static' state. If the first buffer attached to a source is attached using
+-- 'queueBuffers', then the source will enter the 'Streaming' state. A source of
+-- either state will be reset to state 'Undetermined' by setting its 'buffer' to
+-- 'Nothing', and attaching any buffer to a streaming source will change the
+-- state to 'Static'. Attempting to queue a buffer on a static source will
+-- result in an 'ALInvalidOperation' error.
+
+data SourceType =
+ Undetermined
+ | Static
+ | Streaming
+ deriving ( Eq, Ord, Show )
+
+unmarshalSourceType :: ALint -> SourceType
+unmarshalSourceType x
+ | x == al_UNDETERMINED = Undetermined
+ | x == al_STATIC = Static
+ | x == al_STREAMING = Streaming
+ | otherwise = error ("unmarshalSourceType: illegal value " ++ show x)
+
+-- | 'sourceType' indicates whether a source is ready to queue buffers, ready to
+-- use a static buffer, or is in an undetermined state where it can be used for
+-- either streaming or static playback.
+
+sourceType :: Source -> GettableStateVar SourceType
+sourceType = makeSourceGettableStateVar dictSourceType GetSourceType
+
+--------------------------------------------------------------------------------
+
+-- | Specifies what should happen when the end of a buffer queue is reached.
+
+data LoopingMode =
+ OneShot
+ | Looping
+ deriving ( Eq, Ord, Show )
+
+marshalLoopingMode :: LoopingMode -> Bool
+marshalLoopingMode = (== Looping)
+
+unmarshalLoopingMode :: Bool -> LoopingMode
+unmarshalLoopingMode x = if x then Looping else OneShot
+
+-- | If 'loopingMode' contains 'Looping', it indicates that the source will not
+-- be in the 'Stopped' state once it reaches the end of last buffer in the
+-- buffer queue. Instead, the source will immediately promote to 'Initial' and
+-- 'Playing'. The initial value is 'OneShot'. 'loopingMode' can be changed on a
+-- source in any execution state. In particular, it can be changed on a
+-- 'Playing' source.
+
+loopingMode :: Source -> StateVar LoopingMode
+loopingMode = makeSourceStateVar dictLoopingMode GetLooping
+
+--------------------------------------------------------------------------------
+
+-- | 'buffer' contains the current buffer object. Setting 'buffer' to 'Just' a
+-- buffer object makes it the head entry in the source\'s queue. Setting
+-- 'buffer'for a source in the 'Stopped' or 'Initial' state empties the entire
+-- queue, then appends the one buffer specified (or none at all if 'Nothing'
+-- was specified).
+--
+-- For a source in the 'Playing' or 'Paused' state, setting 'buffer' will result
+-- in the 'ALInvalidOperation' error state being set. 'buffer' can be applied only
+-- to sources in the 'Initial' and 'Stopped' states. Specifying an invalid
+-- buffer name (either because the buffer name doesn\'t exist or because that
+-- buffer can\'t be attached to the specified source) will result in an
+-- 'ALInvalidValue' error while specifying an invalid source name results in an
+-- 'ALInvalidName' error. Setting 'buffer' to 'Nothing' is a legal way to release
+-- the current buffer queue on a source in the 'Initial' or 'Stopped' state,
+-- whether the source has just one entry (current buffer) or more. Setting
+-- 'buffer' to 'Nothing' still causes an 'ALInvalidOperation' for any source in
+-- the 'Playing' or 'Paused' state, consequently it cannot be used to mute or
+-- stop a source. The initial value is 'Nothing'.
+
+buffer :: Source -> StateVar (Maybe Buffer)
+buffer = makeSourceStateVar dictMaybeBuffer GetBuffer
+
+--------------------------------------------------------------------------------
+
+-- | 'buffersQueued' contains the number of buffers in the queue of a given
+-- source. This includes those not yet played, the one currently playing, and
+-- the ones that have been played already. It will contain 0 if 'buffer' has
+-- been set to 'Nothing'.
+
+buffersQueued :: Source -> GettableStateVar ALint
+buffersQueued = makeSourceGettableStateVar dictALint GetBuffersQueued
+
+-- | 'buffersProcessed' contains the number of buffers that have been played
+-- by a given source. Indirectly, this gives the index of the buffer currently
+-- playing. It can be used to determine how much slots are needed for unqueuing
+-- them. On a source in the 'Stopped' state, all buffers are processed. On a
+-- source in the 'Initial' state, no buffers are processed, all buffers are
+-- pending. It will contain 0 if 'buffer' has been set to 'Nothing'.
+
+buffersProcessed :: Source -> GettableStateVar ALint
+buffersProcessed = makeSourceGettableStateVar dictALint GetBuffersProcessed
+
+--------------------------------------------------------------------------------
+
+-- | 'gainBounds' contains two scalar amplitude thresholds between 0 and 1
+-- (included): The minimum guaranteed gain for this source and the maximum gain
+-- permitted, with initial values 0 and 1, respectively At the end of the
+-- processing of various attenuation factors such as distance based attenuation
+-- and 'sourceGain', the effective gain calculated is compared to these values:
+--
+-- If the effective gain is lower than the minimum gain, the minimum gain is
+-- applied. This happens before the 'listenerGain' is applied. If a zero minimum
+-- gain is set, then the effective gain will not be corrected.
+--
+-- If the effective gain is higher than the maximum gain, the maximum gain is
+-- applied. This happens before the 'listenerGain' is applied. If the
+-- 'listenerGain' times the maximum gain still exceeds the maximum gain the
+-- implementation can handle, the implementation is free to clamp. If a zero
+-- maximum gain is set, then the source is effectively muted. The implementation
+-- is free to optimize for this situation, but no optimization is required or
+-- recommended as setting 'sourceGain' to zero is the proper way to mute a
+-- source.
+
+gainBounds :: Source -> StateVar (Gain, Gain)
+gainBounds source =
+ pairStateVars
+ (makeSourceStateVar dictALfloat GetMinGain source)
+ (makeSourceStateVar dictALfloat GetMaxGain source)
+
+--------------------------------------------------------------------------------
+-- | 'referenceDistance' is used for distance attenuation calculations based on
+-- inverse distance with rolloff. Depending on the distance model it will also
+-- act as a distance threshold below which gain is clamped. See
+-- "Sound.OpenAL.AL.Attenuation" for details. The initial value is 1.
+
+referenceDistance :: Source -> StateVar ALfloat
+referenceDistance = makeSourceStateVar dictALfloat GetReferenceDistance
+
+-- | 'rolloffFactor' is used for distance attenuation calculations based on
+-- inverse distance with rolloff. For distances smaller than 'maxDistance' (and,
+-- depending on the distance model, larger than 'referenceDistance'), this will
+-- scale the distance attenuation over the applicable range. See
+-- "Sound.OpenAL.AL.Attenuation" for details how the attenuation is computed as
+-- a function of the distance. The initial value is 1.
+--
+-- In particular, 'rolloffFactor' can be set to zero for those sources that are
+-- supposed to be exempt from distance attenuation. The implementation is
+-- encouraged to optimize this case, bypassing distance attenuation calculation
+-- entirely on a persource basis.
+
+rolloffFactor :: Source -> StateVar ALfloat
+rolloffFactor = makeSourceStateVar dictALfloat GetRolloffFactor
+
+-- | 'maxDistance' is used for distance attenuation calculations based on
+-- inverse distance with rolloff, if the inverse clamped distance model is
+-- used. In this case, distances greater than 'maxDistance' will be clamped to
+-- 'maxDistance'. 'maxDistance' based clamping is applied before minimum gain
+-- clamping (see 'gainBounds'), so if the effective gain at 'maxDistance' is
+-- larger than the minimum gain, the minimum gain will have no effect. No
+-- culling is supported. The initial value is the largest representable
+-- 'ALfloat'.
+
+maxDistance :: Source -> StateVar ALfloat
+maxDistance = makeSourceStateVar dictALfloat GetMaxDistance
+
+--------------------------------------------------------------------------------
+
+-- | 'pitch' contains the desired pitch shift, where 1 (the initial value)
+-- equals identity. Each reduction by 50 percent equals a pitch shift of -12
+-- semitones (one octave reduction). Each doubling equals a pitch shift of 12
+-- semitones (one octave increase). Zero is not a legal value. Implementations
+-- may clamp the actual output pitch range to any values subject to the
+-- implementation's own limits.
+
+pitch :: Source -> StateVar ALfloat
+pitch = makeSourceStateVar dictALfloat GetPitch
+
+--------------------------------------------------------------------------------
+-- $DirectionAndCone
+-- Each source can be directional, depending on the settings for 'coneAngles'.
+-- There are three zones defined: the inner cone, the outside zone, and the
+-- transitional zone in between. The angle-dependent gain for a directional
+-- source is constant inside the inner cone, and changes over the transitional
+-- zone to the value specified outside the outer cone. 'sourceGain' is applied
+-- for the inner cone, with an application selectable 'coneOuterGain' factor to
+-- define the gain in the outer zone. In the transitional zone
+-- implementation-dependent interpolation between 'sourceGain' and 'sourceGain'
+-- times 'coneOuterGain' is applied.
+
+--------------------------------------------------------------------------------
+
+-- | If 'direction' does not contain the zero vector ('Vector3' 0 0 0), the
+-- source is directional. The sound emission is presumed to be symmetric around
+-- the direction vector (cylinder symmetry). Sources are not oriented in full 3
+-- degrees of freedom, only two angles are effectively needed.
+--
+-- The zero vector is the initial value, indicating that a source is not
+-- directional. Specifying a non-zero vector will make the source directional.
+-- Specifying a zero vector for a directional source will effectively mark it as
+-- nondirectional.
+
+direction :: Source -> StateVar (Vector3 ALfloat)
+direction = makeSourceStateVar dictVector3ALfloat GetDirection
+
+-- | 'coneAngles' contains the inner and outer angles of the sound cone, in
+-- degrees. The default of 360 for the inner cone angle means that it covers the
+-- entire world, which is equivalent to an omni-directional source. The default
+-- of 360 for the outer cone angle means that it covers the entire world. If the
+-- inner angle is also 360, then the zone for angle-dependent attenuation is
+-- zero.
+
+coneAngles :: Source -> StateVar (ALfloat, ALfloat)
+coneAngles source =
+ pairStateVars
+ (makeSourceStateVar dictALfloat GetConeInnerAngle source)
+ (makeSourceStateVar dictALfloat GetConeOuterAngle source)
+
+-- | 'coneOuterGain' contains the factor with which 'sourceGain' is multiplied
+-- to determine the effective gain outside the cone defined by the outer angle.
+-- The effective gain applied outside the outer cone is 'sourceGain' times
+-- 'coneOuterGain'. Changing 'sourceGain' affects all directions, i.e. the
+-- source is attenuated in all directions, for any position of the listener. The
+-- application has to change 'coneOuterGain' as well if a different behavior is
+-- desired.
+
+coneOuterGain :: Source -> StateVar Gain
+coneOuterGain = makeSourceStateVar dictALfloat GetConeOuterGain
+
+--------------------------------------------------------------------------------
+
+-- | 'secOffset' contains the playback position, expressed in seconds (the value
+-- will loop back to zero for looping sources).
+--
+-- When setting 'secOffset' on a source which is already playing, the playback
+-- will jump to the new offset unless the new offset is out of range, in which
+-- case an 'ALInvalidValue' error is set. If the source is not playing, then the
+-- offset will be applied on the next 'play' call.
+--
+-- The position is relative to the beginning of all the queued buffers for the
+-- source, and any queued buffers traversed by a set call will be marked as
+-- processed.
+--
+-- This value is based on byte position, so a pitch-shifted source will have an
+-- exaggerated playback speed. For example, you can be 0.5 seconds into a buffer
+-- having taken only 0.25 seconds to get there if the pitch is set to 2.
+
+secOffset :: Source -> StateVar ALfloat
+secOffset = makeSourceStateVar dictALfloat GetSecOffset
+
+-- | 'sampleOffset' contains the playback position, expressed in samples (the
+-- value will loop back to zero for looping sources). For a compressed format,
+-- this value will represent an exact offset within the uncompressed data.
+--
+-- When setting 'sampleOffset' on a source which is already playing, the
+-- playback will jump to the new offset unless the new offset is out of range,
+-- in which case an 'ALInvalidValue' error is set. If the source is not playing,
+-- then the offset will be applied on the next 'play' call. A 'stop', 'rewind',
+-- or a second 'play' call will reset the offset to the beginning of the buffer.
+--
+-- The position is relative to the beginning of all the queued buffers for the
+-- source, and any queued buffers traversed by a set call will be marked as
+-- processed.
+
+sampleOffset :: Source -> StateVar ALint
+sampleOffset = makeSourceStateVar dictALint GetSampleOffset
+
+-- | 'byteOffset' contains the playback position, expressed in bytes (the value
+-- will loop back to zero for looping sources). For a compressed format, this
+-- value may represent an approximate offset within the compressed data buffer.
+--
+-- When setting 'byteOffset' on a source which is already playing, the playback
+-- will jump to the new offset unless the new offset is out of range, in which
+-- case an 'ALInvalidValue' error is set. If the source is not playing, then the
+-- offset will be applied on the next 'play' call. A 'stop', 'rewind', or a
+-- second 'play' call will reset the offset to the beginning of the buffer.
+--
+-- The position is relative to the beginning of all the queued buffers for the
+-- source, and any queued buffers traversed by a set call will be marked as
+-- processed.
+
+byteOffset :: Source -> StateVar ALint
+byteOffset = makeSourceStateVar dictALint GetByteOffset
+
+--------------------------------------------------------------------------------
+
+pairStateVars :: StateVar a -> StateVar b -> StateVar (a,b)
+pairStateVars var1 var2 =
+ makeStateVar
+ (liftM2 (,) (get var1) (get var2))
+ (\(val1,val2) -> do var1 $= val1; var2 $= val2)
+
+data Dictionary a b c = Dictionary {
+ alGetter :: Source -> ALenum -> Ptr b -> IO (),
+ alSetter :: Source -> ALenum -> Ptr b -> IO (),
+ size :: Int,
+ peekSize :: Ptr b -> IO a,
+ marshal :: a -> c }
+
+dictALint :: Dictionary ALint ALint ALint
+dictALint = Dictionary {
+ alGetter = alGetSourceiv,
+ alSetter = alSourceiv,
+ size = 1,
+ peekSize = peek1 id,
+ marshal = id }
+
+dictALfloat :: Dictionary ALfloat ALfloat ALfloat
+dictALfloat = Dictionary {
+ alGetter = alGetSourcefv,
+ alSetter = alSourcefv,
+ size = 1,
+ peekSize = peek1 id,
+ marshal = id }
+
+dictSourceRelative :: Dictionary SourceRelative ALint ALint
+dictSourceRelative = Dictionary {
+ alGetter = alGetSourceiv,
+ alSetter = alSourceiv,
+ size = 1,
+ peekSize = peek1 (unmarshalSourceRelative . unmarshalALboolean . fromIntegral),
+ marshal = fromIntegral . marshalALboolean . marshalSourceRelative }
+
+dictSourceType :: Dictionary SourceType ALint ALint
+dictSourceType = Dictionary {
+ alGetter = alGetSourceiv,
+ alSetter = undefined,
+ size = 1,
+ peekSize = peek1 unmarshalSourceType,
+ marshal = undefined }
+
+dictLoopingMode :: Dictionary LoopingMode ALint ALint
+dictLoopingMode = Dictionary {
+ alGetter = alGetSourceiv,
+ alSetter = alSourceiv,
+ size = 1,
+ peekSize = peek1 (unmarshalLoopingMode . unmarshalALboolean . fromIntegral),
+ marshal = fromIntegral . marshalALboolean . marshalLoopingMode }
+
+dictSourceState :: Dictionary SourceState ALint ALint
+dictSourceState = Dictionary {
+ alGetter = alGetSourceiv,
+ alSetter = undefined,
+ size = 1,
+ peekSize = peek1 unmarshalSourceState,
+ marshal = undefined }
+
+dictVertex3ALfloat :: Dictionary (Vertex3 ALfloat) ALfloat (Vertex3 ALfloat)
+dictVertex3ALfloat = Dictionary {
+ alGetter = alGetSourcefv,
+ alSetter = alSourcefv,
+ size = 3,
+ peekSize = peek3 Vertex3,
+ marshal = id }
+
+dictVector3ALfloat :: Dictionary (Vector3 ALfloat) ALfloat (Vector3 ALfloat)
+dictVector3ALfloat = Dictionary {
+ alGetter = alGetSourcefv,
+ alSetter = alSourcefv,
+ size = 3,
+ peekSize = peek3 Vector3,
+ marshal = id }
+
+dictMaybeBuffer :: Dictionary (Maybe Buffer) ALint ALint
+dictMaybeBuffer = Dictionary {
+ alGetter = alGetSourceiv,
+ alSetter = alSourceiv,
+ size = 1,
+ peekSize = peek1 (unmarshalBuffer . fromIntegral),
+ marshal = fromIntegral . marshalBuffer }
+
+makeGetter :: Storable b => Dictionary a b c -> GetPName -> Source -> IO a
+makeGetter dict name source =
+ allocaArray (size dict) $ \buf -> do
+ alGetter dict source (marshalGetPName name) buf
+ peekSize dict buf
+
+makeSetter :: Storable c => Dictionary a b c -> GetPName -> Source -> a -> IO ()
+makeSetter dict name source value =
+ with (marshal dict value) $
+ alSetter dict source (marshalGetPName name) . castPtr
+
+makeSourceStateVar ::
+ (Storable b, Storable c) =>
+ Dictionary a b c -> GetPName -> Source -> StateVar a
+makeSourceStateVar dict name source =
+ makeStateVar
+ (makeGetter dict name source)
+ (makeSetter dict name source)
+
+makeSourceGettableStateVar ::
+ (Storable b, Storable c) =>
+ Dictionary a b c -> GetPName -> Source -> GettableStateVar a
+makeSourceGettableStateVar dict name source =
+ makeGettableStateVar
+ (makeGetter dict name source)
+
+--------------------------------------------------------------------------------
+
+foreign import CALLCONV unsafe "alGetSourcefv"
+ alGetSourcefv :: Source -> ALenum -> Ptr ALfloat -> IO ()
+
+foreign import CALLCONV unsafe "alSourcefv"
+ alSourcefv :: Source -> ALenum -> Ptr ALfloat -> IO ()
+
+foreign import CALLCONV unsafe "alGetSourceiv"
+ alGetSourceiv :: Source -> ALenum -> Ptr ALint -> IO ()
+
+-- Note: Older OpenAL implementations have no alSourceiv, so we emulate it here.
+alSourceiv :: Source -> ALenum -> Ptr ALint -> IO ()
+alSourceiv source n buf = peek buf >>= alSourcei source n
+
+foreign import CALLCONV unsafe "alSourcei"
+ alSourcei :: Source -> ALenum -> ALint -> IO ()
+
+--------------------------------------------------------------------------------
+-- $QueuingBuffersWithASource
+-- OpenAL does not specify a built-in streaming mechanism. There is no mechanism
+-- to stream data into a buffer object. Instead, the API has a more flexible and
+-- versatile mechanism to queue buffers for sources. There are many ways to use
+-- this feature, with streaming being only one of them.
+--
+-- Streaming is replaced by queuing static buffers. This effectively moves any
+-- multi-buffer caching into the application and allows the application to
+-- select how many buffers it wants to use, the size of the buffers, and whether
+-- these are re-used in cycle, pooled, or thrown away.
+--
+-- Looping (over a finite number of repetitions) can be implemented by
+-- explicitly repeating buffers in the queue. Infinite loops can (theoretically)
+-- be accomplished by sufficiently large repetition counters. If only a single
+-- buffer is supposed to be repeated infinitely, using the respective source
+-- attribute 'loopingMode' is recommended.
+--
+-- Loop Points for restricted looping inside a buffer can in many cases be
+-- replaced by splitting the sample into several buffers and queuing the sample
+-- fragments (including repetitions) accordingly.
+--
+-- Buffers can be queued, unqueued after they have been used, and either be
+-- deleted, or refilled and queued again. Splitting large samples over several
+-- buffers maintained in a queue has distinct advantages over approaches that
+-- require explicit management of samples and sample indices.
+
+--------------------------------------------------------------------------------
+
+-- | The application can queue up one or multiple buffer names using
+-- 'queueBuffers'. The buffers will be queued in the sequence in which they
+-- appear in the list.
+--
+-- This command is legal on a source in any playback state (to allow for
+-- streaming, queuing has to be possible on a 'Playing' source).
+--
+-- All buffers in a queue must have the same format and attributes. An attempt
+-- to mix formats or other buffer attributes will result in a failure and an
+-- 'ALInvalidValue' error will be thrown. If the queue operation fails, the source
+-- queue will remain unchanged (even if some of the buffers could have been
+-- queued).
+
+queueBuffers :: Source -> [Buffer] -> IO ()
+queueBuffers = withArraySizei . alSourceQueueBuffers
+
+withArraySizei :: Storable a => (ALsizei -> Ptr a -> IO ()) -> [a] -> IO ()
+withArraySizei f xs = withArrayLen xs $ f . fromIntegral
+
+foreign import CALLCONV unsafe "alSourceQueueBuffers"
+ alSourceQueueBuffers :: Source -> ALsizei -> Ptr Buffer -> IO ()
+
+--------------------------------------------------------------------------------
+
+-- | Once a queue entry for a buffer has been appended to a queue and is pending
+-- processing, it should not be changed. Removal of a given queue entry is not
+-- possible unless either the source is stopped (in which case then entire queue
+-- is considered processed), or if the queue entry has already been processed
+-- ('Playing' or 'Paused' source). A playing source will enter the 'Stopped'
+-- state if it completes playback of the last buffer in its queue (the same
+-- behavior as when a single buffer has been attached to a source and has
+-- finished playback).
+--
+-- The 'unqueueBuffers' command removes a number of buffers entries that have
+-- finished processing, in the order of appearance, from the queue. The
+-- operation will fail with an 'ALInvalidValue' error if more buffers are
+-- requested than available, leaving the destination arguments unchanged.
+
+unqueueBuffers :: Source -> [Buffer] -> IO ()
+unqueueBuffers = withArraySizei . alSourceUnqueueBuffers
+
+foreign import CALLCONV unsafe "alSourceUnqueueBuffers"
+ alSourceUnqueueBuffers :: Source -> ALsizei -> Ptr Buffer -> IO ()
+
+--------------------------------------------------------------------------------
+-- $ManagingSourceExecution
+-- The execution state of a source can be queried. OpenAL provides a set of
+-- functions that initiate state transitions causing sources to start and stop
+-- execution.
+
+--------------------------------------------------------------------------------
+
+-- | Contains the current execution state of the given source. The initial state
+-- of any source is 'Initial'.
+--
+-- Note that the 'Initial' state is not necessarily identical to the initial
+-- state in which a source is created, because the other source attributes are
+-- not automatically reset to their initial values. 'Initial' merely indicates
+-- that the source can be executed using the 'play' command. A 'Stopped' or
+-- 'Initial' source can be reset into the default configuration by using a
+-- sequence of source commands as necessary. As the application has to specify
+-- all relevant state anyway to create a useful source configuration, no reset
+-- command is provided.
+
+sourceState :: Source -> GettableStateVar SourceState
+sourceState source =
+ makeGettableStateVar
+ (makeGetter dictSourceState GetSourceState source)
+
+--------------------------------------------------------------------------------
-{-
-sourcei/sourcef/sourcefv:
-AL_BUFFER
-AL_CONE_INNER_ANGLE
-AL_CONE_OUTER_ANGLE
-AL_CONE_OUTER_GAIN
-AL_DIRECTION
-AL_GAIN
-AL_GAIN_LINEAR_LOKI
-AL_LOOPING
-AL_MAX_DISTANCE
-AL_MAX_GAIN
-AL_MIN_GAIN
-AL_PITCH
-AL_POSITION
-AL_REFERENCE_DISTANCE
-AL_ROLLOFF_FACTOR
-AL_SOURCE_RELATIVE
-AL_STREAMING
-AL_VELOCITY
-
-getsourceiv
-AL_BUFFERS_PROCESSED
-AL_BUFFERS_QUEUED
-AL_BYTE_LOKI
-AL_CONE_INNER_ANGLE
-AL_CONE_OUTER_ANGLE
-AL_CONE_OUTER_GAIN
-AL_DIRECTION
-AL_GAIN
-AL_GAIN_LINEAR_LOKI
-AL_LOOPING
-AL_MAX_DISTANCE
-AL_PITCH
-AL_POSITION
-AL_REFERENCE_DISTANCE
-AL_ROLLOFF_FACTOR
-AL_SOURCE_RELATIVE
-AL_SOURCE_STATE
-AL_STREAMING
-AL_VELOCITY
-
-getsourcefv
-*AL_BUFFER
-AL_BUFFERS_PROCESSED
-AL_BUFFERS_QUEUED
-AL_BYTE_LOKI
-AL_CONE_INNER_ANGLE
-AL_CONE_OUTER_ANGLE
-AL_CONE_OUTER_GAIN
-AL_DIRECTION
-AL_GAIN
-AL_GAIN_LINEAR_LOKI
-AL_LOOPING
-AL_MAX_DISTANCE
-*AL_MAX_GAIN
-*AL_MIN_GAIN
-AL_PITCH
-AL_POSITION
-AL_REFERENCE_DISTANCE
-AL_ROLLOFF_FACTOR
-AL_SOURCE_RELATIVE
-AL_SOURCE_STATE
-AL_STREAMING
-AL_VELOCITY
+-- | 'play' applied to an 'Initial' source will promote the source to 'Playing',
+-- thus the data found in the buffer will be fed into the processing, starting
+-- at the beginning. 'play' applied to a 'Playing' source will restart the
+-- source from the beginning. It will not affect the configuration, and will
+-- leave the source in 'Playing' state, but reset the sampling offset to the
+-- beginning. 'play' applied to a 'Paused' source will resume processing using
+-- the source state as preserved at the 'pause' operation. 'play' applied to a
+-- 'Stopped' source will propagate it to 'Initial' then to 'Playing'
+-- immediately.
+
+play :: [Source] -> IO ()
+play = withArraySizei alSourcePlayv
+
+foreign import CALLCONV unsafe "alSourcePlayv"
+ alSourcePlayv :: ALsizei -> Ptr Source -> IO ()
+
+-- | 'pause' applied to an 'Initial' source is a legal NOP. 'pause' applied to a
+-- 'Playing' source will change its state to 'Paused'. The source is exempt from
+-- processing, its current state is preserved. 'pause' applied to a 'Paused'
+-- source is a legal NOP. 'pause' applied to a 'Stopped' source is a legal NOP.
+
+pause :: [Source] -> IO ()
+pause = withArraySizei alSourcePausev
+
+foreign import CALLCONV unsafe "alSourcePausev"
+ alSourcePausev :: ALsizei -> Ptr Source -> IO ()
+
+-- | 'stop' applied to an 'Initial' source is a legal NOP. 'stop' applied to a
+-- 'Playing' source will change its state to 'Stopped'. The source is exempt
+-- from processing, its current state is preserved. 'stop' applied to a 'Paused'
+-- source will change its state to 'Stopped', with the same consequences as on a
+-- 'Playing' source. 'stop' applied to a 'Stopped' source is a legal NOP.
+
+stop :: [Source] -> IO ()
+stop = withArraySizei alSourceStopv
+
+foreign import CALLCONV unsafe "alSourceStopv"
+ alSourceStopv :: ALsizei -> Ptr Source -> IO ()
+
+-- | 'rewind' applied to an 'Initial' source is a legal NOP. 'rewind' applied to
+-- a 'Playing' source will change its state to 'Stopped' then 'Initial'. The
+-- source is exempt from processing: its current state is preserved, with the
+-- exception of the sampling offset, which is reset to the beginning. 'rewind'
+-- applied to a 'Paused' source will change its state to 'Initial', with the
+-- same consequences as on a 'Playing' source. 'rewind' applied to an 'Stopped'
+-- source promotes the source to 'Initial', resetting the sampling offset to the
+-- beginning.
+rewind :: [Source] -> IO ()
+rewind = withArraySizei alSourceRewindv
--}
+foreign import CALLCONV unsafe "alSourceRewindv"
+ alSourceRewindv :: ALsizei -> Ptr Source -> IO ()
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/SourceState.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/SourceState.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/SourceState.hs 1970-01-01 09:00:00.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/SourceState.hs 2006-03-22 00:58:03.000000000 +0900
@@ -0,0 +1,46 @@
+-- #hide
+--------------------------------------------------------------------------------
+-- |
+-- Module : Sound.OpenAL.AL.SourceState
+-- Copyright : (c) Sven Panne 2003-2005
+-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
+--
+-- Maintainer : sven.panne@aedion.de
+-- Stability : provisional
+-- Portability : portable
+--
+--------------------------------------------------------------------------------
+
+module Sound.OpenAL.AL.SourceState (
+ SourceState(..), unmarshalSourceState
+) where
+
+import Sound.OpenAL.AL.BasicTypes ( ALint )
+import Sound.OpenAL.Constants ( al_INITIAL, al_PLAYING, al_PAUSED, al_STOPPED )
+
+--------------------------------------------------------------------------------
+
+-- | Each source can be in one of four possible execution states: 'Initial',
+-- 'Playing', 'Paused', 'Stopped'. Sources that are either 'Playing' or 'Paused'
+-- are considered active. Sources that are 'Stopped' or 'Initial' are considered
+-- inactive. Only 'Playing' sources are included in the processing. The
+-- implementation is free to skip those processing stages for sources that have
+-- no effect on the output (e.g. mixing for a source muted by zero gain, but not
+-- sample offset increments). Depending on the current state of a source certain
+-- (e.g. repeated) state transition commands are legal NOPs: they will be
+-- ignored, no error is generated.
+
+data SourceState =
+ Initial
+ | Playing
+ | Paused
+ | Stopped
+ deriving ( Eq, Ord, Show )
+
+unmarshalSourceState :: ALint -> SourceState
+unmarshalSourceState x
+ | x == al_INITIAL = Initial
+ | x == al_PLAYING = Playing
+ | x == al_PAUSED = Paused
+ | x == al_STOPPED = Stopped
+ | otherwise = error ("unmarshalSourceState: illegal value " ++ show x)
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/String.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/String.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/String.hs 1970-01-01 09:00:00.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/String.hs 2006-03-22 00:58:03.000000000 +0900
@@ -0,0 +1,31 @@
+-- #hide
+--------------------------------------------------------------------------------
+-- |
+-- Module : Sound.OpenAL.AL.String
+-- Copyright : (c) Sven Panne 2005
+-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
+--
+-- Maintainer : sven.panne@aedion.de
+-- Stability : provisional
+-- Portability : portable
+--
+--------------------------------------------------------------------------------
+
+module Sound.OpenAL.AL.String (
+ withALString, peekALString
+) where
+
+import Foreign.C.String ( withCString, peekCString )
+import Foreign.Ptr ( Ptr, castPtr )
+import Sound.OpenAL.AL.BasicTypes ( ALchar )
+
+--------------------------------------------------------------------------------
+
+-- AL uses "Ptr ALchar" instead of "CString" for strings, so some wrappers
+-- are quite handy.
+
+withALString :: String -> (Ptr ALchar -> IO a) -> IO a
+withALString str action = withCString str (action . castPtr)
+
+peekALString :: Ptr ALchar -> IO String
+peekALString = peekCString . castPtr
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/StringQueries.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/StringQueries.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL/StringQueries.hs 1970-01-01 09:00:00.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL/StringQueries.hs 2006-03-22 00:58:03.000000000 +0900
@@ -0,0 +1,34 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module : Sound.OpenAL.AL.StringQueries
+-- Copyright : (c) Sven Panne 2003-2005
+-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
+--
+-- Maintainer : sven.panne@aedion.de
+-- Stability : provisional
+-- Portability : portable
+--
+-- This module corresponds to section 3.1.2 (String Queries) of the OpenAL
+-- Specification and Reference (version 1.1).
+--
+--------------------------------------------------------------------------------
+
+module Sound.OpenAL.AL.StringQueries (
+ alVendor, alRenderer
+) where
+
+import Graphics.Rendering.OpenGL.GL.StateVar (
+ GettableStateVar, makeGettableStateVar )
+import Sound.OpenAL.AL.QueryUtils ( StringName(..), getString )
+
+--------------------------------------------------------------------------------
+
+-- | Contains the name of the vendor.
+
+alVendor :: GettableStateVar String
+alVendor = makeGettableStateVar (getString Vendor)
+
+-- | Contains information about the specific renderer.
+
+alRenderer :: GettableStateVar String
+alRenderer = makeGettableStateVar (getString Renderer)
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/AL.hs 2004-01-03 04:03:07.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/AL.hs 2006-03-22 00:58:03.000000000 +0900
@@ -1,23 +1,128 @@
--------------------------------------------------------------------------------
-- |
-- Module : Sound.OpenAL.AL
--- Copyright : (c) Sven Panne 2003-2004
+-- Copyright : (c) Sven Panne 2003-2005
-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
--
-- Maintainer : sven.panne@aedion.de
-- Stability : provisional
-- Portability : portable
--
+-- This module corresponds to chapters 2 (OpenAL Operation), 3 (State and State
+-- Requests), 4 (Listener and Sources) and 5 (Buffers) of the OpenAL
+-- Specification and Reference (version 1.1).
+--
--------------------------------------------------------------------------------
module Sound.OpenAL.AL (
+ -- * OpenAL Fundamentals
+ -- $OpenALFundamentals
+
+ -- * Basic AL Operation
+ -- $BasicALOperation
+
+ -- * Time and Frequency
+ -- $TimeAndFrequency
+
+ -- * Space and Distance
+ -- $SpaceAndDistance
+
+ -- * Coordinate System
+ -- $CoordinateSystem
+
module Sound.OpenAL.AL.BasicTypes,
- module Sound.OpenAL.AL.Buffer,
+ module Sound.OpenAL.AL.Errors,
+ module Sound.OpenAL.AL.StringQueries,
+ module Sound.OpenAL.AL.Attenuation,
+ module Sound.OpenAL.AL.Doppler,
+ module Sound.OpenAL.AL.Listener,
module Sound.OpenAL.AL.Source,
- module Sound.OpenAL.AL.Listener
+ module Sound.OpenAL.AL.Buffer,
+ module Sound.OpenAL.AL.Extensions
) where
import Sound.OpenAL.AL.BasicTypes
-import Sound.OpenAL.AL.Buffer
-import Sound.OpenAL.AL.Source
+import Sound.OpenAL.AL.Errors
+import Sound.OpenAL.AL.StringQueries
+import Sound.OpenAL.AL.Attenuation
+import Sound.OpenAL.AL.Doppler
import Sound.OpenAL.AL.Listener
+import Sound.OpenAL.AL.Source
+import Sound.OpenAL.AL.Buffer
+import Sound.OpenAL.AL.Extensions
+
+--------------------------------------------------------------------------------
+-- $OpenALFundamentals
+-- OpenAL is concerned with rendering audio into an output buffer and collecting
+-- audio data from an input buffer. OpenAL\'s primary use is assumed to be for
+-- spatialized audio. There is no support for MIDI.
+--
+-- OpenAL has three fundamental primitives or objects: 'Buffer's, 'Source's, and
+-- a single listener (see "Sound.OpenAL.AL.Listener"). Each object can be
+-- changed independently; the setting of one object does not affect the setting
+-- of others. The application can also set modes that affect processing. Modes
+-- are set, objects specified, and other OpenAL operations performed by sending
+-- commands in the form of function or procedure calls.
+--
+-- Sources store locations, directions, and other attributes of an object in 3D
+-- space and have a buffer associated with them for playback. When the program
+-- wants to play a sound, it controls execution through a source object. Sources
+-- are processed independently from each other.
+--
+-- Buffers store compressed or uncompressed audio data. It is common to
+-- initialize a large set of buffers when the program first starts (or at
+-- non-critical times during execution, between levels in a game, for
+-- instance). Buffers are referred to by sources. Data (audio sample data) is
+-- associated with buffers.
+--
+-- There is only one listener (per audio context). The listener attributes are
+-- similar to source attributes, but are used to represent where the user is
+-- hearing the audio from. The influence of all the sources from the perspective
+-- of the listener is mixed and played for the user.
+
+--------------------------------------------------------------------------------
+-- $BasicALOperation
+-- OpenAL can be used for a variety of audio playback tasks, and is an excellent
+-- complement to OpenGL for real-time rendering, see
+-- "Graphics.Rendering.OpenGL". A programmer who is familiar with OpenGL will
+-- immediately notice the similarities between the two APIs in that they
+-- describe their 3D environments using similar methods.
+--
+-- For an OpenGL\/OpenAL program, most of the audio programming will be in two
+-- places in the code: initialization of the program, and the rendering loop. An
+-- OpenGL\/OpenAL program will typically contain a section where the graphics
+-- and audio systems are initialized, although it may be spread into multiple
+-- functions. For OpenAL, initialization normally consists of creating a
+-- context, creating the initial set of buffers, loading the buffers with sample
+-- data, creating sources, attaching buffers to sources, setting locations and
+-- directions for the listener and sources, and setting the initial values for
+-- state global to OpenAL.
+
+--------------------------------------------------------------------------------
+-- $TimeAndFrequency
+-- By default, OpenAL uses seconds and Hertz as units for time and frequency,
+-- respectively. A float or integral value of one for a variable that specifies
+-- quantities like duration, latency, delay, or any other parameter measured as
+-- time, specifies 1 second. For frequency, the basic unit is 1\/second, or
+-- Hertz. In other words, sample frequencies and frequency cut-offs or filter
+-- parameters specifying frequencies are expressed in units of Hertz.
+
+--------------------------------------------------------------------------------
+-- $SpaceAndDistance
+-- OpenAL does not define the units of measurement for distances. The
+-- application is free to use meters, inches, or parsecs. OpenAL provides means
+-- for simulating the natural attenuation of sound according to distance, and to
+-- exaggerate or reduce this effect. However, the resulting effects do not
+-- depend on the distance unit used by the application to express source and
+-- listener coordinates. OpenAL calculations are scale invariant. The
+-- specification assumes Euclidean calculation of distances, and mandates that
+-- if two sources are sorted with respect to the Euclidean metric, the distance
+-- calculation used by the implementation has to preserve that order.
+
+--------------------------------------------------------------------------------
+-- $CoordinateSystem
+-- OpenAL - like OpenGL - uses a right-handed Cartesian coordinate system (RHS),
+-- where in a frontal default view X (thumb) points right, Y (index finger)
+-- points up, and Z (middle finger) points towards the viewer\/camera. To switch
+-- from a left handed coordinate system (LHS) to a right handed coordinate
+-- systems, flip the sign on the Z coordinate.
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC/ALCboolean.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC/ALCboolean.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC/ALCboolean.hs 1970-01-01 09:00:00.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC/ALCboolean.hs 2006-03-22 00:58:03.000000000 +0900
@@ -0,0 +1,30 @@
+-- #hide
+--------------------------------------------------------------------------------
+-- |
+-- Module : Sound.OpenAL.ALC.ALCboolean
+-- Copyright : (c) Sven Panne 2005
+-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
+--
+-- Maintainer : sven.panne@aedion.de
+-- Stability : provisional
+-- Portability : portable
+--
+-- This is a purely internal module for (un-)marshaling ALCboolean.
+--
+--------------------------------------------------------------------------------
+
+module Sound.OpenAL.ALC.ALCboolean (
+ marshalALCboolean, unmarshalALCboolean
+) where
+
+import Sound.OpenAL.ALC.BasicTypes ( ALCboolean )
+import Sound.OpenAL.Constants ( alc_FALSE, alc_TRUE )
+
+--------------------------------------------------------------------------------
+
+marshalALCboolean :: Bool -> ALCboolean
+marshalALCboolean False = alc_FALSE
+marshalALCboolean True = alc_TRUE
+
+unmarshalALCboolean :: ALCboolean -> Bool
+unmarshalALCboolean = (/= alc_FALSE)
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC/BasicTypes.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC/BasicTypes.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC/BasicTypes.hs 2004-01-03 04:03:09.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC/BasicTypes.hs 2006-03-22 00:58:03.000000000 +0900
@@ -1,82 +1,24 @@
--- #hide
--------------------------------------------------------------------------------
-- |
-- Module : Sound.OpenAL.ALC.BasicTypes
--- Copyright : (c) Sven Panne 2003-2004
+-- Copyright : (c) Sven Panne 2003-2005
-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
--
-- Maintainer : sven.panne@aedion.de
-- Stability : provisional
-- Portability : portable
--
+-- This module corresponds to the introductory parts of chapter 6 (AL Contexts
+-- and the ALC API) of the OpenAL Specification and Reference (version 1.1).
+--
+-- The context API makes use of ALC types which are defined separately from the
+-- AL types - there is an 'ALCboolean', 'ALCchar', etc.
+--
--------------------------------------------------------------------------------
module Sound.OpenAL.ALC.BasicTypes (
- ALCenum,
- Device(..), isDevice, fromDevice,
- withALString, peekALString,
- ContextAttribute(..), marshalContextAttribute, unmarshalContextAttribute
+ ALCboolean, ALCchar, ALCbyte, ALCubyte, ALCshort, ALCushort, ALCint, ALCuint,
+ ALCsizei, ALCenum, ALCfloat, ALCdouble
) where
-import Foreign
-import Foreign.C.String ( withCString, peekCString )
-import Sound.OpenAL.AL.BasicTypes ( ALubyte, ALint )
-import Sound.OpenAL.AL.ALboolean ( marshalALboolean, unmarshalALboolean )
-import Sound.OpenAL.AL.Buffer ( Frequency )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenALConfig.h"
-
-type ALCenum = HTYPE_ALCENUM
-
---------------------------------------------------------------------------------
-
-type ALCdevice = ()
-
-newtype Device = Device (Ptr ALCdevice)
- deriving ( Eq, Ord, Show )
-
-isDevice :: Device -> Bool
-isDevice (Device dev) = dev /= nullPtr
-
-fromDevice :: Maybe Device -> Device
-fromDevice = maybe (Device nullPtr) id
-
---------------------------------------------------------------------------------
-
--- AL uses "Ptr ALubyte" instead of "CString" for strings, so some wrappers
--- are quite handy.
-
-withALString :: String -> (Ptr ALubyte -> IO a) -> IO a
-withALString str action = withCString str (action . castPtr)
-
-peekALString :: Ptr ALubyte -> IO String
-peekALString = peekCString . castPtr
-
---------------------------------------------------------------------------------
-
-data ContextAttribute =
- Frequency Frequency
- | Refresh ALint
- | Sync Bool
- | Sources ALint
- | Buffers ALint
- deriving ( Eq, Ord, Show )
-
-marshalContextAttribute :: ContextAttribute -> (ALint,ALint)
-marshalContextAttribute a = case a of
- Frequency f -> (CONST_ALC_FREQUENCY, fromIntegral f)
- Refresh r -> (CONST_ALC_REFRESH, r)
- Sync s -> (CONST_ALC_SYNC, fromIntegral (marshalALboolean s))
- Sources s -> (0x200000, s)
- Buffers b -> (0x200001, b)
-
-unmarshalContextAttribute :: (ALint,ALint) -> ContextAttribute
-unmarshalContextAttribute a@(x,y)
- | x == CONST_ALC_FREQUENCY = Frequency (fromIntegral y)
- | x == CONST_ALC_REFRESH = Refresh y
- | x == CONST_ALC_SYNC = Sync (unmarshalALboolean (fromIntegral y))
- | x == 0x200000 = Sources y
- | x == 0x200001 = Buffers y
- | otherwise = error ("unmarshalContextAttribute: illegal value " ++ show a)
+import Sound.OpenAL.Config
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC/Capture.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC/Capture.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC/Capture.hs 1970-01-01 09:00:00.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC/Capture.hs 2006-03-22 00:58:03.000000000 +0900
@@ -0,0 +1,136 @@
+--------------------------------------------------------------------------------
+-- |
+-- Module : Sound.OpenAL.ALC.Capture
+-- Copyright : (c) Sven Panne 2005
+-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
+--
+-- Maintainer : sven.panne@aedion.de
+-- Stability : provisional
+-- Portability : portable
+--
+-- This module corresponds to section 6.4.2. (Capture) of the OpenAL
+-- Specification and Reference (version 1.1).
+--
+--------------------------------------------------------------------------------
+
+module Sound.OpenAL.ALC.Capture (
+ NumSamples, captureOpenDevice, captureStart, captureNumSamples,
+ captureSamples, captureStop, captureCloseDevice,
+ captureDefaultDeviceSpecifier, captureDeviceSpecifier,
+ allCaptureDeviceSpecifiers
+) where
+
+import Foreign.Ptr ( Ptr, nullPtr, FunPtr )
+import Graphics.Rendering.OpenGL.GL.StateVar (
+ GettableStateVar, makeGettableStateVar, get )
+import Sound.OpenAL.AL.Buffer ( Format )
+import Sound.OpenAL.AL.Format ( marshalFormat )
+import Sound.OpenAL.ALC.ALCboolean ( unmarshalALCboolean )
+import Sound.OpenAL.ALC.BasicTypes (
+ ALCchar, ALCuint, ALCenum, ALCsizei, ALCboolean )
+import Sound.OpenAL.ALC.Context ( Frequency )
+import Sound.OpenAL.ALC.Device ( Device )
+import Sound.OpenAL.ALC.Extensions ( alcProcAddress )
+import Sound.OpenAL.ALC.QueryUtils ( IntQuery(..), getInteger )
+import Sound.OpenAL.ALC.QueryUtils (
+ StringQuery(..), getString, getStringRaw, alcIsExtensionPresent )
+import Sound.OpenAL.ALC.String ( withALCString, peekALCStrings )
+import Sound.OpenAL.Config ( ALCdevice, marshalDevice, unmarshalDevice )
+
+--------------------------------------------------------------------------------
+
+type NumSamples = ALCsizei
+
+--------------------------------------------------------------------------------
+
+type Invoker a = FunPtr a -> a
+
+getCaptureFunc :: String -> IO (FunPtr a)
+getCaptureFunc = get . alcProcAddress Nothing
+
+--------------------------------------------------------------------------------
+
+captureOpenDevice ::
+ Maybe String -> Frequency -> Format -> NumSamples -> IO (Maybe Device)
+captureOpenDevice maybeDeviceSpec frequency format size = do
+ funPtr <- getCaptureFunc "alcCaptureOpenDevice"
+ let open deviceSpec =
+ invokeCaptureOpenDevice funPtr deviceSpec (round frequency)
+ (fromIntegral (marshalFormat format)) size
+ fmap unmarshalDevice $
+ (maybe (open nullPtr) -- use preferred device
+ (flip withALCString open)
+ maybeDeviceSpec)
+
+foreign import CALLCONV unsafe "dynamic"
+ invokeCaptureOpenDevice :: Invoker (Ptr ALCchar -> ALCuint -> ALCenum -> ALCsizei -> IO ALCdevice)
+
+--------------------------------------------------------------------------------
+
+captureStart :: Device -> IO ()
+captureStart = captureStartStop "alcCaptureStart"
+
+captureStartStop :: String -> Device -> IO ()
+captureStartStop funName device = do
+ funPtr <- getCaptureFunc funName
+ invokeCaptureStartStop funPtr (marshalDevice device)
+
+foreign import CALLCONV unsafe "dynamic"
+ invokeCaptureStartStop :: Invoker (ALCdevice -> IO ())
+
+--------------------------------------------------------------------------------
+
+captureNumSamples :: Device -> GettableStateVar NumSamples
+captureNumSamples device =
+ makeGettableStateVar $ getInteger (Just device) CaptureSamples
+
+--------------------------------------------------------------------------------
+
+captureSamples :: Device -> Ptr a -> NumSamples -> IO ()
+captureSamples = alcCaptureSamples . marshalDevice
+
+foreign import CALLCONV unsafe "alcCaptureSamples"
+ alcCaptureSamples :: ALCdevice -> Ptr a -> NumSamples -> IO ()
+
+--------------------------------------------------------------------------------
+
+captureStop :: Device -> IO ()
+captureStop = captureStartStop "alcCaptureStop"
+
+--------------------------------------------------------------------------------
+
+captureCloseDevice :: Device -> IO Bool
+captureCloseDevice device = do
+ funPtr <- getCaptureFunc "alcCaptureCloseDevice"
+ fmap unmarshalALCboolean .
+ invokeCaptureCloseDevice funPtr . marshalDevice $ device
+
+foreign import CALLCONV unsafe "dynamic"
+ invokeCaptureCloseDevice :: Invoker (ALCdevice -> IO ALCboolean)
+
+--------------------------------------------------------------------------------
+
+-- | Contains the name of the default capture device.
+
+captureDefaultDeviceSpecifier :: GettableStateVar String
+captureDefaultDeviceSpecifier = makeGettableStateVar $
+ getString Nothing CaptureDefaultDeviceSpecifier
+
+--------------------------------------------------------------------------------
+
+-- | Contains the specifier string for the given capture device.
+
+captureDeviceSpecifier :: Device -> GettableStateVar String
+captureDeviceSpecifier device = makeGettableStateVar $
+ getString (Just device) CaptureDeviceSpecifier
+
+--------------------------------------------------------------------------------
+
+-- | Contains a list of specifiers for all available capture devices.
+
+allCaptureDeviceSpecifiers :: GettableStateVar [String]
+allCaptureDeviceSpecifiers = makeGettableStateVar $ do
+ enumExtPresent <- get (alcIsExtensionPresent Nothing "ALC_ENUMERATION_EXT")
+ if enumExtPresent
+ then peekALCStrings =<< getStringRaw Nothing CaptureDeviceSpecifier
+ else fmap (\s -> [s]) $ get captureDefaultDeviceSpecifier
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC/Context.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC/Context.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC/Context.hs 2005-02-24 18:58:23.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC/Context.hs 2006-03-22 00:58:03.000000000 +0900
@@ -1,152 +1,198 @@
--------------------------------------------------------------------------------
-- |
-- Module : Sound.OpenAL.ALC.Context
--- Copyright : (c) Sven Panne 2003-2004
+-- Copyright : (c) Sven Panne 2003-2005
-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
--
-- Maintainer : sven.panne@aedion.de
-- Stability : provisional
-- Portability : portable
--
--- Managing Rendering Contexts
+-- This module corresponds to section 6.2 (Managing Rendering Contexts) of the
+-- OpenAL Specification and Reference (version 1.1).
+--
+-- All operations of the AL core API affect a current AL context. Within the
+-- scope of AL, the ALC is implied - it is not visible as a handle or function
+-- parameter. Only one AL Context per process can be current at a time.
+-- Applications maintaining multiple AL Contexts, whether threaded or not,
+-- have to set the current context accordingly. Applications can have multiple
+-- threads that share one more or contexts. In other words, AL and ALC are
+-- threadsafe.
--
--------------------------------------------------------------------------------
module Sound.OpenAL.ALC.Context (
- ContextAttribute(..), Context, createContext, destroyContext, currentContext,
- processContext, suspendContext,
-
- contextsDevice, allAttributes
+ Frequency, ContextAttribute(..), Context, createContext, currentContext,
+ processContext, suspendContext, destroyContext, contextsDevice, allAttributes
) where
-import Control.Monad ( liftM )
import Foreign.Marshal.Array ( withArray0 )
-import Foreign.Ptr ( Ptr, nullPtr )
+import Foreign.Ptr ( Ptr )
import Graphics.Rendering.OpenGL.GL.StateVar (
StateVar, makeStateVar, GettableStateVar, makeGettableStateVar )
-import Sound.OpenAL.AL.BasicTypes ( ALint )
+import Sound.OpenAL.ALC.BasicTypes ( ALCint )
+import Sound.OpenAL.ALC.ALCboolean ( marshalALCboolean, unmarshalALCboolean )
import Sound.OpenAL.ALC.Device ( Device )
-import Sound.OpenAL.ALC.Queries ( IntQuery(..), getInteger, getIntegerv )
-import Sound.OpenAL.ALC.BasicTypes (
- ALCenum, isDevice,
- ContextAttribute(..), marshalContextAttribute, unmarshalContextAttribute )
-import Sound.OpenAL.ALC.Errors ( checkError )
+import Sound.OpenAL.ALC.QueryUtils ( IntQuery(..), getInteger, getIntegerv )
+import Sound.OpenAL.Config (
+ ALCdevice, marshalDevice, unmarshalDevice,
+ ALCcontext, Context, nullContext, marshalContext, unmarshalContext,
+ alcProcessContext, alcDestroyContext, alcMakeContextCurrent )
+import Sound.OpenAL.Constants (
+ alc_FREQUENCY, alc_REFRESH, alc_SYNC, alc_MONO_SOURCES, alc_STEREO_SOURCES )
---------------------------------------------------------------------------------
+#ifdef __HADDOCK__
+import Sound.OpenAL.ALC.Errors ( ALCErrorCategory(..) )
+#endif
-type ALCcontext = ()
+--------------------------------------------------------------------------------
-newtype Context = Context (Ptr ALCcontext)
- deriving ( Eq, Ord, Show )
+-- | Frequency, specified in samples per second, i.e. units of Hertz \[Hz\].
+-- Note that the underlying OpenAL API currently uses integral frequencies
+-- only, but we want to mirror physical reality here more closely.
-isContext :: Context -> Bool
-isContext (Context ctx) = ctx /= nullPtr
+type Frequency = Float
--------------------------------------------------------------------------------
--- | Allocates, initializes, and returns a context for the given device with the
--- requested attributes. If any attribute cannot have the required value met or
--- exceeded, an 'IOError' is thrown. If the device is not valid, an
--- 'Sound.OpenAL.ALC.Errors.ALCInvalidDevice' error is set and an 'IOError' is
--- thrown. Note that 'createContext' does /not/ set the current context, this
--- must be done separately via 'currentContext'.
+-- | The application can choose to specify certain attributes for a context at
+-- context-creation time. Attributes not specified explicitly are set to
+-- implementation dependent defaults.
-createContext :: Device -> [ContextAttribute] -> IO Context
-createContext device attributes =
- let pairToList (key, value) = [key, value]
- attrs = concatMap (pairToList . marshalContextAttribute) attributes
- in checkError isContext . withArray0 0 attrs $ alcCreateContext device
+data ContextAttribute =
+ Frequency Frequency -- ^ Frequency for mixing output buffer, in units of
+ -- Hz
+ | Refresh Frequency -- ^ Refresh intervals, in units of Hz
+ | Sync Bool -- ^ Flag, indicating a synchronous context
+ | MonoSources Int -- ^ A hint indicating how many sources should be
+ -- capable of supporting mono data
+ | StereoSources Int -- ^ A hint indicating how many sources should be
+ -- capable of supporting stereo data
+ deriving ( Eq, Ord, Show )
-foreign import CALLCONV unsafe "alcCreateContext"
- alcCreateContext :: Device -> Ptr ALint -> IO Context
+marshalContextAttribute :: ContextAttribute -> (ALCint,ALCint)
+marshalContextAttribute a = case a of
+ Frequency f -> (alc_FREQUENCY, round f)
+ Refresh r -> (alc_REFRESH, round r)
+ Sync s -> (alc_SYNC, fromIntegral (marshalALCboolean s))
+ MonoSources m -> (alc_MONO_SOURCES, fromIntegral m)
+ StereoSources s -> (alc_STEREO_SOURCES, fromIntegral s)
+
+unmarshalContextAttribute :: (ALCint,ALCint) -> ContextAttribute
+unmarshalContextAttribute a@(x,y)
+ | x == alc_FREQUENCY = Frequency (fromIntegral y)
+ | x == alc_REFRESH = Refresh (fromIntegral y)
+ | x == alc_SYNC = Sync (unmarshalALCboolean (fromIntegral y))
+ | x == alc_MONO_SOURCES = MonoSources (fromIntegral y)
+ | x == alc_STEREO_SOURCES = StereoSources (fromIntegral y)
+ | otherwise = error ("unmarshalContextAttribute: illegal value " ++ show a)
--------------------------------------------------------------------------------
--- | Destroys the given context.
+-- | Create a context for a given device and given attributes. Context creation
+-- will fail in the following cases: a) if the application requests attributes
+-- that, by themselves, can not be provided b) if the combination of specified
+-- attributes can not be provided c) if a specified attribute, or the
+-- combination of attributes, does not match the default values for unspecified
+-- attributes If context creation fails, 'Nothing' will be returned, otherwise
+-- 'Just' the new context. Note that 'createContext' does /not/ set the current
+-- context, this must be done separately via 'currentContext'.
-destroyContext :: Context -> IO ()
-destroyContext = ignore . alcDestroyContext
+createContext :: Device -> [ContextAttribute] -> IO (Maybe Context)
+createContext device attributes = do
+ let pairToList (key, value) = [key, value]
+ attrs = concatMap (pairToList . marshalContextAttribute) attributes
+ fmap unmarshalContext .
+ withArray0 0 attrs . alcCreateContext . marshalDevice $ device
-foreign import CALLCONV unsafe "alcDestroyContext"
- alcDestroyContext :: Context -> IO ALCenum
+foreign import CALLCONV unsafe "alcCreateContext"
+ alcCreateContext :: ALCdevice -> Ptr ALCint -> IO ALCcontext
--------------------------------------------------------------------------------
--- | 'Just' the current context, 'Nothing' means paused.
+-- | Contains 'Just' the current context with respect to OpenAL operation, or
+-- 'Nothing' if there is no current context. Setting it to the latter is useful
+-- when shutting OpenAL down. The state variable applies to the device that the
+-- context was created for. For each OS process (usually this means for each
+-- application), only one context can be current at any given time. All AL
+-- commands apply to the current context. Commands that affect objects shared
+-- among contexts (e.g. buffers) have side effects on other contexts.
currentContext :: StateVar (Maybe Context)
currentContext = makeStateVar getCurrentContext makeContextCurrent
--- | Returns 'Just' the current context or 'Nothing' if there is none.
-
getCurrentContext :: IO (Maybe Context)
-getCurrentContext = do
- context <- alcGetCurrentContext
- return $ if isContext context then Nothing else Just context
+getCurrentContext = fmap unmarshalContext $ alcGetCurrentContext
foreign import CALLCONV unsafe "alcGetCurrentContext"
- alcGetCurrentContext :: IO Context
-
--- | Makes the given context the current context or pauses when given 'Nothing'.
+ alcGetCurrentContext :: IO ALCcontext
makeContextCurrent :: Maybe Context -> IO ()
-makeContextCurrent mbContext =
- ignore $ alcMakeContextCurrent (maybe (Context nullPtr) id mbContext)
-
-foreign import CALLCONV unsafe "alcMakeContextCurrent"
- alcMakeContextCurrent :: Context -> IO ALCenum
+makeContextCurrent =
+ fmap (const ()) . alcMakeContextCurrent . marshalContext . maybe nullContext id
--------------------------------------------------------------------------------
--- | Performs processing on a synced context, nop on an asynchronous context.
+-- | The current context is the only context accessible to state changes by AL
+-- commands (aside from state changes affecting shared objects). However,
+-- multiple contexts can be processed at the same time. To indicate that a
+-- context should be processed (i.e. that internal execution state like offset
+-- increments are supposed to be performed), the application has to use
+-- 'processContext'. Repeated calls to 'processContext' are legal, and do not
+-- affect a context that is already marked as processing. The default state of a
+-- context created by 'createContext' is that it is processing.
processContext :: Context -> IO ()
-processContext = ignore . alcProcessContext
+processContext = fmap (const ()) . alcProcessContext . marshalContext
-foreign import CALLCONV unsafe "alcProcessContext"
- alcProcessContext :: Context -> IO Context
+-- | The application can suspend any context from processing (including the
+-- current one). To indicate that a context should be suspended from processing
+-- (i.e. that internal execution state like offset increments is not supposed to
+-- be changed), the application has to use 'suspendContext'. Repeated calls to
+-- 'suspendContext' are legal, and do not affect a context that is already
+-- marked as suspended.
--- | Suspends processing on an asynchronous context. This is a legal nop on a
--- synced context.
+suspendContext :: Context -> IO ()
+suspendContext = alcSuspendContext . marshalContext
foreign import CALLCONV unsafe "alcSuspendContext"
- suspendContext :: Context -> IO ()
+ alcSuspendContext :: ALCcontext -> IO ()
--------------------------------------------------------------------------------
--- ALC's error handling is highly irregular: Somtimes a success/failure value is
--- returned in addition to setting the internal error state. We don't do the
--- same in our Haskell API, effectively ignoring the returned value.
+-- | Destroy the given context. Note that the the correct way to destroy a
+-- context is to first release it by setting 'currentContext' to
+-- 'Nothing'. Applications should not attempt to destroy a current context,
+-- doing so will not work and will result in an 'ALCInvalidOperation' error.
-ignore :: IO a -> IO ()
-ignore action = do
- action
- return ()
+destroyContext :: Context -> IO ()
+destroyContext = fmap (const ()) . alcDestroyContext . marshalContext
--------------------------------------------------------------------------------
--- | 'Just' the device of the given context or 'Nothing' if the context is
--- invalid.
+-- | Contains 'Just' the device of the given context or 'Nothing' if the context
+-- is invalid.
contextsDevice :: Context -> GettableStateVar (Maybe Device)
-contextsDevice context = makeGettableStateVar $ do
- device <- alcGetContextsDevice context
- return $ if isDevice device then Nothing else Just device
+contextsDevice =
+ makeGettableStateVar .
+ fmap unmarshalDevice . alcGetContextsDevice . marshalContext
foreign import CALLCONV unsafe "alcGetContextsDevice"
- alcGetContextsDevice :: Context -> IO Device
+ alcGetContextsDevice :: ALCcontext -> IO ALCdevice
--------------------------------------------------------------------------------
--- | Note that we need a current context here!
+-- | Contains the attribute list for the current context of the specified
+-- device.
allAttributes :: Device -> GettableStateVar [ContextAttribute]
allAttributes device = makeGettableStateVar $ do
- numALints <- liftM fromIntegral $ getInteger device AttributesSize
- liftM toContextAttributes $ getIntegerv device AllAttributes numALints
+ numALCints <- fmap fromIntegral $ getInteger (Just device) AttributesSize
+ fmap toContextAttributes $ getIntegerv (Just device) AllAttributes numALCints
-toContextAttributes :: [ALint] -> [ContextAttribute]
+toContextAttributes :: [ALCint] -> [ContextAttribute]
toContextAttributes xs = case xs of
[] -> [] -- should only happen when device and/or current context is invalid
(0:_) -> []
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC/Device.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC/Device.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC/Device.hs 2004-04-05 23:15:54.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC/Device.hs 2006-03-22 00:58:03.000000000 +0900
@@ -1,79 +1,223 @@
--------------------------------------------------------------------------------
-- |
-- Module : Sound.OpenAL.ALC.Device
--- Copyright : (c) Sven Panne 2003-2004
+-- Copyright : (c) Sven Panne 2003-2005
-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
--
-- Maintainer : sven.panne@aedion.de
-- Stability : provisional
-- Portability : portable
--
--- Managing Devices
+-- This module corresponds to section 6.1 (Managing Devices) of the OpenAL
+-- Specification and Reference (version 1.1).
+--
+-- ALC introduces the notion of a device. A device can be, depending on the
+-- implementation, a hardware device, or a daemon\/OS service\/actual
+-- server. This mechanism also permits different drivers (and hardware) to
+-- coexist within the same system, as well as allowing several applications to
+-- share system resources for audio, including a single hardware output
+-- device. The details are left to the implementation, which has to map the
+-- available backends to unique device specifiers.
--
--------------------------------------------------------------------------------
module Sound.OpenAL.ALC.Device (
Device, openDevice, closeDevice,
- deviceSpecifier, alcVersion,
- defaultDeviceSpecifier, allDeviceSpecifiers
+ defaultDeviceSpecifier, deviceSpecifier, allDeviceSpecifiers
) where
-import Control.Monad ( liftM, liftM2 )
import Foreign.Ptr ( Ptr, nullPtr )
+import Foreign.Marshal.Utils ( maybePeek )
import Graphics.Rendering.OpenGL.GL.StateVar (
GettableStateVar, makeGettableStateVar, get )
-import Sound.OpenAL.AL.BasicTypes ( ALubyte, ALint )
-import Sound.OpenAL.ALC.Queries(
- StringQuery(..), alcGetString, alcGetString_,
- IntQuery(..), getInteger,
- alcIsExtensionPresent )
-import Sound.OpenAL.ALC.BasicTypes ( Device, isDevice, withALString )
-import Sound.OpenAL.ALC.Errors ( checkError )
+import Sound.OpenAL.ALC.BasicTypes ( ALCchar )
+import Sound.OpenAL.ALC.QueryUtils (
+ StringQuery(..), getString, getStringRaw, alcIsExtensionPresent )
+import Sound.OpenAL.ALC.String ( withALCString, peekALCString, peekALCStrings )
+import Sound.OpenAL.Config (
+ Device, ALCdevice, unmarshalDevice, closeDevice )
--------------------------------------------------------------------------------
--- | Opens a device, using an alrc expression to specify attributes for the
--- device. Throws an IOError on failure. The ALC error flag is cleared in any
--- case.
+-- | 'openDevice' allows the application (i.e. the client program) to connect to
+-- a device (i.e. the server). If the function returns 'Nothing', then no sound
+-- driver\/device has been found. The argument to 'openDevice' specifies a
+-- certain device or device configuration. If it is 'Nothing', the
+-- implementation will provide an implementation specific default, see
+-- 'defaultDeviceSpecifier'. Otherwise it is 'Just' an implementation-dependent
+-- string. You can use 'allDeviceSpecifiers' to get a list of the known OpenAL
+-- devices.
+--
+-- /Notes for Windows:/ There are 3 possible device strings, each having a
+-- deprecated equivalent for legacy applications only:
+--
+-- * @\"Generic Hardware\"@ (legacy string: @\"DirectSound3D\"@)
+--
+-- * @\"Generic Software\"@ (legacy string: @\"DirectSound\"@)
+--
+-- * @\"Generic Software Fallback\"@ (legacy string: @\"MMSYSTEM\"@)
+--
+-- /Notes for Linux\/\*nix:/ If an @.openalrc@ file is present in the user\'s
+-- home directory, it is loaded first, otherwise @\/etc\/openalrc@ is tried.
+-- The bindings (if any) of @devices@, @direction@, @sampling-rate@, and
+-- @speaker-num@ (see below) after loading one of these files take precedence
+-- over any bindings done via the argument to 'openDevice'.
+--
+-- The syntax of these files is lisp-based and a sequence of expressions, where
+-- an expression is one the following:
+--
+-- * A boolean value of the form @\#f@ or @\#t@, which evaluate to /false/ and
+-- /true/, respectively.
+--
+-- * An non-negative integer value, i.e. a sequence of decimal digits,
+-- evaluating to itself.
+--
+-- * A (signed) floating point value, as recoginzed by C\'s @atof()@, evaluating
+-- to itself.
+--
+-- * A pointer value of the form @\#p/num/@, where /num/ can be an octal,
+-- decimal or hexadecimal value, as recoginzed by C\`s @strtol()@, evaluating
+-- to itself. This kind of expression is currently unused.
+--
+-- * A string, i.e. a sequence of printable\/whitespace characters between
+-- double quotes, evaluating to itself.
+--
+-- * A symbol, i.e. a sequence of almost all characters which don\'t form a
+-- simple expression like the ones mentioned below, e.g. @foo@, @bar1@, @3baz@,
+-- ... The symbol evaluates to the value currently bound to it.
+--
+-- * A function application of the form @(/symbol/ /expression/...)@. The
+-- function bound to the symbol is applied to the evaluated arguments.
+--
+-- * A quotation of the form @(quote /expression/)@ or @\'/expression/@,
+-- evaluating to the unevaluated /expression/ itself.
+--
+-- * A definition of the form @(define /symbol/ /expression/)@, binding /symbol/
+-- to the value of /expression/. The whole expression evaluates to the value of
+-- /expression/, too.
+--
+-- * A conjunction of boolean expressions of the form @(and /expression/...)@.
+-- Each /expression/ is evaluated in turn, and if one of them evaluates to
+-- /false/, the value of the whole expression is /false/. Otherwise the value is
+-- /true/.
+--
+-- * An extension loading mechanism of the form @(load-extension
+-- /libraryName/)@, where /libraryName/ has to evaluate to a string. This tries
+-- to load the dynamic library with up to 3 special entry points:
+-- @alExtension_03282000@ (pointing to a mandatory NULL-terminated sequence of
+-- pairs of pointers to names and extension functions), @alExtInit_03282000@ (an
+-- optional initialization function), and @alExtFini_03282000@ (an optional
+-- cleanup function). If the extension could be loaded successfully, the whole
+-- expression evaluates to /true/, otherwise to /false/.
+--
+-- Some symbols have a special meaning for OpenAL:
+--
+-- [@devices@] Has the form @(/devspec/...)@, where /devspec/ is either a
+-- symbol\/string specifying a device or @(/device/ /device-param/...)@,
+-- specifying a device with additional parameters. These optional device
+-- parameters are stored in a variable @device-params@, but are currently
+-- unused. The first device which can successfully opened is used.
+--
+-- [@direction@] Type string or symbol: @\"read\"@ specifies that the device
+-- should be an input device, everything else means output device (default).
+--
+-- [@sampling-rate@] Type integer or float: Specifies the internal mixing
+-- frequency, default is 44.1kHz.
+--
+-- [@speaker-num@] Type integer or float: Specifies the number of speakers,
+-- which can be 1, 2 (default), or 4.
+--
+-- [@alsa-device@] Type string, @alsa@ backend only: Specifies both
+-- @alsa-out-device@ and @alsa-in-device@, default @\"plughw:0,0\"@.
+--
+-- [@alsa-out-device@] Type string, @alsa@ backend only: Specifies the ALSA
+-- output device, defaults to the value of @alsa-device@.
+--
+-- [@alsa-in-device@] Type string, @alsa@ backend only: Specifies the ALSA
+-- input device, defaults to the value of @alsa-device@.
+--
+-- [@native-in-device@] Type string, @native@ backend on IRIX only.
+--
+-- [@native-out-device@] Type string, @native@ backend on IRIX only.
+--
+-- [@native-rear-out-device@] Type string, @native@ backend on IRIX only.
+--
+-- [@native-use-select@] Type boolean, @native@ backend on Linux only: If @\#t@,
+-- wait up to 0.8sec for the device to become ready for writing. If @\#f@, just
+-- try to write and hope it won\'t hang forever. The latter might be necessary
+-- for some drivers which don\'t implement @select()@ , like some Aureal
+-- drivers.
+--
+-- [@lin-dsp-path@] Type string, @native@ backend on Linux only: Path to DSP
+-- device for writing, tried before @\/dev\/sound\/dsp@ and @\/dev\/sound@ if
+-- set.
+--
+-- [@lin-dsp-read-path@] Type string, @native@ backend on Linux only: Path to
+-- DSP device for reading, tried before @\/dev\/sound\/dsp@ and @\/dev\/sound@
+-- if set. Defaults to the value of @lin-dsp-path@.
+--
+-- [@native-backend-debug@] Type boolean, @native@ backend on Darwin only: If
+-- set to @\#f@, be a bit verbose on stderr about what\'s going on in the
+-- backend.
+--
+-- [@source-rolloff-factor@] Type integer or float: Value of the initial rolloff
+-- factor for sources, default is @1.0@.
+--
+-- [@listener-position@] List of 3 integers or floats: Value of the initial
+-- listener position, default is @(0 0 0)@.
+--
+-- [@listener-velocity@] List of 3 integers or floats: Value of the initial
+-- listener velocity, default is @(0 0 0)@.
+--
+-- [@listener-orientation@] List of 6 integers or floats: Value of the initial
+-- listener orientation (at\/up), default is @(0 0 -1 0 1 0)@.
+--
+-- The string given to 'openDevice' has to be of the form @\'((/symbol/
+-- /expression/) ...)@, which means basically a sequence of @define@
+-- expressions. Example:
+--
+-- @
+-- \"\'((sampling-rate 8000) (native-backend-debug \#f))\"
+-- @
+--
+-- /Note:/ The information above has been reverse-engineered from the OpenAL SI
+-- and could be inaccurate. Any corrections and\/or additions are highly
+-- welcome.
-openDevice :: Maybe String -> IO Device
+openDevice :: Maybe String -> IO (Maybe Device)
openDevice maybeDeviceSpec =
- checkError isDevice $
+ fmap unmarshalDevice $
maybe (alcOpenDevice nullPtr) -- use preferred device
- (flip withALString alcOpenDevice)
+ (flip withALCString alcOpenDevice)
maybeDeviceSpec
foreign import CALLCONV unsafe "alcOpenDevice"
- alcOpenDevice :: Ptr ALubyte -> IO Device
+ alcOpenDevice :: Ptr ALCchar -> IO ALCdevice
+
+--------------------------------------------------------------------------------
--- | Closes the given device.
+-- | Contains 'Just' the specifier string for the default device or 'Nothing' if
+-- there is no sound support at all.
-foreign import CALLCONV unsafe "alcCloseDevice"
- closeDevice :: Device -> IO ()
+defaultDeviceSpecifier :: GettableStateVar (Maybe String)
+defaultDeviceSpecifier = makeGettableStateVar $
+ getStringRaw Nothing DefaultDeviceSpecifier >>= maybePeek peekALCString
--------------------------------------------------------------------------------
+-- | Contains the specifier string for the given device.
+
deviceSpecifier :: Device -> GettableStateVar String
deviceSpecifier device = makeGettableStateVar $
- alcGetString (Just device) DeviceSpecifier
-
---------------------------------------------------------------------------------
-
-alcVersion :: Device -> GettableStateVar (ALint, ALint) -- ToDo: Without Device?????
-alcVersion device = makeGettableStateVar $
- liftM2 (,) (getInteger device MajorVersion) (getInteger device MinorVersion)
+ getString (Just device) DeviceSpecifier
--------------------------------------------------------------------------------
-defaultDeviceSpecifier :: GettableStateVar String
-defaultDeviceSpecifier = makeGettableStateVar $
- alcGetString Nothing DefaultDeviceSpecifier
+-- | Contains a list of specifiers for all available devices.
allDeviceSpecifiers :: GettableStateVar [String]
allDeviceSpecifiers = makeGettableStateVar $ do
- enumExtPresent <- alcIsExtensionPresent Nothing "ALC_ENUMERATION_EXT"
+ enumExtPresent <- get (alcIsExtensionPresent Nothing "ALC_ENUMERATION_EXT")
if enumExtPresent
- then do
- ptr <- alcGetString_ Nothing DeviceSpecifier
- return [] -- Todo!!!!!
- else liftM (\s -> [s]) $ get defaultDeviceSpecifier
+ then getStringRaw Nothing DeviceSpecifier >>= peekALCStrings
+ else get defaultDeviceSpecifier >>= (return . maybe [] (\s -> [s]))
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC/Errors.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC/Errors.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC/Errors.hs 2004-01-03 04:03:09.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC/Errors.hs 2006-03-22 00:58:03.000000000 +0900
@@ -1,65 +1,93 @@
--------------------------------------------------------------------------------
-- |
-- Module : Sound.OpenAL.ALC.Errors
--- Copyright : (c) Sven Panne 2003-2004
+-- Copyright : (c) Sven Panne 2003-2005
-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
--
-- Maintainer : sven.panne@aedion.de
-- Stability : provisional
-- Portability : portable
--
--- Errors
+-- This module corresponds to section 6.3.6 (Query for Error Conditions) of the
+-- OpenAL Specification and Reference (version 1.1).
--
--------------------------------------------------------------------------------
module Sound.OpenAL.ALC.Errors (
- ALCerror(..), alcGetError, checkError
+ ALCError(..), ALCErrorCategory(..), alcErrors
) where
-import Sound.OpenAL.ALC.BasicTypes ( ALCenum, Device, fromDevice )
+import Graphics.Rendering.OpenGL.GL.StateVar (
+ GettableStateVar, makeGettableStateVar )
+import Sound.OpenAL.ALC.BasicTypes ( ALCenum )
+import Sound.OpenAL.ALC.Device ( Device )
+import Sound.OpenAL.ALC.QueryUtils ( StringQuery(..), getString )
+import Sound.OpenAL.Constants (
+ alc_NO_ERROR, alc_INVALID_DEVICE, alc_INVALID_CONTEXT, alc_INVALID_ENUM,
+ alc_INVALID_VALUE, alc_OUT_OF_MEMORY, alc_INVALID_OPERATION )
+import Sound.OpenAL.Config ( ALCdevice, marshalDevice )
--------------------------------------------------------------------------------
-#include "HsOpenALConfig.h"
+-- | ALC errors consist of a general error category and a description of what
+-- went wrong.
+
+data ALCError = ALCError ALCErrorCategory String
+ deriving ( Eq, Ord, Show )
--------------------------------------------------------------------------------
-data ALCerror =
- ALCInvalidDevice
- | ALCInvalidContext
- | ALCInvalidEnum
+-- | General ALC error categories.
+
+data ALCErrorCategory =
+ ALCInvalidEnum
| ALCInvalidValue
+ | ALCInvalidOperation
+ | ALCInvalidDevice
+ | ALCInvalidContext
| ALCOutOfMemory
deriving ( Eq, Ord, Show )
-unmarshalALCerror :: ALCenum -> ALCerror
-unmarshalALCerror x
- | x == CONST_ALC_INVALID_DEVICE = ALCInvalidDevice
- | x == CONST_ALC_INVALID_CONTEXT = ALCInvalidContext
- | x == CONST_ALC_INVALID_ENUM = ALCInvalidEnum
- | x == CONST_ALC_INVALID_VALUE = ALCInvalidValue
- | x == CONST_ALC_OUT_OF_MEMORY = ALCOutOfMemory
- | otherwise = error ("unmarshalALCerror: illegal value " ++ show x)
+unmarshalALCErrorCategory :: ALCenum -> ALCErrorCategory
+unmarshalALCErrorCategory x
+ | x == alc_INVALID_ENUM = ALCInvalidEnum
+ | x == alc_INVALID_VALUE = ALCInvalidValue
+ | x == alc_INVALID_OPERATION = ALCInvalidOperation
+ | x == alc_INVALID_DEVICE = ALCInvalidDevice
+ | x == alc_INVALID_CONTEXT = ALCInvalidContext
+ | x == alc_OUT_OF_MEMORY = ALCOutOfMemory
+ | otherwise = error ("unmarshalALCErrorCategory: illegal value " ++ show x)
--------------------------------------------------------------------------------
-alcGetError :: Maybe Device -> IO (Maybe ALCerror) -- ToDo: The device is always unused!
-alcGetError device = do
- e <- alcGetError_ (fromDevice device)
- return $ if e == CONST_ALC_NO_ERROR then Nothing else Just (unmarshalALCerror e)
+-- | OpenAL detects only a subset of those conditions that could be considered
+-- errors. This is because in many cases error checking would adversely impact
+-- the performance of an error-free program. The state variable 'alcErrors' is
+-- used to obtain error information. When an error is detected by ALC, a flag is
+-- set and the error code is recorded. Further errors, if they occur, do not
+-- affect this recorded code. When 'alcErrors' is read, the error for the given
+-- device is returned and the flag is cleared, so that a further error will
+-- again record its code. If reading 'alcErrors' returns @\[\]@ then there has
+-- been no detectable error since the last time 'alcErrors' (or since the ALC
+-- was initialized).
+--
+-- When an error flag is set, results of ALC operations are undefined only if
+-- 'ALCOutOfMemory' has occurred. In other cases, the command generating the
+-- error is ignored so that it has no effect on ALC state or output buffer
+-- contents. If the error generating command returns a value, it returns zero.
+-- If the generating command modifies values through a pointer argument, no
+-- change is made to these values. These error semantics apply only to ALC
+-- errors, not to system errors such as memory access errors.
+
+alcErrors :: Device -> GettableStateVar [ALCError]
+alcErrors device =
+ makeGettableStateVar $ do
+ c <- alcGetError (marshalDevice device)
+ if c == alc_NO_ERROR
+ then return []
+ else do
+ s <- getString (Just device) (ALCErrorCategory c)
+ return [ ALCError (unmarshalALCErrorCategory c) s ]
foreign import CALLCONV unsafe "alcGetError"
- alcGetError_ :: Device -> IO ALCenum
-
---------------------------------------------------------------------------------
-
--- OpenAL does not always set the error flag, especially for out of memory
--- conditions, so we hack around this fact below. *sigh*
-checkError :: (a -> Bool) -> IO a -> IO a
-checkError predicate action = do
- alcGetError Nothing -- clear error flag
- val <- action
- if predicate val
- then return val
- else do err <- alcGetError Nothing
- ioError . userError . show . maybe ALCOutOfMemory id $ err
+ alcGetError :: ALCdevice -> IO ALCenum
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC/Extensions.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC/Extensions.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC/Extensions.hs 2004-01-03 04:03:09.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC/Extensions.hs 2006-03-22 00:58:03.000000000 +0900
@@ -1,51 +1,86 @@
--------------------------------------------------------------------------------
-- |
-- Module : Sound.OpenAL.ALC.Extensions
--- Copyright : (c) Sven Panne 2003-2004
+-- Copyright : (c) Sven Panne 2003-2005
-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
--
-- Maintainer : sven.panne@aedion.de
-- Stability : provisional
-- Portability : portable
--
--- Extension Handling
+-- This module corresponds to the extension handling parts of section 6.3
+-- (ALC Queries) of the OpenAL Specification and Reference (version 1.1).
--
--------------------------------------------------------------------------------
module Sound.OpenAL.ALC.Extensions (
- alcExtensions, alcIsExtensionPresent, alcGetProcAddress, alcGetEnumValue
+ alcExtensions, alcIsExtensionPresent, alcProcAddress, alcEnumValue,
+ alcVersion
) where
-import Control.Monad ( liftM )
+import Control.Monad ( liftM2 )
import Foreign.Ptr ( Ptr, FunPtr )
import Graphics.Rendering.OpenGL.GL.StateVar (
GettableStateVar, makeGettableStateVar )
-import Sound.OpenAL.AL.BasicTypes
-import Sound.OpenAL.ALC.BasicTypes ( fromDevice, withALString )
+import Sound.OpenAL.ALC.BasicTypes ( ALCchar, ALCenum, ALCint )
import Sound.OpenAL.ALC.Device ( Device )
-import Sound.OpenAL.ALC.Queries (
- StringQuery(..), alcGetString, alcIsExtensionPresent )
+import Sound.OpenAL.ALC.QueryUtils (
+ StringQuery(..), getString, IntQuery(..), getInteger, alcIsExtensionPresent )
+import Sound.OpenAL.ALC.String ( withALCString )
+import Sound.OpenAL.Config ( ALCdevice, nullDevice, marshalDevice )
--------------------------------------------------------------------------------
-alcExtensions :: GettableStateVar [String]
-alcExtensions = makeGettableStateVar $
- liftM words $ alcGetString Nothing Extensions
+-- | Contains a list of available context extensions.
+
+alcExtensions :: Device -> GettableStateVar [String]
+alcExtensions device = makeGettableStateVar $
+ fmap words $ getString (Just device) Extensions
--------------------------------------------------------------------------------
-alcGetProcAddress :: Maybe Device -> String -> IO (FunPtr a)
-alcGetProcAddress device funcName =
- withALString funcName (alcGetProcAddress_ (fromDevice device))
+-- | The application is expected to verify the applicability of an extension or
+-- core function entry point before requesting it by name, by use of
+-- 'alcIsExtensionPresent'. Extension entry points can be retrieved using
+-- 'alcProcAddress'. Entry points can be device specific, but are not context
+-- specific. Using 'Nothing' as the device does not guarantee that the entry
+-- point is returned, even if available for one of the available devices.
+
+alcProcAddress :: Maybe Device -> String -> GettableStateVar (FunPtr a)
+alcProcAddress maybeDevice funcName =
+ makeGettableStateVar .
+ withALCString funcName .
+ alcGetProcAddress . marshalDevice . maybe nullDevice id $ maybeDevice
foreign import CALLCONV unsafe "alcGetProcAddress"
- alcGetProcAddress_ :: Device -> Ptr ALubyte -> IO (FunPtr a)
+ alcGetProcAddress :: ALCdevice -> Ptr ALCchar -> IO (FunPtr a)
--------------------------------------------------------------------------------
-alcGetEnumValue :: Maybe Device -> String -> IO ALenum
-alcGetEnumValue device enumName =
- withALString enumName (alcGetEnumValue_ (fromDevice device))
+-- | Enumeration\/token values are device independent, but tokens defined for
+-- extensions might not be present for a given device. Using 'Nothing' as the
+-- device is legal, but only the tokens defined by the AL core are
+-- guaranteed. Availability of extension tokens depends on the ALC extension.
+
+alcEnumValue :: Maybe Device -> String -> GettableStateVar ALCenum
+alcEnumValue maybeDevice enumName =
+ makeGettableStateVar .
+ withALCString enumName .
+ alcGetEnumValue . marshalDevice . maybe nullDevice id $ maybeDevice
foreign import CALLCONV unsafe "alcGetEnumValue"
- alcGetEnumValue_ :: Device -> Ptr ALubyte -> IO ALenum
+ alcGetEnumValue :: ALCdevice -> Ptr ALCchar -> IO ALCenum
+
+--------------------------------------------------------------------------------
+
+-- | Contains the \"/major/./minor/\" specification revision for this implementation.
+
+alcVersion :: GettableStateVar String
+alcVersion =
+ makeGettableStateVar $
+ liftM2 makeVersionString
+ (getInteger Nothing MajorVersion)
+ (getInteger Nothing MinorVersion)
+
+makeVersionString :: ALCint -> ALCint -> String
+makeVersionString major minor = show major ++ "." ++ show minor
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC/Queries.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC/Queries.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC/Queries.hs 2004-01-03 04:03:09.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC/Queries.hs 1970-01-01 09:00:00.000000000 +0900
@@ -1,99 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module : Sound.OpenAL.ALC.Queries
--- Copyright : (c) Sven Panne 2003-2004
--- License : BSD-style (see the file libraries/OpenAL/LICENSE)
---
--- Maintainer : sven.panne@aedion.de
--- Stability : provisional
--- Portability : portable
---
---------------------------------------------------------------------------------
-
-module Sound.OpenAL.ALC.Queries (
- StringQuery(..), alcGetString, alcGetString_,
- IntQuery(..), marshalIntQuery, getInteger, getIntegerv,
- alcIsExtensionPresent
-) where
-
-import Control.Monad ( liftM, when )
-import Foreign
-import Sound.OpenAL.AL.BasicTypes ( ALubyte, ALint, ALenum, ALsizei )
-import Sound.OpenAL.AL.ALboolean ( ALboolean, unmarshalALboolean )
-import Sound.OpenAL.ALC.BasicTypes (
- Device, fromDevice, withALString, peekALString )
-
---------------------------------------------------------------------------------
-
-#include "HsOpenALConfig.h"
-
---------------------------------------------------------------------------------
-
-data StringQuery =
- DefaultDeviceSpecifier
- | DeviceSpecifier
- | Extensions
-
-marshalStringQuery :: StringQuery -> ALenum
-marshalStringQuery x = case x of
- DefaultDeviceSpecifier -> CONST_ALC_DEFAULT_DEVICE_SPECIFIER
- DeviceSpecifier -> CONST_ALC_DEVICE_SPECIFIER
- Extensions -> CONST_ALC_EXTENSIONS
-
---------------------------------------------------------------------------------
-
-alcGetString :: Maybe Device -> StringQuery -> IO String
-alcGetString device query = alcGetString_ device query >>= peekALString
-
-alcGetString_ :: Maybe Device -> StringQuery -> IO (Ptr ALubyte)
-alcGetString_ device = alcGetString__ (fromDevice device) . marshalStringQuery
-
-foreign import CALLCONV unsafe "alcGetString"
- alcGetString__ :: Device -> ALenum -> IO (Ptr ALubyte)
-
---------------------------------------------------------------------------------
-
-data IntQuery =
- MajorVersion
- | MinorVersion
- | AttributesSize
- | AllAttributes
-
-marshalIntQuery :: IntQuery -> ALenum
-marshalIntQuery x = case x of
- MajorVersion -> CONST_ALC_MAJOR_VERSION
- MinorVersion -> CONST_ALC_MINOR_VERSION
- AttributesSize -> CONST_ALC_ATTRIBUTES_SIZE
- AllAttributes -> CONST_ALC_ALL_ATTRIBUTES
-
---------------------------------------------------------------------------------
-
-getInteger :: Device -> IntQuery -> IO ALint
-getInteger device query = liftM head $ getIntegerv device query 1
-
--- We are extremely careful below to avoid segfaults in case that there is no
--- current context, an invalid device, etc.
-getIntegerv :: Device -> IntQuery -> Int -> IO [ALint]
-getIntegerv device query numALints =
- withArray (replicate numALints 0) $ \buf -> do
- let numBytes = fromIntegral (numALints * sizeOf (0 :: ALint))
- when (numALints > 0) $
- alcGetIntegerv device (marshalIntQuery query) numBytes buf
- peekArray numALints buf
-
-foreign import CALLCONV unsafe "alcGetIntegerv"
- alcGetIntegerv :: Device -> ALenum -> ALsizei -> Ptr ALint -> IO ()
-
---------------------------------------------------------------------------------
-
--- | Returns 'True' if the given ALC extension is present on the given device,
--- 'False' otherwise.
-
-alcIsExtensionPresent :: Maybe Device -> String -> IO Bool
-alcIsExtensionPresent device extensionName =
- liftM unmarshalALboolean $
- withALString extensionName (alcIsExtensionPresent_ (fromDevice device))
-
-foreign import CALLCONV unsafe "alcIsExtensionPresent"
- alcIsExtensionPresent_ :: Device -> Ptr ALubyte -> IO ALboolean
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC/QueryUtils.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC/QueryUtils.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC/QueryUtils.hs 1970-01-01 09:00:00.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC/QueryUtils.hs 2006-03-22 00:58:03.000000000 +0900
@@ -0,0 +1,122 @@
+-- #hide
+--------------------------------------------------------------------------------
+-- |
+-- Module : Sound.OpenAL.ALC.QueryUtils
+-- Copyright : (c) Sven Panne 2003-2005
+-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
+--
+-- Maintainer : sven.panne@aedion.de
+-- Stability : provisional
+-- Portability : portable
+--
+--------------------------------------------------------------------------------
+
+module Sound.OpenAL.ALC.QueryUtils (
+ StringQuery(..), getString, getStringRaw,
+ IntQuery(..), marshalIntQuery, getInteger, getIntegerv,
+ alcIsExtensionPresent
+) where
+
+import Control.Monad ( when )
+import Foreign.Marshal.Array ( withArray, peekArray )
+import Foreign.Ptr ( Ptr )
+import Graphics.Rendering.OpenGL.GL.StateVar (
+ GettableStateVar, makeGettableStateVar )
+import Sound.OpenAL.ALC.ALCboolean ( unmarshalALCboolean )
+import Sound.OpenAL.ALC.BasicTypes (
+ ALCboolean, ALCchar, ALCint, ALCenum, ALCsizei )
+import Sound.OpenAL.ALC.String ( withALCString, peekALCString )
+import Sound.OpenAL.Config ( Device, ALCdevice, nullDevice, marshalDevice )
+import Sound.OpenAL.Constants (
+ alc_DEFAULT_DEVICE_SPECIFIER, alc_DEVICE_SPECIFIER, alc_EXTENSIONS,
+ alc_CAPTURE_DEFAULT_DEVICE_SPECIFIER, alc_CAPTURE_DEVICE_SPECIFIER,
+ alc_ATTRIBUTES_SIZE, alc_ALL_ATTRIBUTES, alc_MAJOR_VERSION,
+ alc_MINOR_VERSION, alc_CAPTURE_SAMPLES )
+
+--------------------------------------------------------------------------------
+
+data StringQuery =
+ DefaultDeviceSpecifier
+ | DeviceSpecifier
+ | Extensions
+ | CaptureDefaultDeviceSpecifier
+ | CaptureDeviceSpecifier
+ | ALCErrorCategory ALCenum
+
+marshalStringQuery :: StringQuery -> ALCenum
+marshalStringQuery x = case x of
+ DefaultDeviceSpecifier -> alc_DEFAULT_DEVICE_SPECIFIER
+ DeviceSpecifier -> alc_DEVICE_SPECIFIER
+ Extensions -> alc_EXTENSIONS
+ CaptureDefaultDeviceSpecifier -> alc_CAPTURE_DEFAULT_DEVICE_SPECIFIER
+ CaptureDeviceSpecifier -> alc_CAPTURE_DEVICE_SPECIFIER
+ ALCErrorCategory e -> e
+
+--------------------------------------------------------------------------------
+
+getString :: Maybe Device -> StringQuery -> IO String
+getString device query = getStringRaw device query >>= peekALCString
+
+getStringRaw :: Maybe Device -> StringQuery -> IO (Ptr ALCchar)
+getStringRaw maybeDevice =
+ alcGetString (marshalMaybeDevice maybeDevice) . marshalStringQuery
+
+marshalMaybeDevice :: Maybe Device -> ALCdevice
+marshalMaybeDevice = marshalDevice . maybe nullDevice id
+
+foreign import CALLCONV unsafe "alcGetString"
+ alcGetString :: ALCdevice -> ALCenum -> IO (Ptr ALCchar)
+
+--------------------------------------------------------------------------------
+
+data IntQuery =
+ AttributesSize
+ | AllAttributes
+ | MajorVersion
+ | MinorVersion
+ | CaptureSamples
+
+marshalIntQuery :: IntQuery -> ALCenum
+marshalIntQuery x = case x of
+ AttributesSize -> alc_ATTRIBUTES_SIZE
+ AllAttributes -> alc_ALL_ATTRIBUTES
+ MajorVersion -> alc_MAJOR_VERSION
+ MinorVersion -> alc_MINOR_VERSION
+ CaptureSamples -> alc_CAPTURE_SAMPLES
+
+--------------------------------------------------------------------------------
+
+getInteger :: Maybe Device -> IntQuery -> IO ALCint
+getInteger maybeDevice query = fmap head $ getIntegerv maybeDevice query 1
+
+-- We are extremely careful below to avoid segfaults in case that there is no
+-- current context, an invalid device, etc.
+getIntegerv :: Maybe Device -> IntQuery -> ALCsizei -> IO [ALCint]
+getIntegerv maybeDevice query numALCints =
+ let n = fromIntegral numALCints
+ in withArray (replicate n 0) $ \buf -> do
+ when (numALCints > 0) $
+ alcGetIntegerv (marshalMaybeDevice maybeDevice)
+ (marshalIntQuery query) numALCints buf
+ peekArray n buf
+
+foreign import CALLCONV unsafe "alcGetIntegerv"
+ alcGetIntegerv :: ALCdevice -> ALCenum -> ALCsizei -> Ptr ALCint -> IO ()
+
+--------------------------------------------------------------------------------
+
+-- | To verify that a given extension is available for the current context and
+-- the device it is associated with, use 'alcIsExtensionPresent'. For invalid
+-- and unsupported string tokens it contains 'False'. Using 'Nothing' as the
+-- device is acceptable. The extension name is not case sensitive: The
+-- implementation will convert the name to all upper-case internally (and will
+-- express extension names in upper-case).
+
+alcIsExtensionPresent :: Maybe Device -> String -> GettableStateVar Bool
+alcIsExtensionPresent maybeDevice extensionName = makeGettableStateVar $
+ fmap unmarshalALCboolean $
+ withALCString extensionName $
+ alcIsExtensionPresent_ (marshalMaybeDevice maybeDevice)
+
+foreign import CALLCONV unsafe "alcIsExtensionPresent"
+ alcIsExtensionPresent_ :: ALCdevice -> Ptr ALCchar -> IO ALCboolean
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC/String.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC/String.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC/String.hs 1970-01-01 09:00:00.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC/String.hs 2006-03-22 00:58:03.000000000 +0900
@@ -0,0 +1,42 @@
+-- #hide
+--------------------------------------------------------------------------------
+-- |
+-- Module : Sound.OpenAL.ALC.String
+-- Copyright : (c) Sven Panne 2005
+-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
+--
+-- Maintainer : sven.panne@aedion.de
+-- Stability : provisional
+-- Portability : portable
+--
+--------------------------------------------------------------------------------
+
+module Sound.OpenAL.ALC.String (
+ withALCString, peekALCString, peekALCStrings
+) where
+
+import Foreign.C.String ( withCString, peekCString )
+import Foreign.Marshal.Array ( lengthArray0 )
+import Foreign.Ptr ( Ptr, castPtr, plusPtr )
+import Sound.OpenAL.ALC.BasicTypes ( ALCchar )
+
+--------------------------------------------------------------------------------
+
+-- AL uses "Ptr ALCchar" instead of "CString" for strings, so some wrappers
+-- are quite handy.
+
+withALCString :: String -> (Ptr ALCchar -> IO a) -> IO a
+withALCString str action = withCString str (action . castPtr)
+
+peekALCString :: Ptr ALCchar -> IO String
+peekALCString = peekCString . castPtr
+
+peekALCStrings :: Ptr ALCchar -> IO [String]
+peekALCStrings ptr = loop ptr []
+ where loop p strs = do
+ str <- peekALCString p
+ if str == ""
+ then return (reverse strs)
+ else do
+ len <- lengthArray0 0 p
+ loop (p `plusPtr` (len + 1)) (str : strs)
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALC.hs 2004-01-03 04:03:07.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALC.hs 2006-03-22 00:58:03.000000000 +0900
@@ -1,7 +1,7 @@
--------------------------------------------------------------------------------
-- |
-- Module : Sound.OpenAL.ALC
--- Copyright : (c) Sven Panne 2003-2004
+-- Copyright : (c) Sven Panne 2003-2005
-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
--
-- Maintainer : sven.panne@aedion.de
@@ -9,18 +9,27 @@
-- Portability : portable
--
-- This module corresponds to chapter 6 (AL Contexts and the ALC API) of the
--- OpenAL Specification and Reference (version 1.0).
+-- OpenAL Specification and Reference (version 1.1).
+--
+-- ALC is a portable API for managing OpenAL contexts, including resource
+-- sharing, locking, and unlocking. Within the core AL API the existence of a
+-- context is implied, but the context is not exposed. The context encapsulates
+-- the state of a given instance of the AL state machine.
--
--------------------------------------------------------------------------------
module Sound.OpenAL.ALC (
+ module Sound.OpenAL.ALC.BasicTypes,
module Sound.OpenAL.ALC.Device,
module Sound.OpenAL.ALC.Context,
module Sound.OpenAL.ALC.Extensions,
- module Sound.OpenAL.ALC.Errors
+ module Sound.OpenAL.ALC.Errors,
+ module Sound.OpenAL.ALC.Capture
) where
+import Sound.OpenAL.ALC.BasicTypes
import Sound.OpenAL.ALC.Device
import Sound.OpenAL.ALC.Context
import Sound.OpenAL.ALC.Extensions
import Sound.OpenAL.ALC.Errors
+import Sound.OpenAL.ALC.Capture
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALUT/Exception.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALUT/Exception.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALUT/Exception.hs 2004-11-28 00:39:32.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALUT/Exception.hs 1970-01-01 09:00:00.000000000 +0900
@@ -1,37 +0,0 @@
--- #hide
---------------------------------------------------------------------------------
--- |
--- Module : Sound.OpenAL.ALUT.Exception
--- Copyright : (c) Sven Panne 2003-2004
--- License : BSD-style (see the file libraries/OpenGL/LICENSE)
---
--- Maintainer : sven.panne@aedion.de
--- Stability : provisional
--- Portability : portable
---
--- This is a purely internal module to compensate for differences between
--- Haskell implementations.
---
---------------------------------------------------------------------------------
-
-module Sound.OpenAL.ALUT.Exception (
- bracket_, finally
-) where
-
-#ifdef __NHC__
-finally :: IO a -> IO b -> IO a
-a `finally` sequel = do
- r <- a
- sequel
- return r
-
-{-# INLINE bracket_ #-}
-bracket_ :: IO a -> IO b -> IO c -> IO c
-bracket_ before after thing = do
- before
- r <- thing
- after
- return r
-#else
-import Control.Exception ( bracket_, finally )
-#endif
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALUT/Initialization.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALUT/Initialization.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALUT/Initialization.hs 2004-11-28 00:39:32.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALUT/Initialization.hs 1970-01-01 09:00:00.000000000 +0900
@@ -1,40 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module : Sound.OpenAL.ALUT.Initialization
--- Copyright : (c) Sven Panne 2003-2004
--- License : BSD-style (see the file libraries/OpenAL/LICENSE)
---
--- Maintainer : sven.panne@aedion.de
--- Stability : provisional
--- Portability : portable
---
---------------------------------------------------------------------------------
-
-module Sound.OpenAL.ALUT.Initialization (
- runOpenAL
-) where
-
-import Graphics.Rendering.OpenGL.GL.StateVar ( HasGetter(get), HasSetter(($=)) )
-import Sound.OpenAL.ALUT.Exception ( bracket_ )
-import Sound.OpenAL.ALC.Context (
- createContext, destroyContext, currentContext, contextsDevice )
-import Sound.OpenAL.ALC.Device ( openDevice, closeDevice )
-
---------------------------------------------------------------------------------
-
-alutInit :: IO ()
-alutInit = do
- device <- openDevice Nothing
- context <- createContext device []
- currentContext $= Just context
-
-alutExit :: IO ()
-alutExit = get currentContext >>= maybe (return ()) cleanupContext
- where cleanupContext context = do
- maybeDevice <- get (contextsDevice context)
- currentContext $= Nothing
- destroyContext context
- maybe (return ()) closeDevice maybeDevice
-
-runOpenAL :: IO a -> IO a
-runOpenAL = bracket_ alutInit alutExit
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALUT/WAV.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALUT/WAV.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALUT/WAV.hs 2004-05-12 04:36:48.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALUT/WAV.hs 1970-01-01 09:00:00.000000000 +0900
@@ -1,70 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module : Sound.OpenAL.ALUT.WAV
--- Copyright : (c) Sven Panne 2003-2004
--- License : BSD-style (see the file libraries/OpenAL/LICENSE)
---
--- Maintainer : sven.panne@aedion.de
--- Stability : provisional
--- Portability : portable
---
---------------------------------------------------------------------------------
-
-module Sound.OpenAL.ALUT.WAV (
- withWAVFile, withWAVMemory
-) where
-
-import Control.Monad ( liftM )
-import Foreign.C.String ( withCString )
-import Foreign.Marshal.Alloc ( alloca )
-import Foreign.Storable ( Storable(peek) )
-import Foreign.Ptr ( Ptr, castPtr )
-import Sound.OpenAL.AL.BasicTypes ( ALbyte, ALsizei, ALenum )
-import Sound.OpenAL.AL.ALboolean ( ALboolean, unmarshalALboolean )
-import Sound.OpenAL.AL.Buffer ( BufferData(..) )
-import Sound.OpenAL.AL.Format ( marshalFormat, unmarshalFormat )
-import Sound.OpenAL.ALUT.Exception ( finally )
-
---------------------------------------------------------------------------------
-
-withWAVFile :: FilePath -> (BufferData a -> Bool -> IO b) -> IO b
-withWAVFile fileName action =
- withCString fileName $ \fileNameBuf ->
- withWAVInternal (alutLoadWAVFile (castPtr fileNameBuf)) action
-
-foreign import CALLCONV unsafe "alutLoadWAVFile"
- alutLoadWAVFile :: Ptr ALbyte -> Loader a
-
-withWAVMemory :: Ptr ALbyte -> (BufferData a -> Bool -> IO b) -> IO b
-withWAVMemory mem action = withWAVInternal (alutLoadWAVMemory mem) action
-
-foreign import CALLCONV unsafe "alutLoadWAVMemory"
- alutLoadWAVMemory :: Ptr ALbyte -> Loader a
-
-type Loader a = Ptr ALenum -> Ptr (Ptr a) -> Ptr ALsizei -> Ptr ALsizei
- -> Ptr ALboolean -> IO ()
-
-withWAVInternal :: Loader a -> (BufferData a -> Bool -> IO b) -> IO b
-withWAVInternal loader action = do
- (bufferData, loop) <- alloca $ \formatBuf ->
- alloca $ \rawBuf ->
- alloca $ \sizeBuf ->
- alloca $ \frequencyBuf ->
- alloca $ \loopBuf -> do
- loader formatBuf rawBuf sizeBuf frequencyBuf loopBuf
- format <- liftM unmarshalFormat $ peek formatBuf
- raw <- peek rawBuf
- size <- peek sizeBuf
- frequency <- peek frequencyBuf
- loop <- liftM unmarshalALboolean $ peek loopBuf
- return (BufferData format raw size frequency, loop)
- action bufferData loop `finally` unloadWAV bufferData
-
---------------------------------------------------------------------------------
-
-unloadWAV :: BufferData a -> IO ()
-unloadWAV (BufferData format raw size frequency) =
- alutUnloadWAV (marshalFormat format) raw size frequency
-
-foreign import CALLCONV unsafe "alutUnloadWAV"
- alutUnloadWAV :: ALenum -> Ptr a -> ALsizei -> ALsizei -> IO ()
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALUT.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALUT.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/ALUT.hs 2004-01-03 04:03:07.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/ALUT.hs 1970-01-01 09:00:00.000000000 +0900
@@ -1,19 +0,0 @@
---------------------------------------------------------------------------------
--- |
--- Module : Sound.OpenAL.ALUT
--- Copyright : (c) Sven Panne 2003-2004
--- License : BSD-style (see the file libraries/OpenAL/LICENSE)
---
--- Maintainer : sven.panne@aedion.de
--- Stability : provisional
--- Portability : portable
---
---------------------------------------------------------------------------------
-
-module Sound.OpenAL.ALUT (
- module Sound.OpenAL.ALUT.Initialization,
- module Sound.OpenAL.ALUT.WAV
-) where
-
-import Sound.OpenAL.ALUT.Initialization
-import Sound.OpenAL.ALUT.WAV
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/Config.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/Config.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/Config.hs 1970-01-01 09:00:00.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/Config.hs 2006-03-22 00:58:03.000000000 +0900
@@ -0,0 +1,233 @@
+-- #hide
+--------------------------------------------------------------------------------
+-- |
+-- Module : Sound.OpenAL.Config
+-- Copyright : (c) Sven Panne 2005
+-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
+--
+-- Maintainer : sven.panne@aedion.de
+-- Stability : provisional
+-- Portability : portable
+--
+-- This purely internal module defines the platform-specific stuff which has
+-- been figured out by configure.
+--
+--------------------------------------------------------------------------------
+
+module Sound.OpenAL.Config (
+ -- AL types
+ ALboolean, ALchar, ALbyte, ALubyte, ALshort, ALushort, ALint, ALuint,
+ ALsizei, ALenum, ALfloat, ALdouble,
+
+ -- ALC types
+ ALCboolean, ALCchar, ALCbyte, ALCubyte, ALCshort, ALCushort, ALCint, ALCuint,
+ ALCsizei, ALCenum, ALCfloat, ALCdouble,
+
+ -- Device stuff
+ ALCdevice, Device, nullDevice, marshalDevice, unmarshalDevice, closeDevice,
+
+ -- Context stuff
+ ALCcontext, Context, nullContext, marshalContext, unmarshalContext,
+ alcProcessContext, alcMakeContextCurrent, alcDestroyContext
+) where
+
+import Data.Int
+import Data.Word
+import Foreign.Ptr ( Ptr, nullPtr )
+
+--------------------------------------------------------------------------------
+
+#include "HsOpenALConfig.h"
+
+--------------------------------------------------------------------------------
+-- AL types
+
+-- | 8-bit boolean
+type ALboolean = HTYPE_ALBOOLEAN
+
+-- | Character
+type ALchar = HTYPE_ALCHAR
+
+-- | Signed 8-bit 2\'s complement integer
+type ALbyte = HTYPE_ALBYTE
+
+-- | Unsigned 8-bit integer
+type ALubyte = HTYPE_ALUBYTE
+
+-- | Signed 16-bit 2\'s complement integer
+type ALshort = HTYPE_ALSHORT
+
+-- | Unsigned 16-bit integer
+type ALushort = HTYPE_ALUSHORT
+
+-- | Signed 32-bit 2\'s complement integer
+type ALint = HTYPE_ALINT
+
+-- | Unsigned 32-bit integer
+type ALuint = HTYPE_ALUINT
+
+-- | Non-negatitve 32-bit binary integer size
+type ALsizei = HTYPE_ALSIZEI
+
+-- | Enumerated 32-bit value
+type ALenum = HTYPE_ALENUM
+
+-- | 32-bit IEEE754 floating-point
+type ALfloat = HTYPE_ALFLOAT
+
+-- | 64-bit IEEE754 floating-point
+type ALdouble = HTYPE_ALDOUBLE
+
+--------------------------------------------------------------------------------
+-- ALC types
+
+-- | 8-bit boolean
+type ALCboolean = HTYPE_ALCBOOLEAN
+
+-- | Character
+type ALCchar = HTYPE_ALCCHAR
+
+-- | Signed 8-bit 2\'s complement integer
+type ALCbyte = HTYPE_ALCBYTE
+
+-- | Unsigned 8-bit integer
+type ALCubyte = HTYPE_ALCUBYTE
+
+-- | Signed 16-bit 2\'s complement integer
+type ALCshort = HTYPE_ALCSHORT
+
+-- | Unsigned 16-bit integer
+type ALCushort = HTYPE_ALCUSHORT
+
+-- | Signed 32-bit 2\'s complement integer
+type ALCint = HTYPE_ALCINT
+
+-- | Unsigned 32-bit integer
+type ALCuint = HTYPE_ALCUINT
+
+-- | Non-negatitve 32-bit binary integer size
+type ALCsizei = HTYPE_ALCSIZEI
+
+-- | Enumerated 32-bit value
+type ALCenum = HTYPE_ALCENUM
+
+-- | 32-bit IEEE754 floating-point
+type ALCfloat = HTYPE_ALCFLOAT
+
+-- | 64-bit IEEE754 floating-point
+type ALCdouble = HTYPE_ALCDOUBLE
+
+--------------------------------------------------------------------------------
+-- In OpenAL 1.1, alcCloseDevice() returns an ALCboolean, before it was void.
+-- To break a dependency cycle, we have to define the Device type here, too.
+
+-- | The abstract device type.
+
+newtype Device = Device ALCdevice
+ deriving ( Eq, Ord, Show )
+
+newtype ALCdevice = ALCdevice (Ptr ALCdevice)
+ deriving ( Eq, Ord, Show )
+
+nullDevice :: Device
+nullDevice = Device (ALCdevice nullPtr)
+
+marshalDevice :: Device -> ALCdevice
+marshalDevice (Device device) = device
+
+unmarshalDevice :: ALCdevice -> Maybe Device
+unmarshalDevice device =
+ if device == marshalDevice nullDevice then Nothing else Just (Device device)
+
+-- | 'closeDevice' allows the application (i.e. the client program) to
+-- disconnect from a device (i.e. the server). It returns 'True' for success and
+-- 'False' for failure. Once closed, the 'Device' is invalid.
+--
+-- /Note:/ Older OpenAL implementations will always report a success!
+
+closeDevice :: Device -> IO Bool
+
+#if ALCCLOSEDEVICE_VOID
+
+closeDevice = fmap (const True) . alcCloseDevice . marshalDevice
+
+foreign import CALLCONV unsafe "alcCloseDevice"
+ alcCloseDevice :: ALCdevice -> IO ()
+
+#else
+
+-- inlined unmarshalALCboolean here to break dependency cycle
+closeDevice = fmap (/= CONST_ALC_FALSE) . alcCloseDevice . marshalDevice
+
+foreign import CALLCONV unsafe "alcCloseDevice"
+ alcCloseDevice :: ALCdevice -> IO ALCboolean
+
+#endif
+
+--------------------------------------------------------------------------------
+-- In OpenAL 1.1, alcProcessContext() returns void for all platforms, before it
+-- returned ALCcontext* on Linux. To break a dependency cycle, we have to define
+-- the Context type here, too.
+
+-- | The abstract context type.
+
+data Context = Context ALCcontext
+ deriving ( Eq, Ord, Show )
+
+newtype ALCcontext = ALCcontext (Ptr ALCcontext)
+ deriving ( Eq, Ord, Show )
+
+nullContext :: Context
+nullContext = Context (ALCcontext nullPtr)
+
+marshalContext :: Context -> ALCcontext
+marshalContext (Context context) = context
+
+unmarshalContext :: ALCcontext -> Maybe Context
+unmarshalContext context =
+ if context == marshalContext nullContext then Nothing else Just (Context context)
+
+#if ALCPROCESSCONTEXT_VOID
+
+foreign import CALLCONV unsafe "alcProcessContext"
+ alcProcessContext :: ALCcontext -> IO ()
+
+#else
+
+foreign import CALLCONV unsafe "alcProcessContext"
+ alcProcessContext :: ALCcontext -> IO ALCcontext
+
+#endif
+
+--------------------------------------------------------------------------------
+-- In OpenAL 1.1, alcMakeContextCurrent() returns void, before it was ALCenum on
+-- Linux and ALCboolean on other platforms. Currently we default to ALCenum in
+-- the latter case.
+
+#if ALCMAKECONTEXTCURRENT_VOID
+
+foreign import CALLCONV unsafe "alcMakeContextCurrent"
+ alcMakeContextCurrent :: ALCcontext -> IO ()
+
+#else
+
+foreign import CALLCONV unsafe "alcMakeContextCurrent"
+ alcMakeContextCurrent :: ALCcontext -> IO ALCenum
+
+#endif
+
+--------------------------------------------------------------------------------
+-- In OpenAL 1.1, alcDestroyContext() returns void, before it returned ALCenum
+-- on Linux.
+
+#if ALCDESTROYCONTEXT_VOID
+
+foreign import CALLCONV unsafe "alcDestroyContext"
+ alcDestroyContext :: ALCcontext -> IO ()
+
+#else
+
+foreign import CALLCONV unsafe "alcDestroyContext"
+ alcDestroyContext :: ALCcontext -> IO ALCenum
+
+#endif
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/Constants.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/Constants.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL/Constants.hs 1970-01-01 09:00:00.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL/Constants.hs 2006-03-22 00:58:03.000000000 +0900
@@ -0,0 +1,166 @@
+-- #hide
+--------------------------------------------------------------------------------
+-- |
+-- Module : Sound.OpenAL.Constants
+-- Copyright : (c) Sven Panne 2005
+-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
+--
+-- Maintainer : sven.panne@aedion.de
+-- Stability : provisional
+-- Portability : portable
+--
+-- This purely internal module defines all AL\/ALC constants, which have been
+-- figured out by configure. In contrast to OpenGL and GLUT, these constants
+-- varied on different platforms in the past and have evolved quite a bit.
+--
+--------------------------------------------------------------------------------
+
+module Sound.OpenAL.Constants where
+
+import Sound.OpenAL.Config (
+ ALboolean, ALint, ALenum, ALCboolean, ALCint, ALCenum )
+
+--------------------------------------------------------------------------------
+
+#include "HsOpenALConfig.h"
+
+--------------------------------------------------------------------------------
+
+al_FALSE, al_TRUE :: ALboolean
+al_FALSE = CONST_AL_FALSE
+al_TRUE = CONST_AL_TRUE
+
+al_NO_ERROR, al_INVALID_NAME, al_INVALID_ENUM, al_INVALID_VALUE,
+ al_INVALID_OPERATION, al_OUT_OF_MEMORY :: ALenum
+al_NO_ERROR = CONST_AL_NO_ERROR
+al_INVALID_NAME = CONST_AL_INVALID_NAME
+al_INVALID_ENUM = CONST_AL_INVALID_ENUM
+al_INVALID_VALUE = CONST_AL_INVALID_VALUE
+al_INVALID_OPERATION = CONST_AL_INVALID_OPERATION
+al_OUT_OF_MEMORY = CONST_AL_OUT_OF_MEMORY
+
+--------------------------------------------------------------------------------
+
+al_DISTANCE_MODEL, al_DOPPLER_FACTOR, al_SPEED_OF_SOUND :: ALenum
+al_DISTANCE_MODEL = CONST_AL_DISTANCE_MODEL
+al_DOPPLER_FACTOR = CONST_AL_DOPPLER_FACTOR
+al_SPEED_OF_SOUND = CONST_AL_SPEED_OF_SOUND
+
+al_VERSION, al_RENDERER, al_VENDOR, al_EXTENSIONS :: ALenum
+al_VERSION = CONST_AL_VERSION
+al_RENDERER = CONST_AL_RENDERER
+al_VENDOR = CONST_AL_VENDOR
+al_EXTENSIONS = CONST_AL_EXTENSIONS
+
+al_NONE, al_INVERSE_DISTANCE, al_INVERSE_DISTANCE_CLAMPED, al_LINEAR_DISTANCE,
+ al_LINEAR_DISTANCE_CLAMPED, al_EXPONENT_DISTANCE,
+ al_EXPONENT_DISTANCE_CLAMPED :: ALenum
+al_NONE = CONST_AL_NONE
+al_INVERSE_DISTANCE = CONST_AL_INVERSE_DISTANCE
+al_INVERSE_DISTANCE_CLAMPED = CONST_AL_INVERSE_DISTANCE_CLAMPED
+al_LINEAR_DISTANCE = CONST_AL_LINEAR_DISTANCE
+al_LINEAR_DISTANCE_CLAMPED = CONST_AL_LINEAR_DISTANCE_CLAMPED
+al_EXPONENT_DISTANCE = CONST_AL_EXPONENT_DISTANCE
+al_EXPONENT_DISTANCE_CLAMPED = CONST_AL_EXPONENT_DISTANCE_CLAMPED
+
+--------------------------------------------------------------------------------
+
+al_POSITION, al_VELOCITY, al_GAIN :: ALenum
+al_POSITION = CONST_AL_POSITION
+al_VELOCITY = CONST_AL_VELOCITY
+al_GAIN = CONST_AL_GAIN
+
+al_ORIENTATION :: ALenum
+al_ORIENTATION = CONST_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 :: ALenum
+al_SOURCE_RELATIVE = CONST_AL_SOURCE_RELATIVE
+al_SOURCE_TYPE = CONST_AL_SOURCE_TYPE
+al_LOOPING = CONST_AL_LOOPING
+al_BUFFER = CONST_AL_BUFFER
+al_BUFFERS_QUEUED = CONST_AL_BUFFERS_QUEUED
+al_BUFFERS_PROCESSED = CONST_AL_BUFFERS_PROCESSED
+al_MIN_GAIN = CONST_AL_MIN_GAIN
+al_MAX_GAIN = CONST_AL_MAX_GAIN
+al_REFERENCE_DISTANCE = CONST_AL_REFERENCE_DISTANCE
+al_ROLLOFF_FACTOR = CONST_AL_ROLLOFF_FACTOR
+al_MAX_DISTANCE = CONST_AL_MAX_DISTANCE
+al_PITCH = CONST_AL_PITCH
+al_DIRECTION = CONST_AL_DIRECTION
+al_CONE_INNER_ANGLE = CONST_AL_CONE_INNER_ANGLE
+al_CONE_OUTER_ANGLE = CONST_AL_CONE_OUTER_ANGLE
+al_CONE_OUTER_GAIN = CONST_AL_CONE_OUTER_GAIN
+al_SEC_OFFSET = CONST_AL_SEC_OFFSET
+al_SAMPLE_OFFSET = CONST_AL_SAMPLE_OFFSET
+al_BYTE_OFFSET = CONST_AL_BYTE_OFFSET
+al_SOURCE_STATE = CONST_AL_SOURCE_STATE
+
+al_UNDETERMINED, al_STATIC, al_STREAMING :: ALint
+al_UNDETERMINED = CONST_AL_UNDETERMINED
+al_STATIC = CONST_AL_STATIC
+al_STREAMING = CONST_AL_STREAMING
+
+al_INITIAL, al_PLAYING, al_PAUSED, al_STOPPED :: ALint
+al_INITIAL = CONST_AL_INITIAL
+al_PLAYING = CONST_AL_PLAYING
+al_PAUSED = CONST_AL_PAUSED
+al_STOPPED = CONST_AL_STOPPED
+
+--------------------------------------------------------------------------------
+
+al_FREQUENCY, al_SIZE, al_BITS, al_CHANNELS :: ALenum
+al_FREQUENCY = CONST_AL_FREQUENCY
+al_SIZE = CONST_AL_SIZE
+al_BITS = CONST_AL_BITS
+al_CHANNELS = CONST_AL_CHANNELS
+
+al_FORMAT_MONO8, al_FORMAT_MONO16, al_FORMAT_STEREO8,
+ al_FORMAT_STEREO16 :: ALenum
+al_FORMAT_MONO8 = CONST_AL_FORMAT_MONO8
+al_FORMAT_MONO16 = CONST_AL_FORMAT_MONO16
+al_FORMAT_STEREO8 = CONST_AL_FORMAT_STEREO8
+al_FORMAT_STEREO16 = CONST_AL_FORMAT_STEREO16
+
+--------------------------------------------------------------------------------
+
+alc_FALSE, alc_TRUE :: ALCboolean
+alc_FALSE = CONST_ALC_FALSE
+alc_TRUE = CONST_ALC_TRUE
+
+alc_FREQUENCY, alc_REFRESH, alc_SYNC, alc_MONO_SOURCES,
+ alc_STEREO_SOURCES :: ALCint
+alc_FREQUENCY = CONST_ALC_FREQUENCY
+alc_REFRESH = CONST_ALC_REFRESH
+alc_SYNC = CONST_ALC_SYNC
+alc_MONO_SOURCES = CONST_ALC_MONO_SOURCES
+alc_STEREO_SOURCES = CONST_ALC_STEREO_SOURCES
+
+alc_NO_ERROR, alc_INVALID_DEVICE, alc_INVALID_CONTEXT, alc_INVALID_ENUM,
+ alc_INVALID_VALUE, alc_INVALID_OPERATION, alc_OUT_OF_MEMORY :: ALCenum
+alc_NO_ERROR = CONST_ALC_NO_ERROR
+alc_INVALID_DEVICE = CONST_ALC_INVALID_DEVICE
+alc_INVALID_CONTEXT = CONST_ALC_INVALID_CONTEXT
+alc_INVALID_ENUM = CONST_ALC_INVALID_ENUM
+alc_INVALID_VALUE = CONST_ALC_INVALID_VALUE
+alc_INVALID_OPERATION = CONST_ALC_INVALID_OPERATION
+alc_OUT_OF_MEMORY = CONST_ALC_OUT_OF_MEMORY
+
+alc_DEFAULT_DEVICE_SPECIFIER, alc_DEVICE_SPECIFIER, alc_EXTENSIONS,
+ alc_CAPTURE_DEFAULT_DEVICE_SPECIFIER, alc_CAPTURE_DEVICE_SPECIFIER :: ALCenum
+alc_DEFAULT_DEVICE_SPECIFIER = CONST_ALC_DEFAULT_DEVICE_SPECIFIER
+alc_DEVICE_SPECIFIER = CONST_ALC_DEVICE_SPECIFIER
+alc_EXTENSIONS = CONST_ALC_EXTENSIONS
+alc_CAPTURE_DEFAULT_DEVICE_SPECIFIER= CONST_ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER
+alc_CAPTURE_DEVICE_SPECIFIER = CONST_ALC_CAPTURE_DEVICE_SPECIFIER
+
+alc_ATTRIBUTES_SIZE, alc_ALL_ATTRIBUTES, alc_MAJOR_VERSION, alc_MINOR_VERSION,
+ alc_CAPTURE_SAMPLES :: ALCenum
+alc_ATTRIBUTES_SIZE = CONST_ALC_ATTRIBUTES_SIZE
+alc_ALL_ATTRIBUTES = CONST_ALC_ALL_ATTRIBUTES
+alc_MAJOR_VERSION = CONST_ALC_MAJOR_VERSION
+alc_MINOR_VERSION = CONST_ALC_MINOR_VERSION
+alc_CAPTURE_SAMPLES = CONST_ALC_CAPTURE_SAMPLES
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL.hs ghc-6.4.2/libraries/OpenAL/Sound/OpenAL.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/Sound/OpenAL.hs 2004-01-03 04:03:07.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/Sound/OpenAL.hs 2006-03-22 00:58:03.000000000 +0900
@@ -1,23 +1,181 @@
--------------------------------------------------------------------------------
-- |
-- Module : Sound.OpenAL
--- Copyright : (c) Sven Panne 2003-2004
+-- Copyright : (c) Sven Panne 2003-2005
-- License : BSD-style (see the file libraries/OpenAL/LICENSE)
---
+--
-- Maintainer : sven.panne@aedion.de
-- Stability : provisional
-- Portability : portable
--
--- A convenience module, combining the Haskell bindings for AL, ALC and ALUT.
+-- A convenience module, combining the Haskell bindings for AL and ALC.
--
--------------------------------------------------------------------------------
module Sound.OpenAL (
+ -- * A Brief History of OpenAL
+ -- $ABriefHistoryOfOpenAL
+
+ -- * What is the OpenAL Audio System?
+ -- $WhatIsTheOpenALAudioSystem
+
+ -- * Different Views of OpenAL
+
+ -- ** Programmer\'s View of OpenAL
+ -- $ProgrammersViewOfOpenAL
+
+ -- ** Implementor\'s View of OpenAL
+ -- $ImplementorsViewOfOpenAL
+
+ -- ** The Specification\'s View of OpenAL
+ -- $TheSpecificationsViewOfOpenAL
+
+ -- * Legal stuff
+ -- $LegalStuff
+
module Sound.OpenAL.AL
, module Sound.OpenAL.ALC
- , module Sound.OpenAL.ALUT
+
+ -- * Convenience Re-exports from the OpenGL Package
+ , module Graphics.Rendering.OpenGL.GL.StateVar
+ , ObjectName(..), Vector3(..), Vertex3(..)
) where
import Sound.OpenAL.AL
import Sound.OpenAL.ALC
-import Sound.OpenAL.ALUT
+
+import Graphics.Rendering.OpenGL.GL.StateVar
+import Graphics.Rendering.OpenGL.GL.BufferObjects ( ObjectName(..) )
+import Graphics.Rendering.OpenGL.GL.CoordTrans ( Vector3(..) )
+import Graphics.Rendering.OpenGL.GL.VertexSpec ( Vertex3(..) )
+
+--------------------------------------------------------------------------------
+-- $ABriefHistoryOfOpenAL
+-- The first discussions about implementing OpenAL as an audio API complimentary
+-- to OpenGL started around 1998. There were a few aborted attempts at creating
+-- the headers and a specification, but by late 1999 Loki Entertainment Software
+-- was in need for an API of exactly this type and pursued both a specification
+-- and a Linux implementation. At around that time, Loki started talking with
+-- Creative Labs about standardizing the API and expanding platform support. The
+-- OpenAL 1.0 specification was released in early 2000 and compliant OpenAL
+-- libraries were released in the same year for Linux, MacOS 8\/9, Windows, and
+-- BeOS. Loki Entertainment also shipped several games using OpenAL in 2000:
+-- Heavy Gear 2 and Heretic 2 (both under Linux). In 2001, Creative Labs
+-- released the first hardware-accelerated OpenAL libraries. The libraries
+-- supported the SoundBlaster Live on MacOS 8\/9 and Windows.
+--
+-- Since 2001, there has been continuous improvement in OpenAL. Some platforms
+-- are less relevant than in 2000 (BeOS and MacOS 8\/9 for instance), but more
+-- platforms have been added as well (BSD, Solaris, IRIX, Mac OS X, and the
+-- popular console gaming platforms). Hardware support is enabled for many
+-- Creative and NVIDIA audio devices under Windows as well.
+--
+-- In terms of product support, OpenAL has been used in a large number of titles
+-- over the years, on many platforms (for a list of many of the titles, see
+-- <http://www.openal.org/titles.html>).
+
+--------------------------------------------------------------------------------
+-- $WhatIsTheOpenALAudioSystem
+-- OpenAL (for /Open Audio Library/) is a software interface to audio hardware.
+-- The interface consists of a number of functions that allow a programmer to
+-- specify the objects and operations in producing high-quality audio output,
+-- specifically multichannel output of 3D arrangements of sound sources around a
+-- listener.
+--
+-- The OpenAL API is designed to be cross-platform and easy to use. It resembles
+-- the OpenGL API in coding style and conventions. OpenAL uses a syntax
+-- resembling that of OpenGL where applicable. For more information on OpenGL,
+-- see <http://www.opengl.org/> and the "Graphics.Rendering.OpenGL" module.
+--
+-- OpenAL is foremost a means to generate audio in a simulated three-dimensional
+-- space. Consequently, legacy audio concepts such as panning and left\/right
+-- channels are not directly supported. OpenAL does include extensions
+-- compatible with the IA-SIG 3D Level 1 and Level 2 rendering guidelines to
+-- handle sound-source directivity and distancerelated attenuation and Doppler
+-- effects, as well as environmental effects such as reflection, obstruction,
+-- transmission, reverberation. For more information on IA-SIG 3D, see
+-- <http://www.iasig.org/wg/closed/3dwg/3dwg.shtml>.
+--
+-- Like OpenGL, the OpenAL core API has no notion of an explicit rendering
+-- context, and operates on an implied current OpenAL Context. Unlike the OpenGL
+-- specification, the OpenAL specification includes both the core API (the
+-- actual OpenAL API, see "Sound.OpenAL.AL") and the operating system bindings
+-- of the ALC API (the /Audio Library Context/, see "Sound.OpenAL.ALC"). Unlike
+-- OpenGL\'s GLX, WGL and other OS-specific bindings, the ALC API is portable
+-- across platforms as well.
+
+--------------------------------------------------------------------------------
+-- $ProgrammersViewOfOpenAL
+-- To the programmer, OpenAL is a set of commands that allow the specification
+-- of sound sources and a listener in three dimensions, combined with commands
+-- that control how these sound sources are rendered into the output buffer. The
+-- effect of OpenAL commands is not guaranteed to be immediate, as there are
+-- latencies depending on the implementation, but ideally such latency should
+-- not be noticeable to the user.
+--
+-- A typical program that uses OpenAL begins with calls to open a sound device
+-- which is used to process output and play it on attached hardware (speakers or
+-- headphones). Then, calls are made to allocate an AL context and associate it
+-- with the device. Once an AL context is allocated, the programmer is free to
+-- issue AL commands. Some calls are used to render sources (point and
+-- directional sources, looping or not), while others affect the rendering of
+-- these sources including how they are attenuated by distance and relative
+-- orientation.
+
+--------------------------------------------------------------------------------
+-- $ImplementorsViewOfOpenAL
+-- To the implementor, OpenAL is a set of commands that affect the operation of
+-- CPU and sound hardware. If the hardware consists only of an addressable
+-- output buffer, then OpenAL must be implemented almost entirely on the host
+-- CPU. In some cases audio hardware provides DSP-based and other acceleration
+-- in various degrees. The OpenAL implementor\'s task is to provide the CPU
+-- software interface while dividing the work for each AL command between the
+-- CPU and the audio hardware. This division should be tailored to the available
+-- audio hardware to obtain optimum performance in carrying out AL calls.
+--
+-- OpenAL maintains a considerable amount of state information. This state
+-- controls how the sources are rendered into the output buffer. Some of this
+-- state is directly available to the user: he or she can make calls to obtain
+-- its value. Some of it, however, is visible only by the effect it has on what
+-- is rendered. One of the main goals of the OpenAL specification is to make
+-- OpenAL state information explicit, to elucidate how it changes, and to
+-- indicate what its effects are.
+
+--------------------------------------------------------------------------------
+-- $TheSpecificationsViewOfOpenAL
+-- The OpenAL specification (see <http://www.openal.org/documentation.html>)
+-- views OpenAL as a state machine that controls a multichannel processing
+-- system to synthesize a digital stream, passing sample data through a chain of
+-- parametrized digital audio signal processing operations. This model should
+-- engender a specification that satisfies the needs of both programmers and
+-- implementors. It does not, however, necessarily provide a model for
+-- implementation. Any proper implementation must produce results conforming to
+-- those produced by the methods specified in the OpenAL specification, but
+-- there may be ways to carry out a particular computation that are more
+-- efficient than the one specified.
+
+--------------------------------------------------------------------------------
+-- $LegalStuff
+-- The documentation is more or less based upon the OpenAL 1.1 Specification and
+-- Reference, which is in turn based upon the older OpenAL Specification and
+-- Reference (1.0), published in June 2000. Both copyright notices are presented
+-- below:
+--
+-- Version 1.1: Published June 2005, Copyright (c) 2005 by authors
+--
+-- Version 1.0 Draft Edition: Published June 2000, Copyright (c) 1999-2000 by
+-- Loki Software
+--
+-- Permission is granted to make and distribute verbatim copies of this manual
+-- provided the copyright notice and this permission notice are preserved on all
+-- copies. Permission is granted to copy and distribute translations of this
+-- manual into another language, under the above conditions for modified
+-- versions, except that this permission notice may be stated in a translation
+-- approved by the copyright owners.
+--
+-- BeOS is a trademark of PalmSource, Inc. Linux is a trademark of Linus
+-- Torvalds. Macintosh and Apple are trademarks of Apple Computer, Inc. OpenAL
+-- is a trademark of Creative Labs, Inc. OpenGL is a trademark of Silicon
+-- Graphics, Inc. UNIX is a trademark of X\/Open Group. Windows is a trademark
+-- of Microsoft Corp. X Window System is a trademark of X Consortium, Inc. All
+-- other trademarks are property of their respective owners.
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/aclocal.m4 ghc-6.4.2/libraries/OpenAL/aclocal.m4
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/aclocal.m4 2004-11-22 07:53:36.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/aclocal.m4 2006-03-22 00:58:03.000000000 +0900
@@ -1,7 +1,7 @@
# FPTOOLS_CHECK_HTYPE(TYPE [, DEFAULT_VALUE, [, VALUE-FOR-CROSS-COMPILATION])
#
# This test should *really* be rewritten!!!
-AC_DEFUN(FPTOOLS_CHECK_HTYPE,
+AC_DEFUN([FPTOOLS_CHECK_HTYPE],
[changequote(<<, >>)dnl
dnl The name to #define.
define(<<AC_TYPE_NAME>>, translit(htype_$1, [a-z *], [A-Z_P]))dnl
@@ -59,6 +59,12 @@
# include <OpenGL/gl.h>
#endif
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
#if defined(HAVE_AL_ALC_H)
# include <AL/alc.h>
#elif defined(HAVE_OPENAL_ALC_H)
@@ -87,8 +93,8 @@
exit(0);
}]])],[AC_CV_NAME=`cat conftestval`],
[ifelse([$2], , [AC_CV_NAME=NotReallyAType; AC_CV_NAME_supported=no], [AC_CV_NAME=$2])],
-[ifelse([$3], , [AC_CV_NAME=NotReallyATypeCross; AC_CV_NAME_supported=no], [AC_CV_NAME=$3])])]) dnl
-CPPFLAGS="$fp_check_htype_save_cppflags"
+[ifelse([$3], , [AC_CV_NAME=NotReallyATypeCross; AC_CV_NAME_supported=no], [AC_CV_NAME=$3])])
+CPPFLAGS="$fp_check_htype_save_cppflags"]) dnl
if test "$AC_CV_NAME_supported" = yes; then
AC_MSG_RESULT($AC_CV_NAME)
AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [Define to Haskell type for $1])
@@ -100,6 +106,7 @@
undefine([AC_CV_NAME_supported])dnl
])
+
# FP_COMPUTE_INT(EXPRESSION, VARIABLE, INCLUDES, IF-FAILS)
# ---------------------------------------------------------
# Assign VARIABLE the value of the compile-time EXPRESSION using INCLUDES for
@@ -113,6 +120,7 @@
[_AC_COMPUTE_INT([$1], [$2], [$3], [$4])[]dnl
])# FP_COMPUTE_INT
+
# FP_CHECK_CONST(EXPRESSION, [INCLUDES = DEFAULT-INCLUDES], [VALUE-IF-FAIL = -1])
# -------------------------------------------------------------------------------
# Defines CONST_EXPRESSION to the value of the compile-time EXPRESSION, using
@@ -141,7 +149,7 @@
# FP_CHECK_CONSTS(EXPRESSION..., [INCLUDES = DEFAULT-INCLUDES], [VALUE-IF-FAIL = -1])
# -----------------------------------------------------------------------------------
# List version of FP_CHECK_CONST
-AC_DEFUN(FP_CHECK_CONSTS,
+AC_DEFUN([FP_CHECK_CONSTS],
[FP_CHECK_CONSTS_TEMPLATE([$1])dnl
for fp_const_name in $1
do
@@ -159,3 +167,119 @@
[enable_openal=$enableval],
[enable_openal=yes])
])# FP_ARG_OPENAL
+
+
+# FP_HEADER_AL
+# ------------
+# Check for an AL header, setting the variable fp_found_al_header to no/yes,
+# depending on the outcome.
+AC_DEFUN([FP_HEADER_AL],
+[if test -z "$fp_found_al_header"; then
+ fp_found_al_header=no
+ AC_CHECK_HEADERS([AL/al.h OpenAL/al.h], [fp_found_al_header=yes; break])
+fi
+]) # FP_HEADER_AL
+
+
+# FP_HEADER_ALC
+# -------------
+# Check for an ALC header, setting the variable fp_found_alc_header to no/yes,
+# depending on the outcome.
+AC_DEFUN([FP_HEADER_ALC],
+[if test -z "$fp_found_alc_header"; then
+ fp_found_alc_header=no
+ AC_CHECK_HEADERS([AL/alc.h OpenAL/alc.h], [fp_found_alc_header=yes; break])
+fi
+]) # FP_HEADER_ALC
+
+
+# FP_FUNC_ALCCLOSEDEVICE_VOID
+# ---------------------------
+# Defines ALCCLOSEDEVICE_VOID to 1 if `alcCloseDevice' returns void.
+AC_DEFUN([FP_FUNC_ALCCLOSEDEVICE_VOID],
+[AC_REQUIRE([FP_HEADER_ALC])
+AC_CACHE_CHECK([whether alcCloseDevice returns void],
+ [fp_cv_func_alcclosedevice_void],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT
+#if defined(HAVE_AL_ALC_H)
+#include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+#include <OpenAL/alc.h>
+#endif
+],
+ [[int x = (int)alcCloseDevice(NULL);]])],
+ [fp_cv_func_alcclosedevice_void=no],
+ [fp_cv_func_alcclosedevice_void=yes])])
+if test x"$fp_cv_func_alcclosedevice_void" = xyes; then
+ AC_DEFINE([ALCCLOSEDEVICE_VOID], [1], [Define to 1 if `alcCloseDevice' returns void.])
+fi
+]) # FP_FUNC_ALCCLOSEDEVICE_VOID
+
+
+# FP_FUNC_ALCMAKECONTEXTCURRENT_VOID
+# ----------------------------------
+# Defines ALCMAKECONTEXTCURRENT_VOID to 1 if `alcMakeContextCurrent' returns void.
+AC_DEFUN([FP_FUNC_ALCMAKECONTEXTCURRENT_VOID],
+[AC_REQUIRE([FP_HEADER_ALC])
+AC_CACHE_CHECK([whether alcMakeContextCurrent returns void],
+ [fp_cv_func_alcmakecontextcurrent_void],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT
+#if defined(HAVE_AL_ALC_H)
+#include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+#include <OpenAL/alc.h>
+#endif
+],
+ [[int x = (int)alcMakeContextCurrent(NULL);]])],
+ [fp_cv_func_alcmakecontextcurrent_void=no],
+ [fp_cv_func_alcmakecontextcurrent_void=yes])])
+if test x"$fp_cv_func_alcmakecontextcurrent_void)" = xyes; then
+ AC_DEFINE([ALCMAKECONTEXTCURRENT_VOID], [1], [Define to 1 if `alcMakeContextCurrent' returns void.])
+fi
+]) # FP_FUNC_ALCMAKECONTEXTCURRENT_VOID
+
+
+# FP_FUNC_ALCPROCESSCONTEXT_VOID
+# ------------------------------
+# Defines ALCPROCESSCONTEXT_VOID to 1 if `alcProcessContext' returns void.
+AC_DEFUN([FP_FUNC_ALCPROCESSCONTEXT_VOID],
+[AC_REQUIRE([FP_HEADER_ALC])
+AC_CACHE_CHECK([whether alcProcessContext returns void],
+ [fp_cv_func_alcprocesscontext_void],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT
+#if defined(HAVE_AL_ALC_H)
+#include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+#include <OpenAL/alc.h>
+#endif
+],
+ [[int x = (int)alcProcessContext(NULL);]])],
+ [fp_cv_func_alcprocesscontext_void=no],
+ [fp_cv_func_alcprocesscontext_void=yes])])
+if test x"$fp_cv_func_alcprocesscontext_void" = xyes; then
+ AC_DEFINE([ALCPROCESSCONTEXT_VOID], [1], [Define to 1 if `alcProcessContext' returns void.])
+fi
+]) # FP_FUNC_ALCPROCESSCONTEXT_VOID
+
+
+# FP_FUNC_ALCDESTROYCONTEXT_VOID
+# ------------------------------
+# Defines ALCDESTROYCONTEXT_VOID to 1 if `alcDestroyContext' returns void.
+AC_DEFUN([FP_FUNC_ALCDESTROYCONTEXT_VOID],
+[AC_REQUIRE([FP_HEADER_ALC])
+AC_CACHE_CHECK([whether alcDestroyContext returns void],
+ [fp_cv_func_alcdestroycontext_void],
+ [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT
+#if defined(HAVE_AL_ALC_H)
+#include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+#include <OpenAL/alc.h>
+#endif
+],
+ [[int x = (int)alcDestroyContext(NULL);]])],
+ [fp_cv_func_alcdestroycontext_void=no],
+ [fp_cv_func_alcdestroycontext_void=yes])])
+if test x"$fp_cv_func_alcdestroycontext_void" = xyes; then
+ AC_DEFINE([ALCDESTROYCONTEXT_VOID], [1], [Define to 1 if `alcDestroyContext' returns void.])
+fi
+]) # FP_FUNC_ALCDESTROYCONTEXT_VOID
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/configure ghc-6.4.2/libraries/OpenAL/configure
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/configure 2005-03-12 08:13:20.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/configure 2006-04-19 04:36:53.000000000 +0900
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.57 for Haskell HOpenAL package 1.0.
+# Generated by GNU Autoconf 2.57 for Haskell HOpenAL package 1.2.
#
# Report bugs to <sven.panne@aedion.de>.
#
@@ -268,8 +268,8 @@
# Identity of this package.
PACKAGE_NAME='Haskell HOpenAL package'
PACKAGE_TARNAME='OpenAL'
-PACKAGE_VERSION='1.0'
-PACKAGE_STRING='Haskell HOpenAL package 1.0'
+PACKAGE_VERSION='1.2'
+PACKAGE_STRING='Haskell HOpenAL package 1.2'
PACKAGE_BUGREPORT='sven.panne@aedion.de'
ac_unique_file="include/HsOpenAL.h.in"
@@ -310,7 +310,7 @@
# include <unistd.h>
#endif"
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS AL_BUILD_PACKAGE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT AL_LIBS CPP EGREP AL_FRAMEWORKS BUILD_PACKAGE_BOOL CALLCONV LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS AL_BUILD_PACKAGE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT AL_LIBS AL_FRAMEWORKS CPP EGREP BUILD_PACKAGE_BOOL CALLCONV LIBOBJS LTLIBOBJS'
ac_subst_files=''
# Initialize some variables set by options.
@@ -779,7 +779,7 @@
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures Haskell HOpenAL package 1.0 to adapt to many kinds of systems.
+\`configure' configures Haskell HOpenAL package 1.2 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -836,7 +836,7 @@
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of Haskell HOpenAL package 1.0:";;
+ short | recursive ) echo "Configuration of Haskell HOpenAL package 1.2:";;
esac
cat <<\_ACEOF
@@ -921,7 +921,7 @@
test -n "$ac_init_help" && exit 0
if $ac_init_version; then
cat <<\_ACEOF
-Haskell HOpenAL package configure 1.0
+Haskell HOpenAL package configure 1.2
generated by GNU Autoconf 2.57
Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
@@ -936,7 +936,7 @@
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by Haskell HOpenAL package $as_me 1.0, which was
+It was created by Haskell HOpenAL package $as_me 1.2, which was
generated by GNU Autoconf 2.57. Invocation command line was
$ $0 $@
@@ -2219,7 +2219,7 @@
fi
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
if test "$ac_cv_search_alGenSources" = no; then
- for ac_lib in openal; do
+ for ac_lib in openal openal32; do
LIBS="-l$ac_lib $ac_func_search_save_LIBS"
cat >conftest.$ac_ext <<_ACEOF
#line $LINENO "configure"
@@ -2283,7 +2283,15 @@
echo "$as_me: WARNING: no OpenAL library found, so this package will not be built" >&2;}
else
-al_found_header=no
+# Ugly...
+AL_FRAMEWORKS=
+case $host_os in
+darwin*)
+ AL_FRAMEWORKS=OpenAL
+ ;;
+esac
+
+
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -2757,9 +2765,11 @@
done
+if test -z "$fp_found_al_header"; then
+ fp_found_al_header=no
-for ac_header in AL/alc.h OpenAL/alc.h
+for ac_header in AL/al.h OpenAL/al.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
if eval "test \"\${$as_ac_Header+set}\" = set"; then
@@ -2895,30 +2905,18 @@
cat >>confdefs.h <<_ACEOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF
- al_found_header=yes; break
+ fp_found_al_header=yes; break
fi
done
-if test "$al_found_header" = no; then
- { echo "$as_me:$LINENO: WARNING: no OpenAL header found, so this package will not be built" >&5
-echo "$as_me: WARNING: no OpenAL header found, so this package will not be built" >&2;}
-else
-
-AL_BUILD_PACKAGE=yes
-
-# Ugly...
-AL_FRAMEWORKS=
-case $target_os in
-darwin*)
- AL_FRAMEWORKS=OpenAL
- ;;
-esac
-
+fi
+if test -z "$fp_found_alc_header"; then
+ fp_found_alc_header=no
-for ac_header in AL/alext.h OpenAL/alext.h
+for ac_header in AL/alc.h OpenAL/alc.h
do
as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
if eval "test \"\${$as_ac_Header+set}\" = set"; then
@@ -3054,133 +3052,1600 @@
cat >>confdefs.h <<_ACEOF
#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF
- break
+ fp_found_alc_header=yes; break
fi
done
+fi
-echo "$as_me:$LINENO: checking Haskell type for ALboolean" >&5
-echo $ECHO_N "checking Haskell type for ALboolean... $ECHO_C" >&6
-if test "${fptools_cv_htype_ALboolean+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
+if test -z "$AL_FRAMEWORKS" && test x"$fp_found_al_header$fp_found_alc_header" != xyesyes; then
+ { echo "$as_me:$LINENO: WARNING: no OpenAL headers found, so this package will not be built" >&5
+echo "$as_me: WARNING: no OpenAL headers found, so this package will not be built" >&2;}
else
- fptools_cv_htype_sup_ALboolean=yes
-fp_check_htype_save_cppflags="$CPPFLAGS"
-CPPFLAGS="$CPPFLAGS $X_CFLAGS"
-if test "$cross_compiling" = yes; then
- fptools_cv_htype_ALboolean=NotReallyATypeCross; fptools_cv_htype_sup_ALboolean=no
+
+AL_BUILD_PACKAGE=yes
+
+
+
+for ac_header in AL/alext.h OpenAL/alext.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
else
- cat >conftest.$ac_ext <<_ACEOF
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
#line $LINENO "configure"
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
-#include <stdio.h>
-#include <stddef.h>
-
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
+ac_header_compiler=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
-#if HAVE_FCNTL_H
-# include <fcntl.h>
-#endif
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
-#if HAVE_SIGNAL_H
-# include <signal.h>
-#endif
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
-#if HAVE_TIME_H
-# include <time.h>
-#endif
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc in
+ yes:no )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to bug-autoconf@gnu.org. ##
+## ------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+ no:yes )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to bug-autoconf@gnu.org. ##
+## ------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-#if HAVE_TERMIOS_H
-# include <termios.h>
-#endif
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+ break
+fi
-#if HAVE_STRING_H
-# include <string.h>
-#endif
+done
-#if HAVE_CTYPE_H
-# include <ctype.h>
-#endif
-#if defined(HAVE_GL_GL_H)
-# include <GL/gl.h>
-#elif defined(HAVE_OPENGL_GL_H)
-# include <OpenGL/gl.h>
-#endif
+echo "$as_me:$LINENO: checking whether alcCloseDevice returns void" >&5
+echo $ECHO_N "checking whether alcCloseDevice returns void... $ECHO_C" >&6
+if test "${fp_cv_func_alcclosedevice_void+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
#if defined(HAVE_AL_ALC_H)
-# include <AL/alc.h>
+#include <AL/alc.h>
#elif defined(HAVE_OPENAL_ALC_H)
-# include <OpenAL/alc.h>
-#endif
-
-#if HAVE_SYS_RESOURCE_H
-# include <sys/resource.h>
+#include <OpenAL/alc.h>
#endif
-typedef ALboolean testing;
-
-main() {
- FILE *f=fopen("conftestval", "w");
- if (!f) exit(1);
- if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
- fprintf(f, "%s%d\n",
- ((testing)(-1) < (testing)0) ? "Int" : "Word",
- sizeof(testing)*8);
- } else {
- fprintf(f,"%s\n",
- (sizeof(testing) > sizeof(double)) ? "LDouble" :
- (sizeof(testing) == sizeof(double)) ? "Double" : "Float");
- }
- fclose(f);
- exit(0);
+int
+main ()
+{
+int x = (int)alcCloseDevice(NULL);
+ ;
+ return 0;
}
_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
(eval $ac_try) 2>&5
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- fptools_cv_htype_ALboolean=`cat conftestval`
+ fp_cv_func_alcclosedevice_void=no
else
- echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
+ echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-( exit $ac_status )
+fp_cv_func_alcclosedevice_void=yes
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $fp_cv_func_alcclosedevice_void" >&5
+echo "${ECHO_T}$fp_cv_func_alcclosedevice_void" >&6
+if test x"$fp_cv_func_alcclosedevice_void" = xyes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define ALCCLOSEDEVICE_VOID 1
+_ACEOF
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether alcMakeContextCurrent returns void" >&5
+echo $ECHO_N "checking whether alcMakeContextCurrent returns void... $ECHO_C" >&6
+if test "${fp_cv_func_alcmakecontextcurrent_void+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#if defined(HAVE_AL_ALC_H)
+#include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+#include <OpenAL/alc.h>
+#endif
+
+int
+main ()
+{
+int x = (int)alcMakeContextCurrent(NULL);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ fp_cv_func_alcmakecontextcurrent_void=no
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fp_cv_func_alcmakecontextcurrent_void=yes
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $fp_cv_func_alcmakecontextcurrent_void" >&5
+echo "${ECHO_T}$fp_cv_func_alcmakecontextcurrent_void" >&6
+if test x"$fp_cv_func_alcmakecontextcurrent_void)" = xyes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define ALCMAKECONTEXTCURRENT_VOID 1
+_ACEOF
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether alcProcessContext returns void" >&5
+echo $ECHO_N "checking whether alcProcessContext returns void... $ECHO_C" >&6
+if test "${fp_cv_func_alcprocesscontext_void+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#if defined(HAVE_AL_ALC_H)
+#include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+#include <OpenAL/alc.h>
+#endif
+
+int
+main ()
+{
+int x = (int)alcProcessContext(NULL);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ fp_cv_func_alcprocesscontext_void=no
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fp_cv_func_alcprocesscontext_void=yes
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $fp_cv_func_alcprocesscontext_void" >&5
+echo "${ECHO_T}$fp_cv_func_alcprocesscontext_void" >&6
+if test x"$fp_cv_func_alcprocesscontext_void" = xyes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define ALCPROCESSCONTEXT_VOID 1
+_ACEOF
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether alcDestroyContext returns void" >&5
+echo $ECHO_N "checking whether alcDestroyContext returns void... $ECHO_C" >&6
+if test "${fp_cv_func_alcdestroycontext_void+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#if defined(HAVE_AL_ALC_H)
+#include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+#include <OpenAL/alc.h>
+#endif
+
+int
+main ()
+{
+int x = (int)alcDestroyContext(NULL);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ fp_cv_func_alcdestroycontext_void=no
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fp_cv_func_alcdestroycontext_void=yes
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $fp_cv_func_alcdestroycontext_void" >&5
+echo "${ECHO_T}$fp_cv_func_alcdestroycontext_void" >&6
+if test x"$fp_cv_func_alcdestroycontext_void" = xyes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define ALCDESTROYCONTEXT_VOID 1
+_ACEOF
+
+fi
+
+
+echo "$as_me:$LINENO: checking Haskell type for ALboolean" >&5
+echo $ECHO_N "checking Haskell type for ALboolean... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALboolean+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ fptools_cv_htype_sup_ALboolean=yes
+fp_check_htype_save_cppflags="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+if test "$cross_compiling" = yes; then
+ fptools_cv_htype_ALboolean=NotReallyATypeCross; fptools_cv_htype_sup_ALboolean=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdio.h>
+#include <stddef.h>
+
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+
+#if HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#if HAVE_SIGNAL_H
+# include <signal.h>
+#endif
+
+#if HAVE_TIME_H
+# include <time.h>
+#endif
+
+#if HAVE_TERMIOS_H
+# include <termios.h>
+#endif
+
+#if HAVE_STRING_H
+# include <string.h>
+#endif
+
+#if HAVE_CTYPE_H
+# include <ctype.h>
+#endif
+
+#if defined(HAVE_GL_GL_H)
+# include <GL/gl.h>
+#elif defined(HAVE_OPENGL_GL_H)
+# include <OpenGL/gl.h>
+#endif
+
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
+#if defined(HAVE_AL_ALC_H)
+# include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+# include <OpenAL/alc.h>
+#endif
+
+#if HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+typedef ALboolean testing;
+
+main() {
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
+ fprintf(f, "%s%d\n",
+ ((testing)(-1) < (testing)0) ? "Int" : "Word",
+ sizeof(testing)*8);
+ } else {
+ fprintf(f,"%s\n",
+ (sizeof(testing) > sizeof(double)) ? "LDouble" :
+ (sizeof(testing) == sizeof(double)) ? "Double" : "Float");
+ }
+ fclose(f);
+ exit(0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ fptools_cv_htype_ALboolean=`cat conftestval`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
fptools_cv_htype_ALboolean=NotReallyAType; fptools_cv_htype_sup_ALboolean=no
fi
rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
+fi
+ if test "$fptools_cv_htype_sup_ALboolean" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALboolean" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALboolean" >&6
+
+cat >>confdefs.h <<_ACEOF
+#define HTYPE_ALBOOLEAN $fptools_cv_htype_ALboolean
+_ACEOF
+
+else
+ echo "$as_me:$LINENO: result: not supported" >&5
+echo "${ECHO_T}not supported" >&6
+fi
+
+echo "$as_me:$LINENO: checking Haskell type for ALchar" >&5
+echo $ECHO_N "checking Haskell type for ALchar... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALchar+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ fptools_cv_htype_sup_ALchar=yes
+fp_check_htype_save_cppflags="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+if test "$cross_compiling" = yes; then
+ fptools_cv_htype_ALchar=NotReallyATypeCross; fptools_cv_htype_sup_ALchar=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdio.h>
+#include <stddef.h>
+
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+
+#if HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#if HAVE_SIGNAL_H
+# include <signal.h>
+#endif
+
+#if HAVE_TIME_H
+# include <time.h>
+#endif
+
+#if HAVE_TERMIOS_H
+# include <termios.h>
+#endif
+
+#if HAVE_STRING_H
+# include <string.h>
+#endif
+
+#if HAVE_CTYPE_H
+# include <ctype.h>
+#endif
+
+#if defined(HAVE_GL_GL_H)
+# include <GL/gl.h>
+#elif defined(HAVE_OPENGL_GL_H)
+# include <OpenGL/gl.h>
+#endif
+
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
+#if defined(HAVE_AL_ALC_H)
+# include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+# include <OpenAL/alc.h>
+#endif
+
+#if HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+typedef ALchar testing;
+
+main() {
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
+ fprintf(f, "%s%d\n",
+ ((testing)(-1) < (testing)0) ? "Int" : "Word",
+ sizeof(testing)*8);
+ } else {
+ fprintf(f,"%s\n",
+ (sizeof(testing) > sizeof(double)) ? "LDouble" :
+ (sizeof(testing) == sizeof(double)) ? "Double" : "Float");
+ }
+ fclose(f);
+ exit(0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ fptools_cv_htype_ALchar=`cat conftestval`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+fptools_cv_htype_ALchar=Int8
+fi
+rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
+fi
+ if test "$fptools_cv_htype_sup_ALchar" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALchar" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALchar" >&6
+
+cat >>confdefs.h <<_ACEOF
+#define HTYPE_ALCHAR $fptools_cv_htype_ALchar
+_ACEOF
+
+else
+ echo "$as_me:$LINENO: result: not supported" >&5
+echo "${ECHO_T}not supported" >&6
+fi
+
+echo "$as_me:$LINENO: checking Haskell type for ALbyte" >&5
+echo $ECHO_N "checking Haskell type for ALbyte... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALbyte+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ fptools_cv_htype_sup_ALbyte=yes
+fp_check_htype_save_cppflags="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+if test "$cross_compiling" = yes; then
+ fptools_cv_htype_ALbyte=NotReallyATypeCross; fptools_cv_htype_sup_ALbyte=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdio.h>
+#include <stddef.h>
+
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+
+#if HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#if HAVE_SIGNAL_H
+# include <signal.h>
+#endif
+
+#if HAVE_TIME_H
+# include <time.h>
+#endif
+
+#if HAVE_TERMIOS_H
+# include <termios.h>
+#endif
+
+#if HAVE_STRING_H
+# include <string.h>
+#endif
+
+#if HAVE_CTYPE_H
+# include <ctype.h>
+#endif
+
+#if defined(HAVE_GL_GL_H)
+# include <GL/gl.h>
+#elif defined(HAVE_OPENGL_GL_H)
+# include <OpenGL/gl.h>
+#endif
+
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
+#if defined(HAVE_AL_ALC_H)
+# include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+# include <OpenAL/alc.h>
+#endif
+
+#if HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+typedef ALbyte testing;
+
+main() {
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
+ fprintf(f, "%s%d\n",
+ ((testing)(-1) < (testing)0) ? "Int" : "Word",
+ sizeof(testing)*8);
+ } else {
+ fprintf(f,"%s\n",
+ (sizeof(testing) > sizeof(double)) ? "LDouble" :
+ (sizeof(testing) == sizeof(double)) ? "Double" : "Float");
+ }
+ fclose(f);
+ exit(0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ fptools_cv_htype_ALbyte=`cat conftestval`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+fptools_cv_htype_ALbyte=NotReallyAType; fptools_cv_htype_sup_ALbyte=no
+fi
+rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
+fi
+ if test "$fptools_cv_htype_sup_ALbyte" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALbyte" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALbyte" >&6
+
+cat >>confdefs.h <<_ACEOF
+#define HTYPE_ALBYTE $fptools_cv_htype_ALbyte
+_ACEOF
+
+else
+ echo "$as_me:$LINENO: result: not supported" >&5
+echo "${ECHO_T}not supported" >&6
+fi
+
+echo "$as_me:$LINENO: checking Haskell type for ALubyte" >&5
+echo $ECHO_N "checking Haskell type for ALubyte... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALubyte+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ fptools_cv_htype_sup_ALubyte=yes
+fp_check_htype_save_cppflags="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+if test "$cross_compiling" = yes; then
+ fptools_cv_htype_ALubyte=NotReallyATypeCross; fptools_cv_htype_sup_ALubyte=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdio.h>
+#include <stddef.h>
+
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+
+#if HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#if HAVE_SIGNAL_H
+# include <signal.h>
+#endif
+
+#if HAVE_TIME_H
+# include <time.h>
+#endif
+
+#if HAVE_TERMIOS_H
+# include <termios.h>
+#endif
+
+#if HAVE_STRING_H
+# include <string.h>
+#endif
+
+#if HAVE_CTYPE_H
+# include <ctype.h>
+#endif
+
+#if defined(HAVE_GL_GL_H)
+# include <GL/gl.h>
+#elif defined(HAVE_OPENGL_GL_H)
+# include <OpenGL/gl.h>
+#endif
+
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
+#if defined(HAVE_AL_ALC_H)
+# include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+# include <OpenAL/alc.h>
+#endif
+
+#if HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+typedef ALubyte testing;
+
+main() {
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
+ fprintf(f, "%s%d\n",
+ ((testing)(-1) < (testing)0) ? "Int" : "Word",
+ sizeof(testing)*8);
+ } else {
+ fprintf(f,"%s\n",
+ (sizeof(testing) > sizeof(double)) ? "LDouble" :
+ (sizeof(testing) == sizeof(double)) ? "Double" : "Float");
+ }
+ fclose(f);
+ exit(0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ fptools_cv_htype_ALubyte=`cat conftestval`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+fptools_cv_htype_ALubyte=NotReallyAType; fptools_cv_htype_sup_ALubyte=no
+fi
+rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
+fi
+ if test "$fptools_cv_htype_sup_ALubyte" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALubyte" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALubyte" >&6
+
+cat >>confdefs.h <<_ACEOF
+#define HTYPE_ALUBYTE $fptools_cv_htype_ALubyte
+_ACEOF
+
+else
+ echo "$as_me:$LINENO: result: not supported" >&5
+echo "${ECHO_T}not supported" >&6
+fi
+
+echo "$as_me:$LINENO: checking Haskell type for ALshort" >&5
+echo $ECHO_N "checking Haskell type for ALshort... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALshort+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ fptools_cv_htype_sup_ALshort=yes
+fp_check_htype_save_cppflags="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+if test "$cross_compiling" = yes; then
+ fptools_cv_htype_ALshort=NotReallyATypeCross; fptools_cv_htype_sup_ALshort=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdio.h>
+#include <stddef.h>
+
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+
+#if HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#if HAVE_SIGNAL_H
+# include <signal.h>
+#endif
+
+#if HAVE_TIME_H
+# include <time.h>
+#endif
+
+#if HAVE_TERMIOS_H
+# include <termios.h>
+#endif
+
+#if HAVE_STRING_H
+# include <string.h>
+#endif
+
+#if HAVE_CTYPE_H
+# include <ctype.h>
+#endif
+
+#if defined(HAVE_GL_GL_H)
+# include <GL/gl.h>
+#elif defined(HAVE_OPENGL_GL_H)
+# include <OpenGL/gl.h>
+#endif
+
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
+#if defined(HAVE_AL_ALC_H)
+# include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+# include <OpenAL/alc.h>
+#endif
+
+#if HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+typedef ALshort testing;
+
+main() {
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
+ fprintf(f, "%s%d\n",
+ ((testing)(-1) < (testing)0) ? "Int" : "Word",
+ sizeof(testing)*8);
+ } else {
+ fprintf(f,"%s\n",
+ (sizeof(testing) > sizeof(double)) ? "LDouble" :
+ (sizeof(testing) == sizeof(double)) ? "Double" : "Float");
+ }
+ fclose(f);
+ exit(0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ fptools_cv_htype_ALshort=`cat conftestval`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+fptools_cv_htype_ALshort=NotReallyAType; fptools_cv_htype_sup_ALshort=no
+fi
+rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
+fi
+ if test "$fptools_cv_htype_sup_ALshort" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALshort" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALshort" >&6
+
+cat >>confdefs.h <<_ACEOF
+#define HTYPE_ALSHORT $fptools_cv_htype_ALshort
+_ACEOF
+
+else
+ echo "$as_me:$LINENO: result: not supported" >&5
+echo "${ECHO_T}not supported" >&6
+fi
+
+echo "$as_me:$LINENO: checking Haskell type for ALushort" >&5
+echo $ECHO_N "checking Haskell type for ALushort... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALushort+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ fptools_cv_htype_sup_ALushort=yes
+fp_check_htype_save_cppflags="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+if test "$cross_compiling" = yes; then
+ fptools_cv_htype_ALushort=NotReallyATypeCross; fptools_cv_htype_sup_ALushort=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdio.h>
+#include <stddef.h>
+
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+
+#if HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#if HAVE_SIGNAL_H
+# include <signal.h>
+#endif
+
+#if HAVE_TIME_H
+# include <time.h>
+#endif
+
+#if HAVE_TERMIOS_H
+# include <termios.h>
+#endif
+
+#if HAVE_STRING_H
+# include <string.h>
+#endif
+
+#if HAVE_CTYPE_H
+# include <ctype.h>
+#endif
+
+#if defined(HAVE_GL_GL_H)
+# include <GL/gl.h>
+#elif defined(HAVE_OPENGL_GL_H)
+# include <OpenGL/gl.h>
+#endif
+
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
+#if defined(HAVE_AL_ALC_H)
+# include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+# include <OpenAL/alc.h>
+#endif
+
+#if HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+typedef ALushort testing;
+
+main() {
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
+ fprintf(f, "%s%d\n",
+ ((testing)(-1) < (testing)0) ? "Int" : "Word",
+ sizeof(testing)*8);
+ } else {
+ fprintf(f,"%s\n",
+ (sizeof(testing) > sizeof(double)) ? "LDouble" :
+ (sizeof(testing) == sizeof(double)) ? "Double" : "Float");
+ }
+ fclose(f);
+ exit(0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ fptools_cv_htype_ALushort=`cat conftestval`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+fptools_cv_htype_ALushort=NotReallyAType; fptools_cv_htype_sup_ALushort=no
+fi
+rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
+fi
+ if test "$fptools_cv_htype_sup_ALushort" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALushort" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALushort" >&6
+
+cat >>confdefs.h <<_ACEOF
+#define HTYPE_ALUSHORT $fptools_cv_htype_ALushort
+_ACEOF
+
+else
+ echo "$as_me:$LINENO: result: not supported" >&5
+echo "${ECHO_T}not supported" >&6
+fi
+
+echo "$as_me:$LINENO: checking Haskell type for ALint" >&5
+echo $ECHO_N "checking Haskell type for ALint... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALint+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ fptools_cv_htype_sup_ALint=yes
+fp_check_htype_save_cppflags="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+if test "$cross_compiling" = yes; then
+ fptools_cv_htype_ALint=NotReallyATypeCross; fptools_cv_htype_sup_ALint=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdio.h>
+#include <stddef.h>
+
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+
+#if HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#if HAVE_SIGNAL_H
+# include <signal.h>
+#endif
+
+#if HAVE_TIME_H
+# include <time.h>
+#endif
+
+#if HAVE_TERMIOS_H
+# include <termios.h>
+#endif
+
+#if HAVE_STRING_H
+# include <string.h>
+#endif
+
+#if HAVE_CTYPE_H
+# include <ctype.h>
+#endif
+
+#if defined(HAVE_GL_GL_H)
+# include <GL/gl.h>
+#elif defined(HAVE_OPENGL_GL_H)
+# include <OpenGL/gl.h>
+#endif
+
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
+#if defined(HAVE_AL_ALC_H)
+# include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+# include <OpenAL/alc.h>
+#endif
+
+#if HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+typedef ALint testing;
+
+main() {
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
+ fprintf(f, "%s%d\n",
+ ((testing)(-1) < (testing)0) ? "Int" : "Word",
+ sizeof(testing)*8);
+ } else {
+ fprintf(f,"%s\n",
+ (sizeof(testing) > sizeof(double)) ? "LDouble" :
+ (sizeof(testing) == sizeof(double)) ? "Double" : "Float");
+ }
+ fclose(f);
+ exit(0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ fptools_cv_htype_ALint=`cat conftestval`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+fptools_cv_htype_ALint=NotReallyAType; fptools_cv_htype_sup_ALint=no
+fi
+rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
+fi
+ if test "$fptools_cv_htype_sup_ALint" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALint" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALint" >&6
+
+cat >>confdefs.h <<_ACEOF
+#define HTYPE_ALINT $fptools_cv_htype_ALint
+_ACEOF
+
+else
+ echo "$as_me:$LINENO: result: not supported" >&5
+echo "${ECHO_T}not supported" >&6
+fi
+
+echo "$as_me:$LINENO: checking Haskell type for ALuint" >&5
+echo $ECHO_N "checking Haskell type for ALuint... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALuint+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ fptools_cv_htype_sup_ALuint=yes
+fp_check_htype_save_cppflags="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+if test "$cross_compiling" = yes; then
+ fptools_cv_htype_ALuint=NotReallyATypeCross; fptools_cv_htype_sup_ALuint=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdio.h>
+#include <stddef.h>
+
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+
+#if HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#if HAVE_SIGNAL_H
+# include <signal.h>
+#endif
+
+#if HAVE_TIME_H
+# include <time.h>
+#endif
+
+#if HAVE_TERMIOS_H
+# include <termios.h>
+#endif
+
+#if HAVE_STRING_H
+# include <string.h>
+#endif
+
+#if HAVE_CTYPE_H
+# include <ctype.h>
+#endif
+
+#if defined(HAVE_GL_GL_H)
+# include <GL/gl.h>
+#elif defined(HAVE_OPENGL_GL_H)
+# include <OpenGL/gl.h>
+#endif
+
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
+#if defined(HAVE_AL_ALC_H)
+# include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+# include <OpenAL/alc.h>
+#endif
+
+#if HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+typedef ALuint testing;
+
+main() {
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
+ fprintf(f, "%s%d\n",
+ ((testing)(-1) < (testing)0) ? "Int" : "Word",
+ sizeof(testing)*8);
+ } else {
+ fprintf(f,"%s\n",
+ (sizeof(testing) > sizeof(double)) ? "LDouble" :
+ (sizeof(testing) == sizeof(double)) ? "Double" : "Float");
+ }
+ fclose(f);
+ exit(0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ fptools_cv_htype_ALuint=`cat conftestval`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+fptools_cv_htype_ALuint=NotReallyAType; fptools_cv_htype_sup_ALuint=no
+fi
+rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
+fi
+ if test "$fptools_cv_htype_sup_ALuint" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALuint" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALuint" >&6
+
+cat >>confdefs.h <<_ACEOF
+#define HTYPE_ALUINT $fptools_cv_htype_ALuint
+_ACEOF
+
+else
+ echo "$as_me:$LINENO: result: not supported" >&5
+echo "${ECHO_T}not supported" >&6
+fi
+
+echo "$as_me:$LINENO: checking Haskell type for ALsizei" >&5
+echo $ECHO_N "checking Haskell type for ALsizei... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALsizei+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ fptools_cv_htype_sup_ALsizei=yes
+fp_check_htype_save_cppflags="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+if test "$cross_compiling" = yes; then
+ fptools_cv_htype_ALsizei=NotReallyATypeCross; fptools_cv_htype_sup_ALsizei=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdio.h>
+#include <stddef.h>
+
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+
+#if HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#if HAVE_SIGNAL_H
+# include <signal.h>
+#endif
+
+#if HAVE_TIME_H
+# include <time.h>
+#endif
+
+#if HAVE_TERMIOS_H
+# include <termios.h>
+#endif
+
+#if HAVE_STRING_H
+# include <string.h>
+#endif
+
+#if HAVE_CTYPE_H
+# include <ctype.h>
+#endif
+
+#if defined(HAVE_GL_GL_H)
+# include <GL/gl.h>
+#elif defined(HAVE_OPENGL_GL_H)
+# include <OpenGL/gl.h>
+#endif
+
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
+#if defined(HAVE_AL_ALC_H)
+# include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+# include <OpenAL/alc.h>
+#endif
+
+#if HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+typedef ALsizei testing;
+
+main() {
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
+ fprintf(f, "%s%d\n",
+ ((testing)(-1) < (testing)0) ? "Int" : "Word",
+ sizeof(testing)*8);
+ } else {
+ fprintf(f,"%s\n",
+ (sizeof(testing) > sizeof(double)) ? "LDouble" :
+ (sizeof(testing) == sizeof(double)) ? "Double" : "Float");
+ }
+ fclose(f);
+ exit(0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ fptools_cv_htype_ALsizei=`cat conftestval`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+fptools_cv_htype_ALsizei=NotReallyAType; fptools_cv_htype_sup_ALsizei=no
+fi
+rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
fi
- CPPFLAGS="$fp_check_htype_save_cppflags"
-if test "$fptools_cv_htype_sup_ALboolean" = yes; then
- echo "$as_me:$LINENO: result: $fptools_cv_htype_ALboolean" >&5
-echo "${ECHO_T}$fptools_cv_htype_ALboolean" >&6
+ if test "$fptools_cv_htype_sup_ALsizei" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALsizei" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALsizei" >&6
cat >>confdefs.h <<_ACEOF
-#define HTYPE_ALBOOLEAN $fptools_cv_htype_ALboolean
+#define HTYPE_ALSIZEI $fptools_cv_htype_ALsizei
_ACEOF
else
@@ -3188,16 +4653,150 @@
echo "${ECHO_T}not supported" >&6
fi
-echo "$as_me:$LINENO: checking Haskell type for ALbyte" >&5
-echo $ECHO_N "checking Haskell type for ALbyte... $ECHO_C" >&6
-if test "${fptools_cv_htype_ALbyte+set}" = set; then
+echo "$as_me:$LINENO: checking Haskell type for ALenum" >&5
+echo $ECHO_N "checking Haskell type for ALenum... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALenum+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ fptools_cv_htype_sup_ALenum=yes
+fp_check_htype_save_cppflags="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+if test "$cross_compiling" = yes; then
+ fptools_cv_htype_ALenum=NotReallyATypeCross; fptools_cv_htype_sup_ALenum=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdio.h>
+#include <stddef.h>
+
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+
+#if HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#if HAVE_SIGNAL_H
+# include <signal.h>
+#endif
+
+#if HAVE_TIME_H
+# include <time.h>
+#endif
+
+#if HAVE_TERMIOS_H
+# include <termios.h>
+#endif
+
+#if HAVE_STRING_H
+# include <string.h>
+#endif
+
+#if HAVE_CTYPE_H
+# include <ctype.h>
+#endif
+
+#if defined(HAVE_GL_GL_H)
+# include <GL/gl.h>
+#elif defined(HAVE_OPENGL_GL_H)
+# include <OpenGL/gl.h>
+#endif
+
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
+#if defined(HAVE_AL_ALC_H)
+# include <AL/alc.h>
+#elif defined(HAVE_OPENAL_ALC_H)
+# include <OpenAL/alc.h>
+#endif
+
+#if HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+typedef ALenum testing;
+
+main() {
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ if (((testing)((int)((testing)1.4))) == ((testing)1.4)) {
+ fprintf(f, "%s%d\n",
+ ((testing)(-1) < (testing)0) ? "Int" : "Word",
+ sizeof(testing)*8);
+ } else {
+ fprintf(f,"%s\n",
+ (sizeof(testing) > sizeof(double)) ? "LDouble" :
+ (sizeof(testing) == sizeof(double)) ? "Double" : "Float");
+ }
+ fclose(f);
+ exit(0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ fptools_cv_htype_ALenum=`cat conftestval`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+fptools_cv_htype_ALenum=NotReallyAType; fptools_cv_htype_sup_ALenum=no
+fi
+rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
+fi
+ if test "$fptools_cv_htype_sup_ALenum" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALenum" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALenum" >&6
+
+cat >>confdefs.h <<_ACEOF
+#define HTYPE_ALENUM $fptools_cv_htype_ALenum
+_ACEOF
+
+else
+ echo "$as_me:$LINENO: result: not supported" >&5
+echo "${ECHO_T}not supported" >&6
+fi
+
+echo "$as_me:$LINENO: checking Haskell type for ALfloat" >&5
+echo $ECHO_N "checking Haskell type for ALfloat... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALfloat+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- fptools_cv_htype_sup_ALbyte=yes
+ fptools_cv_htype_sup_ALfloat=yes
fp_check_htype_save_cppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
if test "$cross_compiling" = yes; then
- fptools_cv_htype_ALbyte=NotReallyATypeCross; fptools_cv_htype_sup_ALbyte=no
+ fptools_cv_htype_ALfloat=NotReallyATypeCross; fptools_cv_htype_sup_ALfloat=no
else
cat >conftest.$ac_ext <<_ACEOF
#line $LINENO "configure"
@@ -3251,6 +4850,12 @@
# include <OpenGL/gl.h>
#endif
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
#if defined(HAVE_AL_ALC_H)
# include <AL/alc.h>
#elif defined(HAVE_OPENAL_ALC_H)
@@ -3261,7 +4866,7 @@
# include <sys/resource.h>
#endif
-typedef ALbyte testing;
+typedef ALfloat testing;
main() {
FILE *f=fopen("conftestval", "w");
@@ -3290,25 +4895,25 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- fptools_cv_htype_ALbyte=`cat conftestval`
+ fptools_cv_htype_ALfloat=`cat conftestval`
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-fptools_cv_htype_ALbyte=NotReallyAType; fptools_cv_htype_sup_ALbyte=no
+fptools_cv_htype_ALfloat=NotReallyAType; fptools_cv_htype_sup_ALfloat=no
fi
rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
fi
- CPPFLAGS="$fp_check_htype_save_cppflags"
-if test "$fptools_cv_htype_sup_ALbyte" = yes; then
- echo "$as_me:$LINENO: result: $fptools_cv_htype_ALbyte" >&5
-echo "${ECHO_T}$fptools_cv_htype_ALbyte" >&6
+ if test "$fptools_cv_htype_sup_ALfloat" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALfloat" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALfloat" >&6
cat >>confdefs.h <<_ACEOF
-#define HTYPE_ALBYTE $fptools_cv_htype_ALbyte
+#define HTYPE_ALFLOAT $fptools_cv_htype_ALfloat
_ACEOF
else
@@ -3316,16 +4921,16 @@
echo "${ECHO_T}not supported" >&6
fi
-echo "$as_me:$LINENO: checking Haskell type for ALubyte" >&5
-echo $ECHO_N "checking Haskell type for ALubyte... $ECHO_C" >&6
-if test "${fptools_cv_htype_ALubyte+set}" = set; then
+echo "$as_me:$LINENO: checking Haskell type for ALdouble" >&5
+echo $ECHO_N "checking Haskell type for ALdouble... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALdouble+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- fptools_cv_htype_sup_ALubyte=yes
+ fptools_cv_htype_sup_ALdouble=yes
fp_check_htype_save_cppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
if test "$cross_compiling" = yes; then
- fptools_cv_htype_ALubyte=NotReallyATypeCross; fptools_cv_htype_sup_ALubyte=no
+ fptools_cv_htype_ALdouble=NotReallyATypeCross; fptools_cv_htype_sup_ALdouble=no
else
cat >conftest.$ac_ext <<_ACEOF
#line $LINENO "configure"
@@ -3379,6 +4984,12 @@
# include <OpenGL/gl.h>
#endif
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
#if defined(HAVE_AL_ALC_H)
# include <AL/alc.h>
#elif defined(HAVE_OPENAL_ALC_H)
@@ -3389,7 +5000,7 @@
# include <sys/resource.h>
#endif
-typedef ALubyte testing;
+typedef ALdouble testing;
main() {
FILE *f=fopen("conftestval", "w");
@@ -3418,25 +5029,25 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- fptools_cv_htype_ALubyte=`cat conftestval`
+ fptools_cv_htype_ALdouble=`cat conftestval`
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-fptools_cv_htype_ALubyte=NotReallyAType; fptools_cv_htype_sup_ALubyte=no
+fptools_cv_htype_ALdouble=NotReallyAType; fptools_cv_htype_sup_ALdouble=no
fi
rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
fi
- CPPFLAGS="$fp_check_htype_save_cppflags"
-if test "$fptools_cv_htype_sup_ALubyte" = yes; then
- echo "$as_me:$LINENO: result: $fptools_cv_htype_ALubyte" >&5
-echo "${ECHO_T}$fptools_cv_htype_ALubyte" >&6
+ if test "$fptools_cv_htype_sup_ALdouble" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALdouble" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALdouble" >&6
cat >>confdefs.h <<_ACEOF
-#define HTYPE_ALUBYTE $fptools_cv_htype_ALubyte
+#define HTYPE_ALDOUBLE $fptools_cv_htype_ALdouble
_ACEOF
else
@@ -3444,16 +5055,17 @@
echo "${ECHO_T}not supported" >&6
fi
-echo "$as_me:$LINENO: checking Haskell type for ALshort" >&5
-echo $ECHO_N "checking Haskell type for ALshort... $ECHO_C" >&6
-if test "${fptools_cv_htype_ALshort+set}" = set; then
+
+echo "$as_me:$LINENO: checking Haskell type for ALCboolean" >&5
+echo $ECHO_N "checking Haskell type for ALCboolean... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALCboolean+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- fptools_cv_htype_sup_ALshort=yes
+ fptools_cv_htype_sup_ALCboolean=yes
fp_check_htype_save_cppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
if test "$cross_compiling" = yes; then
- fptools_cv_htype_ALshort=NotReallyATypeCross; fptools_cv_htype_sup_ALshort=no
+ fptools_cv_htype_ALCboolean=NotReallyATypeCross; fptools_cv_htype_sup_ALCboolean=no
else
cat >conftest.$ac_ext <<_ACEOF
#line $LINENO "configure"
@@ -3507,6 +5119,12 @@
# include <OpenGL/gl.h>
#endif
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
#if defined(HAVE_AL_ALC_H)
# include <AL/alc.h>
#elif defined(HAVE_OPENAL_ALC_H)
@@ -3517,7 +5135,7 @@
# include <sys/resource.h>
#endif
-typedef ALshort testing;
+typedef ALCboolean testing;
main() {
FILE *f=fopen("conftestval", "w");
@@ -3546,25 +5164,25 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- fptools_cv_htype_ALshort=`cat conftestval`
+ fptools_cv_htype_ALCboolean=`cat conftestval`
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-fptools_cv_htype_ALshort=NotReallyAType; fptools_cv_htype_sup_ALshort=no
+fptools_cv_htype_ALCboolean=Int8
fi
rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
fi
- CPPFLAGS="$fp_check_htype_save_cppflags"
-if test "$fptools_cv_htype_sup_ALshort" = yes; then
- echo "$as_me:$LINENO: result: $fptools_cv_htype_ALshort" >&5
-echo "${ECHO_T}$fptools_cv_htype_ALshort" >&6
+ if test "$fptools_cv_htype_sup_ALCboolean" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALCboolean" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALCboolean" >&6
cat >>confdefs.h <<_ACEOF
-#define HTYPE_ALSHORT $fptools_cv_htype_ALshort
+#define HTYPE_ALCBOOLEAN $fptools_cv_htype_ALCboolean
_ACEOF
else
@@ -3572,16 +5190,16 @@
echo "${ECHO_T}not supported" >&6
fi
-echo "$as_me:$LINENO: checking Haskell type for ALushort" >&5
-echo $ECHO_N "checking Haskell type for ALushort... $ECHO_C" >&6
-if test "${fptools_cv_htype_ALushort+set}" = set; then
+echo "$as_me:$LINENO: checking Haskell type for ALCchar" >&5
+echo $ECHO_N "checking Haskell type for ALCchar... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALCchar+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- fptools_cv_htype_sup_ALushort=yes
+ fptools_cv_htype_sup_ALCchar=yes
fp_check_htype_save_cppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
if test "$cross_compiling" = yes; then
- fptools_cv_htype_ALushort=NotReallyATypeCross; fptools_cv_htype_sup_ALushort=no
+ fptools_cv_htype_ALCchar=NotReallyATypeCross; fptools_cv_htype_sup_ALCchar=no
else
cat >conftest.$ac_ext <<_ACEOF
#line $LINENO "configure"
@@ -3635,6 +5253,12 @@
# include <OpenGL/gl.h>
#endif
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
#if defined(HAVE_AL_ALC_H)
# include <AL/alc.h>
#elif defined(HAVE_OPENAL_ALC_H)
@@ -3645,7 +5269,7 @@
# include <sys/resource.h>
#endif
-typedef ALushort testing;
+typedef ALCchar testing;
main() {
FILE *f=fopen("conftestval", "w");
@@ -3674,25 +5298,25 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- fptools_cv_htype_ALushort=`cat conftestval`
+ fptools_cv_htype_ALCchar=`cat conftestval`
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-fptools_cv_htype_ALushort=NotReallyAType; fptools_cv_htype_sup_ALushort=no
+fptools_cv_htype_ALCchar=Int8
fi
rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
fi
- CPPFLAGS="$fp_check_htype_save_cppflags"
-if test "$fptools_cv_htype_sup_ALushort" = yes; then
- echo "$as_me:$LINENO: result: $fptools_cv_htype_ALushort" >&5
-echo "${ECHO_T}$fptools_cv_htype_ALushort" >&6
+ if test "$fptools_cv_htype_sup_ALCchar" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALCchar" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALCchar" >&6
cat >>confdefs.h <<_ACEOF
-#define HTYPE_ALUSHORT $fptools_cv_htype_ALushort
+#define HTYPE_ALCCHAR $fptools_cv_htype_ALCchar
_ACEOF
else
@@ -3700,16 +5324,16 @@
echo "${ECHO_T}not supported" >&6
fi
-echo "$as_me:$LINENO: checking Haskell type for ALint" >&5
-echo $ECHO_N "checking Haskell type for ALint... $ECHO_C" >&6
-if test "${fptools_cv_htype_ALint+set}" = set; then
+echo "$as_me:$LINENO: checking Haskell type for ALCbyte" >&5
+echo $ECHO_N "checking Haskell type for ALCbyte... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALCbyte+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- fptools_cv_htype_sup_ALint=yes
+ fptools_cv_htype_sup_ALCbyte=yes
fp_check_htype_save_cppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
if test "$cross_compiling" = yes; then
- fptools_cv_htype_ALint=NotReallyATypeCross; fptools_cv_htype_sup_ALint=no
+ fptools_cv_htype_ALCbyte=NotReallyATypeCross; fptools_cv_htype_sup_ALCbyte=no
else
cat >conftest.$ac_ext <<_ACEOF
#line $LINENO "configure"
@@ -3763,6 +5387,12 @@
# include <OpenGL/gl.h>
#endif
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
#if defined(HAVE_AL_ALC_H)
# include <AL/alc.h>
#elif defined(HAVE_OPENAL_ALC_H)
@@ -3773,7 +5403,7 @@
# include <sys/resource.h>
#endif
-typedef ALint testing;
+typedef ALCbyte testing;
main() {
FILE *f=fopen("conftestval", "w");
@@ -3802,25 +5432,25 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- fptools_cv_htype_ALint=`cat conftestval`
+ fptools_cv_htype_ALCbyte=`cat conftestval`
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-fptools_cv_htype_ALint=NotReallyAType; fptools_cv_htype_sup_ALint=no
+fptools_cv_htype_ALCbyte=Int8
fi
rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
fi
- CPPFLAGS="$fp_check_htype_save_cppflags"
-if test "$fptools_cv_htype_sup_ALint" = yes; then
- echo "$as_me:$LINENO: result: $fptools_cv_htype_ALint" >&5
-echo "${ECHO_T}$fptools_cv_htype_ALint" >&6
+ if test "$fptools_cv_htype_sup_ALCbyte" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALCbyte" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALCbyte" >&6
cat >>confdefs.h <<_ACEOF
-#define HTYPE_ALINT $fptools_cv_htype_ALint
+#define HTYPE_ALCBYTE $fptools_cv_htype_ALCbyte
_ACEOF
else
@@ -3828,16 +5458,16 @@
echo "${ECHO_T}not supported" >&6
fi
-echo "$as_me:$LINENO: checking Haskell type for ALuint" >&5
-echo $ECHO_N "checking Haskell type for ALuint... $ECHO_C" >&6
-if test "${fptools_cv_htype_ALuint+set}" = set; then
+echo "$as_me:$LINENO: checking Haskell type for ALCubyte" >&5
+echo $ECHO_N "checking Haskell type for ALCubyte... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALCubyte+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- fptools_cv_htype_sup_ALuint=yes
+ fptools_cv_htype_sup_ALCubyte=yes
fp_check_htype_save_cppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
if test "$cross_compiling" = yes; then
- fptools_cv_htype_ALuint=NotReallyATypeCross; fptools_cv_htype_sup_ALuint=no
+ fptools_cv_htype_ALCubyte=NotReallyATypeCross; fptools_cv_htype_sup_ALCubyte=no
else
cat >conftest.$ac_ext <<_ACEOF
#line $LINENO "configure"
@@ -3891,6 +5521,12 @@
# include <OpenGL/gl.h>
#endif
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
#if defined(HAVE_AL_ALC_H)
# include <AL/alc.h>
#elif defined(HAVE_OPENAL_ALC_H)
@@ -3901,7 +5537,7 @@
# include <sys/resource.h>
#endif
-typedef ALuint testing;
+typedef ALCubyte testing;
main() {
FILE *f=fopen("conftestval", "w");
@@ -3930,25 +5566,25 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- fptools_cv_htype_ALuint=`cat conftestval`
+ fptools_cv_htype_ALCubyte=`cat conftestval`
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-fptools_cv_htype_ALuint=NotReallyAType; fptools_cv_htype_sup_ALuint=no
+fptools_cv_htype_ALCubyte=Word8
fi
rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
fi
- CPPFLAGS="$fp_check_htype_save_cppflags"
-if test "$fptools_cv_htype_sup_ALuint" = yes; then
- echo "$as_me:$LINENO: result: $fptools_cv_htype_ALuint" >&5
-echo "${ECHO_T}$fptools_cv_htype_ALuint" >&6
+ if test "$fptools_cv_htype_sup_ALCubyte" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALCubyte" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALCubyte" >&6
cat >>confdefs.h <<_ACEOF
-#define HTYPE_ALUINT $fptools_cv_htype_ALuint
+#define HTYPE_ALCUBYTE $fptools_cv_htype_ALCubyte
_ACEOF
else
@@ -3956,16 +5592,16 @@
echo "${ECHO_T}not supported" >&6
fi
-echo "$as_me:$LINENO: checking Haskell type for ALsizei" >&5
-echo $ECHO_N "checking Haskell type for ALsizei... $ECHO_C" >&6
-if test "${fptools_cv_htype_ALsizei+set}" = set; then
+echo "$as_me:$LINENO: checking Haskell type for ALCshort" >&5
+echo $ECHO_N "checking Haskell type for ALCshort... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALCshort+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- fptools_cv_htype_sup_ALsizei=yes
+ fptools_cv_htype_sup_ALCshort=yes
fp_check_htype_save_cppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
if test "$cross_compiling" = yes; then
- fptools_cv_htype_ALsizei=NotReallyATypeCross; fptools_cv_htype_sup_ALsizei=no
+ fptools_cv_htype_ALCshort=NotReallyATypeCross; fptools_cv_htype_sup_ALCshort=no
else
cat >conftest.$ac_ext <<_ACEOF
#line $LINENO "configure"
@@ -4019,6 +5655,12 @@
# include <OpenGL/gl.h>
#endif
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
#if defined(HAVE_AL_ALC_H)
# include <AL/alc.h>
#elif defined(HAVE_OPENAL_ALC_H)
@@ -4029,7 +5671,7 @@
# include <sys/resource.h>
#endif
-typedef ALsizei testing;
+typedef ALCshort testing;
main() {
FILE *f=fopen("conftestval", "w");
@@ -4058,25 +5700,25 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- fptools_cv_htype_ALsizei=`cat conftestval`
+ fptools_cv_htype_ALCshort=`cat conftestval`
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-fptools_cv_htype_ALsizei=NotReallyAType; fptools_cv_htype_sup_ALsizei=no
+fptools_cv_htype_ALCshort=Int16
fi
rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
fi
- CPPFLAGS="$fp_check_htype_save_cppflags"
-if test "$fptools_cv_htype_sup_ALsizei" = yes; then
- echo "$as_me:$LINENO: result: $fptools_cv_htype_ALsizei" >&5
-echo "${ECHO_T}$fptools_cv_htype_ALsizei" >&6
+ if test "$fptools_cv_htype_sup_ALCshort" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALCshort" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALCshort" >&6
cat >>confdefs.h <<_ACEOF
-#define HTYPE_ALSIZEI $fptools_cv_htype_ALsizei
+#define HTYPE_ALCSHORT $fptools_cv_htype_ALCshort
_ACEOF
else
@@ -4084,16 +5726,16 @@
echo "${ECHO_T}not supported" >&6
fi
-echo "$as_me:$LINENO: checking Haskell type for ALenum" >&5
-echo $ECHO_N "checking Haskell type for ALenum... $ECHO_C" >&6
-if test "${fptools_cv_htype_ALenum+set}" = set; then
+echo "$as_me:$LINENO: checking Haskell type for ALCushort" >&5
+echo $ECHO_N "checking Haskell type for ALCushort... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALCushort+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- fptools_cv_htype_sup_ALenum=yes
+ fptools_cv_htype_sup_ALCushort=yes
fp_check_htype_save_cppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
if test "$cross_compiling" = yes; then
- fptools_cv_htype_ALenum=NotReallyATypeCross; fptools_cv_htype_sup_ALenum=no
+ fptools_cv_htype_ALCushort=NotReallyATypeCross; fptools_cv_htype_sup_ALCushort=no
else
cat >conftest.$ac_ext <<_ACEOF
#line $LINENO "configure"
@@ -4147,6 +5789,12 @@
# include <OpenGL/gl.h>
#endif
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
#if defined(HAVE_AL_ALC_H)
# include <AL/alc.h>
#elif defined(HAVE_OPENAL_ALC_H)
@@ -4157,7 +5805,7 @@
# include <sys/resource.h>
#endif
-typedef ALenum testing;
+typedef ALCushort testing;
main() {
FILE *f=fopen("conftestval", "w");
@@ -4186,25 +5834,25 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- fptools_cv_htype_ALenum=`cat conftestval`
+ fptools_cv_htype_ALCushort=`cat conftestval`
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-fptools_cv_htype_ALenum=NotReallyAType; fptools_cv_htype_sup_ALenum=no
+fptools_cv_htype_ALCushort=Word16
fi
rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
fi
- CPPFLAGS="$fp_check_htype_save_cppflags"
-if test "$fptools_cv_htype_sup_ALenum" = yes; then
- echo "$as_me:$LINENO: result: $fptools_cv_htype_ALenum" >&5
-echo "${ECHO_T}$fptools_cv_htype_ALenum" >&6
+ if test "$fptools_cv_htype_sup_ALCushort" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALCushort" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALCushort" >&6
cat >>confdefs.h <<_ACEOF
-#define HTYPE_ALENUM $fptools_cv_htype_ALenum
+#define HTYPE_ALCUSHORT $fptools_cv_htype_ALCushort
_ACEOF
else
@@ -4212,16 +5860,16 @@
echo "${ECHO_T}not supported" >&6
fi
-echo "$as_me:$LINENO: checking Haskell type for ALbitfield" >&5
-echo $ECHO_N "checking Haskell type for ALbitfield... $ECHO_C" >&6
-if test "${fptools_cv_htype_ALbitfield+set}" = set; then
+echo "$as_me:$LINENO: checking Haskell type for ALCint" >&5
+echo $ECHO_N "checking Haskell type for ALCint... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALCint+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- fptools_cv_htype_sup_ALbitfield=yes
+ fptools_cv_htype_sup_ALCint=yes
fp_check_htype_save_cppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
if test "$cross_compiling" = yes; then
- fptools_cv_htype_ALbitfield=NotReallyATypeCross; fptools_cv_htype_sup_ALbitfield=no
+ fptools_cv_htype_ALCint=NotReallyATypeCross; fptools_cv_htype_sup_ALCint=no
else
cat >conftest.$ac_ext <<_ACEOF
#line $LINENO "configure"
@@ -4275,6 +5923,12 @@
# include <OpenGL/gl.h>
#endif
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
#if defined(HAVE_AL_ALC_H)
# include <AL/alc.h>
#elif defined(HAVE_OPENAL_ALC_H)
@@ -4285,7 +5939,7 @@
# include <sys/resource.h>
#endif
-typedef ALbitfield testing;
+typedef ALCint testing;
main() {
FILE *f=fopen("conftestval", "w");
@@ -4314,25 +5968,25 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- fptools_cv_htype_ALbitfield=`cat conftestval`
+ fptools_cv_htype_ALCint=`cat conftestval`
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-fptools_cv_htype_ALbitfield=NotReallyAType; fptools_cv_htype_sup_ALbitfield=no
+fptools_cv_htype_ALCint=Int32
fi
rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
fi
- CPPFLAGS="$fp_check_htype_save_cppflags"
-if test "$fptools_cv_htype_sup_ALbitfield" = yes; then
- echo "$as_me:$LINENO: result: $fptools_cv_htype_ALbitfield" >&5
-echo "${ECHO_T}$fptools_cv_htype_ALbitfield" >&6
+ if test "$fptools_cv_htype_sup_ALCint" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALCint" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALCint" >&6
cat >>confdefs.h <<_ACEOF
-#define HTYPE_ALBITFIELD $fptools_cv_htype_ALbitfield
+#define HTYPE_ALCINT $fptools_cv_htype_ALCint
_ACEOF
else
@@ -4340,16 +5994,16 @@
echo "${ECHO_T}not supported" >&6
fi
-echo "$as_me:$LINENO: checking Haskell type for ALfloat" >&5
-echo $ECHO_N "checking Haskell type for ALfloat... $ECHO_C" >&6
-if test "${fptools_cv_htype_ALfloat+set}" = set; then
+echo "$as_me:$LINENO: checking Haskell type for ALCuint" >&5
+echo $ECHO_N "checking Haskell type for ALCuint... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALCuint+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- fptools_cv_htype_sup_ALfloat=yes
+ fptools_cv_htype_sup_ALCuint=yes
fp_check_htype_save_cppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
if test "$cross_compiling" = yes; then
- fptools_cv_htype_ALfloat=NotReallyATypeCross; fptools_cv_htype_sup_ALfloat=no
+ fptools_cv_htype_ALCuint=NotReallyATypeCross; fptools_cv_htype_sup_ALCuint=no
else
cat >conftest.$ac_ext <<_ACEOF
#line $LINENO "configure"
@@ -4403,6 +6057,12 @@
# include <OpenGL/gl.h>
#endif
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
#if defined(HAVE_AL_ALC_H)
# include <AL/alc.h>
#elif defined(HAVE_OPENAL_ALC_H)
@@ -4413,7 +6073,7 @@
# include <sys/resource.h>
#endif
-typedef ALfloat testing;
+typedef ALCuint testing;
main() {
FILE *f=fopen("conftestval", "w");
@@ -4442,25 +6102,25 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- fptools_cv_htype_ALfloat=`cat conftestval`
+ fptools_cv_htype_ALCuint=`cat conftestval`
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-fptools_cv_htype_ALfloat=NotReallyAType; fptools_cv_htype_sup_ALfloat=no
+fptools_cv_htype_ALCuint=Word32
fi
rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
fi
- CPPFLAGS="$fp_check_htype_save_cppflags"
-if test "$fptools_cv_htype_sup_ALfloat" = yes; then
- echo "$as_me:$LINENO: result: $fptools_cv_htype_ALfloat" >&5
-echo "${ECHO_T}$fptools_cv_htype_ALfloat" >&6
+ if test "$fptools_cv_htype_sup_ALCuint" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALCuint" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALCuint" >&6
cat >>confdefs.h <<_ACEOF
-#define HTYPE_ALFLOAT $fptools_cv_htype_ALfloat
+#define HTYPE_ALCUINT $fptools_cv_htype_ALCuint
_ACEOF
else
@@ -4468,16 +6128,16 @@
echo "${ECHO_T}not supported" >&6
fi
-echo "$as_me:$LINENO: checking Haskell type for ALclampf" >&5
-echo $ECHO_N "checking Haskell type for ALclampf... $ECHO_C" >&6
-if test "${fptools_cv_htype_ALclampf+set}" = set; then
+echo "$as_me:$LINENO: checking Haskell type for ALCsizei" >&5
+echo $ECHO_N "checking Haskell type for ALCsizei... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALCsizei+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- fptools_cv_htype_sup_ALclampf=yes
+ fptools_cv_htype_sup_ALCsizei=yes
fp_check_htype_save_cppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
if test "$cross_compiling" = yes; then
- fptools_cv_htype_ALclampf=NotReallyATypeCross; fptools_cv_htype_sup_ALclampf=no
+ fptools_cv_htype_ALCsizei=NotReallyATypeCross; fptools_cv_htype_sup_ALCsizei=no
else
cat >conftest.$ac_ext <<_ACEOF
#line $LINENO "configure"
@@ -4531,6 +6191,12 @@
# include <OpenGL/gl.h>
#endif
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
#if defined(HAVE_AL_ALC_H)
# include <AL/alc.h>
#elif defined(HAVE_OPENAL_ALC_H)
@@ -4541,7 +6207,7 @@
# include <sys/resource.h>
#endif
-typedef ALclampf testing;
+typedef ALCsizei testing;
main() {
FILE *f=fopen("conftestval", "w");
@@ -4570,25 +6236,25 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- fptools_cv_htype_ALclampf=`cat conftestval`
+ fptools_cv_htype_ALCsizei=`cat conftestval`
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-fptools_cv_htype_ALclampf=NotReallyAType; fptools_cv_htype_sup_ALclampf=no
+fptools_cv_htype_ALCsizei=Int32
fi
rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
fi
- CPPFLAGS="$fp_check_htype_save_cppflags"
-if test "$fptools_cv_htype_sup_ALclampf" = yes; then
- echo "$as_me:$LINENO: result: $fptools_cv_htype_ALclampf" >&5
-echo "${ECHO_T}$fptools_cv_htype_ALclampf" >&6
+ if test "$fptools_cv_htype_sup_ALCsizei" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALCsizei" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALCsizei" >&6
cat >>confdefs.h <<_ACEOF
-#define HTYPE_ALCLAMPF $fptools_cv_htype_ALclampf
+#define HTYPE_ALCSIZEI $fptools_cv_htype_ALCsizei
_ACEOF
else
@@ -4596,16 +6262,16 @@
echo "${ECHO_T}not supported" >&6
fi
-echo "$as_me:$LINENO: checking Haskell type for ALdouble" >&5
-echo $ECHO_N "checking Haskell type for ALdouble... $ECHO_C" >&6
-if test "${fptools_cv_htype_ALdouble+set}" = set; then
+echo "$as_me:$LINENO: checking Haskell type for ALCenum" >&5
+echo $ECHO_N "checking Haskell type for ALCenum... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALCenum+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- fptools_cv_htype_sup_ALdouble=yes
+ fptools_cv_htype_sup_ALCenum=yes
fp_check_htype_save_cppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
if test "$cross_compiling" = yes; then
- fptools_cv_htype_ALdouble=NotReallyATypeCross; fptools_cv_htype_sup_ALdouble=no
+ fptools_cv_htype_ALCenum=NotReallyATypeCross; fptools_cv_htype_sup_ALCenum=no
else
cat >conftest.$ac_ext <<_ACEOF
#line $LINENO "configure"
@@ -4659,6 +6325,12 @@
# include <OpenGL/gl.h>
#endif
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
#if defined(HAVE_AL_ALC_H)
# include <AL/alc.h>
#elif defined(HAVE_OPENAL_ALC_H)
@@ -4669,7 +6341,7 @@
# include <sys/resource.h>
#endif
-typedef ALdouble testing;
+typedef ALCenum testing;
main() {
FILE *f=fopen("conftestval", "w");
@@ -4698,25 +6370,25 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- fptools_cv_htype_ALdouble=`cat conftestval`
+ fptools_cv_htype_ALCenum=`cat conftestval`
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-fptools_cv_htype_ALdouble=NotReallyAType; fptools_cv_htype_sup_ALdouble=no
+fptools_cv_htype_ALCenum=Int32
fi
rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
fi
- CPPFLAGS="$fp_check_htype_save_cppflags"
-if test "$fptools_cv_htype_sup_ALdouble" = yes; then
- echo "$as_me:$LINENO: result: $fptools_cv_htype_ALdouble" >&5
-echo "${ECHO_T}$fptools_cv_htype_ALdouble" >&6
+ if test "$fptools_cv_htype_sup_ALCenum" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALCenum" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALCenum" >&6
cat >>confdefs.h <<_ACEOF
-#define HTYPE_ALDOUBLE $fptools_cv_htype_ALdouble
+#define HTYPE_ALCENUM $fptools_cv_htype_ALCenum
_ACEOF
else
@@ -4724,16 +6396,16 @@
echo "${ECHO_T}not supported" >&6
fi
-echo "$as_me:$LINENO: checking Haskell type for ALclampd" >&5
-echo $ECHO_N "checking Haskell type for ALclampd... $ECHO_C" >&6
-if test "${fptools_cv_htype_ALclampd+set}" = set; then
+echo "$as_me:$LINENO: checking Haskell type for ALCfloat" >&5
+echo $ECHO_N "checking Haskell type for ALCfloat... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALCfloat+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- fptools_cv_htype_sup_ALclampd=yes
+ fptools_cv_htype_sup_ALCfloat=yes
fp_check_htype_save_cppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
if test "$cross_compiling" = yes; then
- fptools_cv_htype_ALclampd=NotReallyATypeCross; fptools_cv_htype_sup_ALclampd=no
+ fptools_cv_htype_ALCfloat=NotReallyATypeCross; fptools_cv_htype_sup_ALCfloat=no
else
cat >conftest.$ac_ext <<_ACEOF
#line $LINENO "configure"
@@ -4787,6 +6459,12 @@
# include <OpenGL/gl.h>
#endif
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
#if defined(HAVE_AL_ALC_H)
# include <AL/alc.h>
#elif defined(HAVE_OPENAL_ALC_H)
@@ -4797,7 +6475,7 @@
# include <sys/resource.h>
#endif
-typedef ALclampd testing;
+typedef ALCfloat testing;
main() {
FILE *f=fopen("conftestval", "w");
@@ -4826,25 +6504,25 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- fptools_cv_htype_ALclampd=`cat conftestval`
+ fptools_cv_htype_ALCfloat=`cat conftestval`
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
-fptools_cv_htype_ALclampd=NotReallyAType; fptools_cv_htype_sup_ALclampd=no
+fptools_cv_htype_ALCfloat=Float
fi
rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
fi
- CPPFLAGS="$fp_check_htype_save_cppflags"
-if test "$fptools_cv_htype_sup_ALclampd" = yes; then
- echo "$as_me:$LINENO: result: $fptools_cv_htype_ALclampd" >&5
-echo "${ECHO_T}$fptools_cv_htype_ALclampd" >&6
+ if test "$fptools_cv_htype_sup_ALCfloat" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALCfloat" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALCfloat" >&6
cat >>confdefs.h <<_ACEOF
-#define HTYPE_ALCLAMPD $fptools_cv_htype_ALclampd
+#define HTYPE_ALCFLOAT $fptools_cv_htype_ALCfloat
_ACEOF
else
@@ -4852,16 +6530,16 @@
echo "${ECHO_T}not supported" >&6
fi
-echo "$as_me:$LINENO: checking Haskell type for ALCenum" >&5
-echo $ECHO_N "checking Haskell type for ALCenum... $ECHO_C" >&6
-if test "${fptools_cv_htype_ALCenum+set}" = set; then
+echo "$as_me:$LINENO: checking Haskell type for ALCdouble" >&5
+echo $ECHO_N "checking Haskell type for ALCdouble... $ECHO_C" >&6
+if test "${fptools_cv_htype_ALCdouble+set}" = set; then
echo $ECHO_N "(cached) $ECHO_C" >&6
else
- fptools_cv_htype_sup_ALCenum=yes
+ fptools_cv_htype_sup_ALCdouble=yes
fp_check_htype_save_cppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
if test "$cross_compiling" = yes; then
- fptools_cv_htype_ALCenum=NotReallyATypeCross; fptools_cv_htype_sup_ALCenum=no
+ fptools_cv_htype_ALCdouble=NotReallyATypeCross; fptools_cv_htype_sup_ALCdouble=no
else
cat >conftest.$ac_ext <<_ACEOF
#line $LINENO "configure"
@@ -4915,6 +6593,12 @@
# include <OpenGL/gl.h>
#endif
+#if defined(HAVE_AL_AL_H)
+# include <AL/al.h>
+#elif defined(HAVE_OPENAL_AL_H)
+# include <OpenAL/al.h>
+#endif
+
#if defined(HAVE_AL_ALC_H)
# include <AL/alc.h>
#elif defined(HAVE_OPENAL_ALC_H)
@@ -4925,7 +6609,7 @@
# include <sys/resource.h>
#endif
-typedef ALCenum testing;
+typedef ALCdouble testing;
main() {
FILE *f=fopen("conftestval", "w");
@@ -4954,31 +6638,99 @@
ac_status=$?
echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
- fptools_cv_htype_ALCenum=`cat conftestval`
+ fptools_cv_htype_ALCdouble=`cat conftestval`
else
echo "$as_me: program exited with status $ac_status" >&5
echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-( exit $ac_status )
-fptools_cv_htype_ALCenum=NotReallyAType; fptools_cv_htype_sup_ALCenum=no
-fi
-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-fi
- CPPFLAGS="$fp_check_htype_save_cppflags"
-if test "$fptools_cv_htype_sup_ALCenum" = yes; then
- echo "$as_me:$LINENO: result: $fptools_cv_htype_ALCenum" >&5
-echo "${ECHO_T}$fptools_cv_htype_ALCenum" >&6
+( exit $ac_status )
+fptools_cv_htype_ALCdouble=Double
+fi
+rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+CPPFLAGS="$fp_check_htype_save_cppflags"
+fi
+ if test "$fptools_cv_htype_sup_ALCdouble" = yes; then
+ echo "$as_me:$LINENO: result: $fptools_cv_htype_ALCdouble" >&5
+echo "${ECHO_T}$fptools_cv_htype_ALCdouble" >&6
+
+cat >>confdefs.h <<_ACEOF
+#define HTYPE_ALCDOUBLE $fptools_cv_htype_ALCdouble
+_ACEOF
+
+else
+ echo "$as_me:$LINENO: result: not supported" >&5
+echo "${ECHO_T}not supported" >&6
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-cat >>confdefs.h <<_ACEOF
-#define HTYPE_ALCENUM $fptools_cv_htype_ALCenum
-_ACEOF
-else
- echo "$as_me:$LINENO: result: not supported" >&5
-echo "${ECHO_T}not supported" >&6
-fi
@@ -4998,7 +6750,7 @@
-for fp_const_name in AL_FORMAT_VORBIS_EXT ALC_FREQUENCY ALC_REFRESH ALC_SYNC ALC_NO_ERROR ALC_INVALID_DEVICE ALC_INVALID_CONTEXT ALC_INVALID_ENUM ALC_INVALID_VALUE ALC_OUT_OF_MEMORY ALC_DEFAULT_DEVICE_SPECIFIER ALC_DEVICE_SPECIFIER ALC_EXTENSIONS ALC_MAJOR_VERSION ALC_MINOR_VERSION ALC_ATTRIBUTES_SIZE ALC_ALL_ATTRIBUTES
+for fp_const_name in AL_FALSE AL_TRUE AL_NO_ERROR AL_INVALID_NAME AL_INVALID_ENUM AL_INVALID_VALUE AL_INVALID_OPERATION AL_OUT_OF_MEMORY AL_DOPPLER_FACTOR AL_SPEED_OF_SOUND AL_DISTANCE_MODEL AL_VERSION AL_RENDERER AL_VENDOR AL_EXTENSIONS AL_NONE AL_INVERSE_DISTANCE AL_INVERSE_DISTANCE_CLAMPED AL_LINEAR_DISTANCE AL_LINEAR_DISTANCE_CLAMPED AL_EXPONENT_DISTANCE AL_EXPONENT_DISTANCE_CLAMPED 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_UNDETERMINED AL_STATIC AL_STREAMING AL_INITIAL AL_PLAYING AL_PAUSED AL_STOPPED AL_FREQUENCY AL_SIZE AL_BITS AL_CHANNELS AL_FORMAT_MONO8 AL_FORMAT_MONO16 AL_FORMAT_STEREO8 AL_FORMAT_STEREO16 ALC_FALSE ALC_TRUE ALC_FREQUENCY ALC_REFRESH ALC_SYNC ALC_MONO_SOURCES ALC_STEREO_SOURCES ALC_NO_ERROR ALC_INVALID_DEVICE ALC_INVALID_CONTEXT ALC_INVALID_ENUM ALC_INVALID_VALUE ALC_INVALID_OPERATION ALC_OUT_OF_MEMORY ALC_DEFAULT_DEVICE_SPECIFIER ALC_DEVICE_SPECIFIER ALC_EXTENSIONS ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER ALC_CAPTURE_DEVICE_SPECIFIER ALC_ATTRIBUTES_SIZE ALC_ALL_ATTRIBUTES ALC_MAJOR_VERSION ALC_MINOR_VERSION ALC_CAPTURE_SAMPLES
do
as_fp_Cache=`echo "fp_cv_const_$fp_const_name" | $as_tr_sh`
echo "$as_me:$LINENO: checking value of $fp_const_name" >&5
@@ -5028,6 +6780,87 @@
#include <OpenAL/alext.h>
#endif
+#ifndef AL_SPEED_OF_SOUND
+#define AL_SPEED_OF_SOUND 0xC003
+#endif
+
+#ifndef AL_LINEAR_DISTANCE
+#define AL_LINEAR_DISTANCE 0xD003
+#endif
+
+#ifndef AL_LINEAR_DISTANCE_CLAMPED
+#define AL_LINEAR_DISTANCE_CLAMPED 0xD004
+#endif
+
+#ifndef AL_EXPONENT_DISTANCE
+#define AL_EXPONENT_DISTANCE 0xD005
+#endif
+
+#ifndef AL_EXPONENT_DISTANCE_CLAMPED
+#define AL_EXPONENT_DISTANCE_CLAMPED 0xD006
+#endif
+
+#ifndef AL_SEC_OFFSET
+#define AL_SEC_OFFSET 0x1024
+#endif
+
+#ifndef AL_SAMPLE_OFFSET
+#define AL_SAMPLE_OFFSET 0x1025
+#endif
+
+#ifndef AL_BYTE_OFFSET
+#define AL_BYTE_OFFSET 0x1026
+#endif
+
+#ifndef AL_UNDETERMINED
+#define AL_UNDETERMINED 0x1030
+#endif
+
+#ifndef AL_STATIC
+#define AL_STATIC 0x1028
+#endif
+
+#ifndef ALC_MONO_SOURCES
+#define ALC_MONO_SOURCES 0x1010
+#endif
+
+#ifndef ALC_STEREO_SOURCES
+#define ALC_STEREO_SOURCES 0x1011
+#endif
+
+#ifndef AL_INVALID_ENUM
+#ifdef AL_ILLEGAL_ENUM
+#define AL_INVALID_ENUM AL_ILLEGAL_ENUM
+#else
+#define AL_INVALID_ENUM 0xA002
+#endif
+#endif
+
+#ifndef AL_INVALID_OPERATION
+#ifdef AL_ILLEGAL_COMMAND
+#define AL_INVALID_OPERATION AL_ILLEGAL_COMMAND
+#else
+#define AL_INVALID_OPERATION 0xA004
+#endif
+#endif
+
+/* NOTE: THIS IS NOT IN ANY HEADER */
+#ifndef ALC_INVALID_OPERATION
+#define ALC_INVALID_OPERATION 0xA006
+#endif
+
+#ifndef ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER
+#define ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER 0x311
+#endif
+
+#ifndef ALC_CAPTURE_DEVICE_SPECIFIER
+#define ALC_CAPTURE_DEVICE_SPECIFIER 0x310
+#endif
+
+#ifndef ALC_CAPTURE_SAMPLES
+#define ALC_CAPTURE_SAMPLES 0x312
+#endif
+
int
main ()
@@ -5073,6 +6906,87 @@
#include <OpenAL/alext.h>
#endif
+#ifndef AL_SPEED_OF_SOUND
+#define AL_SPEED_OF_SOUND 0xC003
+#endif
+
+#ifndef AL_LINEAR_DISTANCE
+#define AL_LINEAR_DISTANCE 0xD003
+#endif
+
+#ifndef AL_LINEAR_DISTANCE_CLAMPED
+#define AL_LINEAR_DISTANCE_CLAMPED 0xD004
+#endif
+
+#ifndef AL_EXPONENT_DISTANCE
+#define AL_EXPONENT_DISTANCE 0xD005
+#endif
+
+#ifndef AL_EXPONENT_DISTANCE_CLAMPED
+#define AL_EXPONENT_DISTANCE_CLAMPED 0xD006
+#endif
+
+#ifndef AL_SEC_OFFSET
+#define AL_SEC_OFFSET 0x1024
+#endif
+
+#ifndef AL_SAMPLE_OFFSET
+#define AL_SAMPLE_OFFSET 0x1025
+#endif
+
+#ifndef AL_BYTE_OFFSET
+#define AL_BYTE_OFFSET 0x1026
+#endif
+
+#ifndef AL_UNDETERMINED
+#define AL_UNDETERMINED 0x1030
+#endif
+
+#ifndef AL_STATIC
+#define AL_STATIC 0x1028
+#endif
+
+#ifndef ALC_MONO_SOURCES
+#define ALC_MONO_SOURCES 0x1010
+#endif
+
+#ifndef ALC_STEREO_SOURCES
+#define ALC_STEREO_SOURCES 0x1011
+#endif
+
+#ifndef AL_INVALID_ENUM
+#ifdef AL_ILLEGAL_ENUM
+#define AL_INVALID_ENUM AL_ILLEGAL_ENUM
+#else
+#define AL_INVALID_ENUM 0xA002
+#endif
+#endif
+
+#ifndef AL_INVALID_OPERATION
+#ifdef AL_ILLEGAL_COMMAND
+#define AL_INVALID_OPERATION AL_ILLEGAL_COMMAND
+#else
+#define AL_INVALID_OPERATION 0xA004
+#endif
+#endif
+
+/* NOTE: THIS IS NOT IN ANY HEADER */
+#ifndef ALC_INVALID_OPERATION
+#define ALC_INVALID_OPERATION 0xA006
+#endif
+
+#ifndef ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER
+#define ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER 0x311
+#endif
+
+#ifndef ALC_CAPTURE_DEVICE_SPECIFIER
+#define ALC_CAPTURE_DEVICE_SPECIFIER 0x310
+#endif
+
+#ifndef ALC_CAPTURE_SAMPLES
+#define ALC_CAPTURE_SAMPLES 0x312
+#endif
+
int
main ()
@@ -5134,6 +7048,87 @@
#include <OpenAL/alext.h>
#endif
+#ifndef AL_SPEED_OF_SOUND
+#define AL_SPEED_OF_SOUND 0xC003
+#endif
+
+#ifndef AL_LINEAR_DISTANCE
+#define AL_LINEAR_DISTANCE 0xD003
+#endif
+
+#ifndef AL_LINEAR_DISTANCE_CLAMPED
+#define AL_LINEAR_DISTANCE_CLAMPED 0xD004
+#endif
+
+#ifndef AL_EXPONENT_DISTANCE
+#define AL_EXPONENT_DISTANCE 0xD005
+#endif
+
+#ifndef AL_EXPONENT_DISTANCE_CLAMPED
+#define AL_EXPONENT_DISTANCE_CLAMPED 0xD006
+#endif
+
+#ifndef AL_SEC_OFFSET
+#define AL_SEC_OFFSET 0x1024
+#endif
+
+#ifndef AL_SAMPLE_OFFSET
+#define AL_SAMPLE_OFFSET 0x1025
+#endif
+
+#ifndef AL_BYTE_OFFSET
+#define AL_BYTE_OFFSET 0x1026
+#endif
+
+#ifndef AL_UNDETERMINED
+#define AL_UNDETERMINED 0x1030
+#endif
+
+#ifndef AL_STATIC
+#define AL_STATIC 0x1028
+#endif
+
+#ifndef ALC_MONO_SOURCES
+#define ALC_MONO_SOURCES 0x1010
+#endif
+
+#ifndef ALC_STEREO_SOURCES
+#define ALC_STEREO_SOURCES 0x1011
+#endif
+
+#ifndef AL_INVALID_ENUM
+#ifdef AL_ILLEGAL_ENUM
+#define AL_INVALID_ENUM AL_ILLEGAL_ENUM
+#else
+#define AL_INVALID_ENUM 0xA002
+#endif
+#endif
+
+#ifndef AL_INVALID_OPERATION
+#ifdef AL_ILLEGAL_COMMAND
+#define AL_INVALID_OPERATION AL_ILLEGAL_COMMAND
+#else
+#define AL_INVALID_OPERATION 0xA004
+#endif
+#endif
+
+/* NOTE: THIS IS NOT IN ANY HEADER */
+#ifndef ALC_INVALID_OPERATION
+#define ALC_INVALID_OPERATION 0xA006
+#endif
+
+#ifndef ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER
+#define ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER 0x311
+#endif
+
+#ifndef ALC_CAPTURE_DEVICE_SPECIFIER
+#define ALC_CAPTURE_DEVICE_SPECIFIER 0x310
+#endif
+
+#ifndef ALC_CAPTURE_SAMPLES
+#define ALC_CAPTURE_SAMPLES 0x312
+#endif
+
int
main ()
@@ -5179,6 +7174,87 @@
#include <OpenAL/alext.h>
#endif
+#ifndef AL_SPEED_OF_SOUND
+#define AL_SPEED_OF_SOUND 0xC003
+#endif
+
+#ifndef AL_LINEAR_DISTANCE
+#define AL_LINEAR_DISTANCE 0xD003
+#endif
+
+#ifndef AL_LINEAR_DISTANCE_CLAMPED
+#define AL_LINEAR_DISTANCE_CLAMPED 0xD004
+#endif
+
+#ifndef AL_EXPONENT_DISTANCE
+#define AL_EXPONENT_DISTANCE 0xD005
+#endif
+
+#ifndef AL_EXPONENT_DISTANCE_CLAMPED
+#define AL_EXPONENT_DISTANCE_CLAMPED 0xD006
+#endif
+
+#ifndef AL_SEC_OFFSET
+#define AL_SEC_OFFSET 0x1024
+#endif
+
+#ifndef AL_SAMPLE_OFFSET
+#define AL_SAMPLE_OFFSET 0x1025
+#endif
+
+#ifndef AL_BYTE_OFFSET
+#define AL_BYTE_OFFSET 0x1026
+#endif
+
+#ifndef AL_UNDETERMINED
+#define AL_UNDETERMINED 0x1030
+#endif
+
+#ifndef AL_STATIC
+#define AL_STATIC 0x1028
+#endif
+
+#ifndef ALC_MONO_SOURCES
+#define ALC_MONO_SOURCES 0x1010
+#endif
+
+#ifndef ALC_STEREO_SOURCES
+#define ALC_STEREO_SOURCES 0x1011
+#endif
+
+#ifndef AL_INVALID_ENUM
+#ifdef AL_ILLEGAL_ENUM
+#define AL_INVALID_ENUM AL_ILLEGAL_ENUM
+#else
+#define AL_INVALID_ENUM 0xA002
+#endif
+#endif
+
+#ifndef AL_INVALID_OPERATION
+#ifdef AL_ILLEGAL_COMMAND
+#define AL_INVALID_OPERATION AL_ILLEGAL_COMMAND
+#else
+#define AL_INVALID_OPERATION 0xA004
+#endif
+#endif
+
+/* NOTE: THIS IS NOT IN ANY HEADER */
+#ifndef ALC_INVALID_OPERATION
+#define ALC_INVALID_OPERATION 0xA006
+#endif
+
+#ifndef ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER
+#define ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER 0x311
+#endif
+
+#ifndef ALC_CAPTURE_DEVICE_SPECIFIER
+#define ALC_CAPTURE_DEVICE_SPECIFIER 0x310
+#endif
+
+#ifndef ALC_CAPTURE_SAMPLES
+#define ALC_CAPTURE_SAMPLES 0x312
+#endif
+
int
main ()
@@ -5248,6 +7324,87 @@
#include <OpenAL/alext.h>
#endif
+#ifndef AL_SPEED_OF_SOUND
+#define AL_SPEED_OF_SOUND 0xC003
+#endif
+
+#ifndef AL_LINEAR_DISTANCE
+#define AL_LINEAR_DISTANCE 0xD003
+#endif
+
+#ifndef AL_LINEAR_DISTANCE_CLAMPED
+#define AL_LINEAR_DISTANCE_CLAMPED 0xD004
+#endif
+
+#ifndef AL_EXPONENT_DISTANCE
+#define AL_EXPONENT_DISTANCE 0xD005
+#endif
+
+#ifndef AL_EXPONENT_DISTANCE_CLAMPED
+#define AL_EXPONENT_DISTANCE_CLAMPED 0xD006
+#endif
+
+#ifndef AL_SEC_OFFSET
+#define AL_SEC_OFFSET 0x1024
+#endif
+
+#ifndef AL_SAMPLE_OFFSET
+#define AL_SAMPLE_OFFSET 0x1025
+#endif
+
+#ifndef AL_BYTE_OFFSET
+#define AL_BYTE_OFFSET 0x1026
+#endif
+
+#ifndef AL_UNDETERMINED
+#define AL_UNDETERMINED 0x1030
+#endif
+
+#ifndef AL_STATIC
+#define AL_STATIC 0x1028
+#endif
+
+#ifndef ALC_MONO_SOURCES
+#define ALC_MONO_SOURCES 0x1010
+#endif
+
+#ifndef ALC_STEREO_SOURCES
+#define ALC_STEREO_SOURCES 0x1011
+#endif
+
+#ifndef AL_INVALID_ENUM
+#ifdef AL_ILLEGAL_ENUM
+#define AL_INVALID_ENUM AL_ILLEGAL_ENUM
+#else
+#define AL_INVALID_ENUM 0xA002
+#endif
+#endif
+
+#ifndef AL_INVALID_OPERATION
+#ifdef AL_ILLEGAL_COMMAND
+#define AL_INVALID_OPERATION AL_ILLEGAL_COMMAND
+#else
+#define AL_INVALID_OPERATION 0xA004
+#endif
+#endif
+
+/* NOTE: THIS IS NOT IN ANY HEADER */
+#ifndef ALC_INVALID_OPERATION
+#define ALC_INVALID_OPERATION 0xA006
+#endif
+
+#ifndef ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER
+#define ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER 0x311
+#endif
+
+#ifndef ALC_CAPTURE_DEVICE_SPECIFIER
+#define ALC_CAPTURE_DEVICE_SPECIFIER 0x310
+#endif
+
+#ifndef ALC_CAPTURE_SAMPLES
+#define ALC_CAPTURE_SAMPLES 0x312
+#endif
+
int
main ()
@@ -5312,6 +7469,87 @@
#include <OpenAL/alext.h>
#endif
+#ifndef AL_SPEED_OF_SOUND
+#define AL_SPEED_OF_SOUND 0xC003
+#endif
+
+#ifndef AL_LINEAR_DISTANCE
+#define AL_LINEAR_DISTANCE 0xD003
+#endif
+
+#ifndef AL_LINEAR_DISTANCE_CLAMPED
+#define AL_LINEAR_DISTANCE_CLAMPED 0xD004
+#endif
+
+#ifndef AL_EXPONENT_DISTANCE
+#define AL_EXPONENT_DISTANCE 0xD005
+#endif
+
+#ifndef AL_EXPONENT_DISTANCE_CLAMPED
+#define AL_EXPONENT_DISTANCE_CLAMPED 0xD006
+#endif
+
+#ifndef AL_SEC_OFFSET
+#define AL_SEC_OFFSET 0x1024
+#endif
+
+#ifndef AL_SAMPLE_OFFSET
+#define AL_SAMPLE_OFFSET 0x1025
+#endif
+
+#ifndef AL_BYTE_OFFSET
+#define AL_BYTE_OFFSET 0x1026
+#endif
+
+#ifndef AL_UNDETERMINED
+#define AL_UNDETERMINED 0x1030
+#endif
+
+#ifndef AL_STATIC
+#define AL_STATIC 0x1028
+#endif
+
+#ifndef ALC_MONO_SOURCES
+#define ALC_MONO_SOURCES 0x1010
+#endif
+
+#ifndef ALC_STEREO_SOURCES
+#define ALC_STEREO_SOURCES 0x1011
+#endif
+
+#ifndef AL_INVALID_ENUM
+#ifdef AL_ILLEGAL_ENUM
+#define AL_INVALID_ENUM AL_ILLEGAL_ENUM
+#else
+#define AL_INVALID_ENUM 0xA002
+#endif
+#endif
+
+#ifndef AL_INVALID_OPERATION
+#ifdef AL_ILLEGAL_COMMAND
+#define AL_INVALID_OPERATION AL_ILLEGAL_COMMAND
+#else
+#define AL_INVALID_OPERATION 0xA004
+#endif
+#endif
+
+/* NOTE: THIS IS NOT IN ANY HEADER */
+#ifndef ALC_INVALID_OPERATION
+#define ALC_INVALID_OPERATION 0xA006
+#endif
+
+#ifndef ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER
+#define ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER 0x311
+#endif
+
+#ifndef ALC_CAPTURE_DEVICE_SPECIFIER
+#define ALC_CAPTURE_DEVICE_SPECIFIER 0x310
+#endif
+
+#ifndef ALC_CAPTURE_SAMPLES
+#define ALC_CAPTURE_SAMPLES 0x312
+#endif
+
long longval () { return $fp_const_name; }
unsigned long ulongval () { return $fp_const_name; }
@@ -5402,7 +7640,7 @@
fi
-case "$target" in
+case "$host" in
*-mingw32) CALLCONV=stdcall ;;
*) CALLCONV=ccall ;;
esac
@@ -5770,7 +8008,7 @@
} >&5
cat >&5 <<_CSEOF
-This file was extended by Haskell HOpenAL package $as_me 1.0, which was
+This file was extended by Haskell HOpenAL package $as_me 1.2, which was
generated by GNU Autoconf 2.57. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -5830,7 +8068,7 @@
cat >>$CONFIG_STATUS <<_ACEOF
ac_cs_version="\\
-Haskell HOpenAL package config.status 1.0
+Haskell HOpenAL package config.status 1.2
configured by $0, generated by GNU Autoconf 2.57,
with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
@@ -6030,9 +8268,9 @@
s,@EXEEXT@,$EXEEXT,;t t
s,@OBJEXT@,$OBJEXT,;t t
s,@AL_LIBS@,$AL_LIBS,;t t
+s,@AL_FRAMEWORKS@,$AL_FRAMEWORKS,;t t
s,@CPP@,$CPP,;t t
s,@EGREP@,$EGREP,;t t
-s,@AL_FRAMEWORKS@,$AL_FRAMEWORKS,;t t
s,@BUILD_PACKAGE_BOOL@,$BUILD_PACKAGE_BOOL,;t t
s,@CALLCONV@,$CALLCONV,;t t
s,@LIBOBJS@,$LIBOBJS,;t t
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/configure.ac ghc-6.4.2/libraries/OpenAL/configure.ac
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/configure.ac 2005-02-04 18:16:28.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/configure.ac 2006-03-22 00:58:03.000000000 +0900
@@ -1,4 +1,4 @@
-AC_INIT([Haskell HOpenAL package], [1.0], [sven.panne@aedion.de], [OpenAL])
+AC_INIT([Haskell HOpenAL package], [1.2], [sven.panne@aedion.de], [OpenAL])
# Safety check: Ensure that we are in the correct source directory.
AC_CONFIG_SRCDIR([include/HsOpenAL.h.in])
@@ -19,7 +19,7 @@
# The following test for the OpenAL library is a bit of a hack, but gives nice
# feedback even for the case when no additional library is needed. (Mac OS X?)
AL_LIBS=no
-AC_SEARCH_LIBS([alGenSources], [openal], [AL_LIBS="$ac_cv_search_alGenSources"])
+AC_SEARCH_LIBS([alGenSources], [openal openal32], [AL_LIBS="$ac_cv_search_alGenSources"])
test x"$AL_LIBS" = x"none required" && AL_LIBS=
AC_SUBST([AL_LIBS])
@@ -27,42 +27,57 @@
AC_MSG_WARN([no OpenAL library found, so this package will not be built])
else
-al_found_header=no
-AC_CHECK_HEADERS([AL/alc.h OpenAL/alc.h], [al_found_header=yes; break])
-if test "$al_found_header" = no; then
- AC_MSG_WARN([no OpenAL header found, so this package will not be built])
-else
-
-AL_BUILD_PACKAGE=yes
-
# Ugly...
AL_FRAMEWORKS=
-case $target_os in
+case $host_os in
darwin*)
AL_FRAMEWORKS=OpenAL
;;
esac
AC_SUBST([AL_FRAMEWORKS])
+FP_HEADER_AL
+FP_HEADER_ALC
+if test -z "$AL_FRAMEWORKS" && test x"$fp_found_al_header$fp_found_alc_header" != xyesyes; then
+ AC_MSG_WARN([no OpenAL headers found, so this package will not be built])
+else
+
+AL_BUILD_PACKAGE=yes
+
AC_CHECK_HEADERS([AL/alext.h OpenAL/alext.h], [break])
-FPTOOLS_CHECK_HTYPE(ALboolean)
-FPTOOLS_CHECK_HTYPE(ALbyte)
-FPTOOLS_CHECK_HTYPE(ALubyte)
-FPTOOLS_CHECK_HTYPE(ALshort)
-FPTOOLS_CHECK_HTYPE(ALushort)
-FPTOOLS_CHECK_HTYPE(ALint)
-FPTOOLS_CHECK_HTYPE(ALuint)
-FPTOOLS_CHECK_HTYPE(ALsizei)
-FPTOOLS_CHECK_HTYPE(ALenum)
-FPTOOLS_CHECK_HTYPE(ALbitfield)
-FPTOOLS_CHECK_HTYPE(ALfloat)
-FPTOOLS_CHECK_HTYPE(ALclampf)
-FPTOOLS_CHECK_HTYPE(ALdouble)
-FPTOOLS_CHECK_HTYPE(ALclampd)
-FPTOOLS_CHECK_HTYPE(ALCenum)
+FP_FUNC_ALCCLOSEDEVICE_VOID
+FP_FUNC_ALCMAKECONTEXTCURRENT_VOID
+FP_FUNC_ALCPROCESSCONTEXT_VOID
+FP_FUNC_ALCDESTROYCONTEXT_VOID
+
+FPTOOLS_CHECK_HTYPE([ALboolean])
+FPTOOLS_CHECK_HTYPE([ALchar], [Int8])
+FPTOOLS_CHECK_HTYPE([ALbyte])
+FPTOOLS_CHECK_HTYPE([ALubyte])
+FPTOOLS_CHECK_HTYPE([ALshort])
+FPTOOLS_CHECK_HTYPE([ALushort])
+FPTOOLS_CHECK_HTYPE([ALint])
+FPTOOLS_CHECK_HTYPE([ALuint])
+FPTOOLS_CHECK_HTYPE([ALsizei])
+FPTOOLS_CHECK_HTYPE([ALenum])
+FPTOOLS_CHECK_HTYPE([ALfloat])
+FPTOOLS_CHECK_HTYPE([ALdouble])
+
+FPTOOLS_CHECK_HTYPE([ALCboolean], [Int8])
+FPTOOLS_CHECK_HTYPE([ALCchar], [Int8])
+FPTOOLS_CHECK_HTYPE([ALCbyte], [Int8])
+FPTOOLS_CHECK_HTYPE([ALCubyte], [Word8])
+FPTOOLS_CHECK_HTYPE([ALCshort], [Int16])
+FPTOOLS_CHECK_HTYPE([ALCushort], [Word16])
+FPTOOLS_CHECK_HTYPE([ALCint], [Int32])
+FPTOOLS_CHECK_HTYPE([ALCuint], [Word32])
+FPTOOLS_CHECK_HTYPE([ALCsizei], [Int32])
+FPTOOLS_CHECK_HTYPE([ALCenum], [Int32])
+FPTOOLS_CHECK_HTYPE([ALCfloat], [Float])
+FPTOOLS_CHECK_HTYPE([ALCdouble], [Double])
-FP_CHECK_CONSTS([AL_FORMAT_VORBIS_EXT ALC_FREQUENCY ALC_REFRESH ALC_SYNC ALC_NO_ERROR ALC_INVALID_DEVICE ALC_INVALID_CONTEXT ALC_INVALID_ENUM ALC_INVALID_VALUE ALC_OUT_OF_MEMORY ALC_DEFAULT_DEVICE_SPECIFIER ALC_DEVICE_SPECIFIER ALC_EXTENSIONS ALC_MAJOR_VERSION ALC_MINOR_VERSION ALC_ATTRIBUTES_SIZE ALC_ALL_ATTRIBUTES], [#include <stdio.h>
+FP_CHECK_CONSTS([AL_FALSE AL_TRUE AL_NO_ERROR AL_INVALID_NAME AL_INVALID_ENUM AL_INVALID_VALUE AL_INVALID_OPERATION AL_OUT_OF_MEMORY AL_DOPPLER_FACTOR AL_SPEED_OF_SOUND AL_DISTANCE_MODEL AL_VERSION AL_RENDERER AL_VENDOR AL_EXTENSIONS AL_NONE AL_INVERSE_DISTANCE AL_INVERSE_DISTANCE_CLAMPED AL_LINEAR_DISTANCE AL_LINEAR_DISTANCE_CLAMPED AL_EXPONENT_DISTANCE AL_EXPONENT_DISTANCE_CLAMPED 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_UNDETERMINED AL_STATIC AL_STREAMING AL_INITIAL AL_PLAYING AL_PAUSED AL_STOPPED AL_FREQUENCY AL_SIZE AL_BITS AL_CHANNELS AL_FORMAT_MONO8 AL_FORMAT_MONO16 AL_FORMAT_STEREO8 AL_FORMAT_STEREO16 ALC_FALSE ALC_TRUE ALC_FREQUENCY ALC_REFRESH ALC_SYNC ALC_MONO_SOURCES ALC_STEREO_SOURCES ALC_NO_ERROR ALC_INVALID_DEVICE ALC_INVALID_CONTEXT ALC_INVALID_ENUM ALC_INVALID_VALUE ALC_INVALID_OPERATION ALC_OUT_OF_MEMORY ALC_DEFAULT_DEVICE_SPECIFIER ALC_DEVICE_SPECIFIER ALC_EXTENSIONS ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER ALC_CAPTURE_DEVICE_SPECIFIER ALC_ATTRIBUTES_SIZE ALC_ALL_ATTRIBUTES ALC_MAJOR_VERSION ALC_MINOR_VERSION ALC_CAPTURE_SAMPLES], [#include <stdio.h>
#if defined(HAVE_AL_ALC_H)
#include <AL/alc.h>
#elif defined(HAVE_OPENAL_ALC_H)
@@ -74,6 +89,87 @@
#elif defined(HAVE_OPENAL_ALEXT_H)
#include <OpenAL/alext.h>
#endif
+
+#ifndef AL_SPEED_OF_SOUND
+#define AL_SPEED_OF_SOUND 0xC003
+#endif
+
+#ifndef AL_LINEAR_DISTANCE
+#define AL_LINEAR_DISTANCE 0xD003
+#endif
+
+#ifndef AL_LINEAR_DISTANCE_CLAMPED
+#define AL_LINEAR_DISTANCE_CLAMPED 0xD004
+#endif
+
+#ifndef AL_EXPONENT_DISTANCE
+#define AL_EXPONENT_DISTANCE 0xD005
+#endif
+
+#ifndef AL_EXPONENT_DISTANCE_CLAMPED
+#define AL_EXPONENT_DISTANCE_CLAMPED 0xD006
+#endif
+
+#ifndef AL_SEC_OFFSET
+#define AL_SEC_OFFSET 0x1024
+#endif
+
+#ifndef AL_SAMPLE_OFFSET
+#define AL_SAMPLE_OFFSET 0x1025
+#endif
+
+#ifndef AL_BYTE_OFFSET
+#define AL_BYTE_OFFSET 0x1026
+#endif
+
+#ifndef AL_UNDETERMINED
+#define AL_UNDETERMINED 0x1030
+#endif
+
+#ifndef AL_STATIC
+#define AL_STATIC 0x1028
+#endif
+
+#ifndef ALC_MONO_SOURCES
+#define ALC_MONO_SOURCES 0x1010
+#endif
+
+#ifndef ALC_STEREO_SOURCES
+#define ALC_STEREO_SOURCES 0x1011
+#endif
+
+#ifndef AL_INVALID_ENUM
+#ifdef AL_ILLEGAL_ENUM
+#define AL_INVALID_ENUM AL_ILLEGAL_ENUM
+#else
+#define AL_INVALID_ENUM 0xA002
+#endif
+#endif
+
+#ifndef AL_INVALID_OPERATION
+#ifdef AL_ILLEGAL_COMMAND
+#define AL_INVALID_OPERATION AL_ILLEGAL_COMMAND
+#else
+#define AL_INVALID_OPERATION 0xA004
+#endif
+#endif
+
+/* NOTE: THIS IS NOT IN ANY HEADER */
+#ifndef ALC_INVALID_OPERATION
+#define ALC_INVALID_OPERATION 0xA006
+#endif
+
+#ifndef ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER
+#define ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER 0x311
+#endif
+
+#ifndef ALC_CAPTURE_DEVICE_SPECIFIER
+#define ALC_CAPTURE_DEVICE_SPECIFIER 0x310
+#endif
+
+#ifndef ALC_CAPTURE_SAMPLES
+#define ALC_CAPTURE_SAMPLES 0x312
+#endif
])
AC_DEFINE_UNQUOTED([AL_LIBS],
@@ -95,7 +191,7 @@
fi
AC_SUBST([BUILD_PACKAGE_BOOL])
-case "$target" in
+case "$host" in
*-mingw32) CALLCONV=stdcall ;;
*) CALLCONV=ccall ;;
esac
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/examples/test/TestDevice.hs ghc-6.4.2/libraries/OpenAL/examples/test/TestDevice.hs
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/examples/test/TestDevice.hs 2004-04-05 23:15:54.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/examples/test/TestDevice.hs 2006-03-22 00:58:04.000000000 +0900
@@ -1,8 +1,15 @@
-import Sound.OpenAL
+import Control.Monad ( unless )
+import System.IO ( hPutStrLn, stderr )
import System.Posix.Unistd ( sleep )
+import Sound.OpenAL
main :: IO ()
main = do
- dev <- openDevice (Just "'( ( devices '( native null ) ) )")
- sleep 1
- closeDevice dev
+ maybeDevice <- openDevice (Just "'( ( devices '( native null ) ) )")
+ case maybeDevice of
+ Nothing -> hPutStrLn stderr "openDevice failed"
+ Just device -> do
+ sleep 1
+ ok <- closeDevice device
+ unless ok $
+ hPutStrLn stderr "closeDevice failed"
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/include/HsOpenAL.h.in ghc-6.4.2/libraries/OpenAL/include/HsOpenAL.h.in
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/include/HsOpenAL.h.in 2004-01-03 04:03:10.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/include/HsOpenAL.h.in 2006-03-22 00:58:04.000000000 +0900
@@ -1,7 +1,7 @@
/* -----------------------------------------------------------------------------
*
* Module : C support for Sound.OpenAL
- * Copyright : (c) Sven Panne 2003-2004
+ * Copyright : (c) Sven Panne 2003-2005
* License : BSD-style (see the file libraries/OpenAL/LICENSE)
*
* Maintainer : sven.panne@aedion.de
@@ -22,11 +22,9 @@
#if defined(HAVE_AL_ALC_H)
#include <AL/al.h>
#include <AL/alc.h>
-#include <AL/alut.h>
#elif defined(HAVE_OPENAL_ALC_H)
#include <OpenAL/al.h>
#include <OpenAL/alc.h>
-#include <OpenAL/alut.h>
#endif
#endif
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/include/HsOpenALConfig.h.in ghc-6.4.2/libraries/OpenAL/include/HsOpenALConfig.h.in
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/include/HsOpenALConfig.h.in 2005-03-12 08:13:22.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/include/HsOpenALConfig.h.in 2006-04-19 04:36:53.000000000 +0900
@@ -1,5 +1,17 @@
/* include/HsOpenALConfig.h.in. Generated from configure.ac by autoheader. */
+/* Define to 1 if `alcCloseDevice' returns void. */
+#undef ALCCLOSEDEVICE_VOID
+
+/* Define to 1 if `alcDestroyContext' returns void. */
+#undef ALCDESTROYCONTEXT_VOID
+
+/* Define to 1 if `alcMakeContextCurrent' returns void. */
+#undef ALCMAKECONTEXTCURRENT_VOID
+
+/* Define to 1 if `alcProcessContext' returns void. */
+#undef ALCPROCESSCONTEXT_VOID
+
/* Framework flags for AL, as a list of string literals. */
#undef AL_FRAMEWORKS
@@ -12,6 +24,15 @@
/* The value of ALC_ATTRIBUTES_SIZE. */
#undef CONST_ALC_ATTRIBUTES_SIZE
+/* The value of ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER. */
+#undef CONST_ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER
+
+/* The value of ALC_CAPTURE_DEVICE_SPECIFIER. */
+#undef CONST_ALC_CAPTURE_DEVICE_SPECIFIER
+
+/* The value of ALC_CAPTURE_SAMPLES. */
+#undef CONST_ALC_CAPTURE_SAMPLES
+
/* The value of ALC_DEFAULT_DEVICE_SPECIFIER. */
#undef CONST_ALC_DEFAULT_DEVICE_SPECIFIER
@@ -21,6 +42,9 @@
/* The value of ALC_EXTENSIONS. */
#undef CONST_ALC_EXTENSIONS
+/* The value of ALC_FALSE. */
+#undef CONST_ALC_FALSE
+
/* The value of ALC_FREQUENCY. */
#undef CONST_ALC_FREQUENCY
@@ -33,6 +57,9 @@
/* The value of ALC_INVALID_ENUM. */
#undef CONST_ALC_INVALID_ENUM
+/* The value of ALC_INVALID_OPERATION. */
+#undef CONST_ALC_INVALID_OPERATION
+
/* The value of ALC_INVALID_VALUE. */
#undef CONST_ALC_INVALID_VALUE
@@ -42,6 +69,9 @@
/* The value of ALC_MINOR_VERSION. */
#undef CONST_ALC_MINOR_VERSION
+/* The value of ALC_MONO_SOURCES. */
+#undef CONST_ALC_MONO_SOURCES
+
/* The value of ALC_NO_ERROR. */
#undef CONST_ALC_NO_ERROR
@@ -51,11 +81,197 @@
/* The value of ALC_REFRESH. */
#undef CONST_ALC_REFRESH
+/* The value of ALC_STEREO_SOURCES. */
+#undef CONST_ALC_STEREO_SOURCES
+
/* The value of ALC_SYNC. */
#undef CONST_ALC_SYNC
-/* The value of AL_FORMAT_VORBIS_EXT. */
-#undef CONST_AL_FORMAT_VORBIS_EXT
+/* The value of ALC_TRUE. */
+#undef CONST_ALC_TRUE
+
+/* The value of AL_BITS. */
+#undef CONST_AL_BITS
+
+/* The value of AL_BUFFER. */
+#undef CONST_AL_BUFFER
+
+/* The value of AL_BUFFERS_PROCESSED. */
+#undef CONST_AL_BUFFERS_PROCESSED
+
+/* The value of AL_BUFFERS_QUEUED. */
+#undef CONST_AL_BUFFERS_QUEUED
+
+/* The value of AL_BYTE_OFFSET. */
+#undef CONST_AL_BYTE_OFFSET
+
+/* The value of AL_CHANNELS. */
+#undef CONST_AL_CHANNELS
+
+/* The value of AL_CONE_INNER_ANGLE. */
+#undef CONST_AL_CONE_INNER_ANGLE
+
+/* The value of AL_CONE_OUTER_ANGLE. */
+#undef CONST_AL_CONE_OUTER_ANGLE
+
+/* The value of AL_CONE_OUTER_GAIN. */
+#undef CONST_AL_CONE_OUTER_GAIN
+
+/* The value of AL_DIRECTION. */
+#undef CONST_AL_DIRECTION
+
+/* The value of AL_DISTANCE_MODEL. */
+#undef CONST_AL_DISTANCE_MODEL
+
+/* The value of AL_DOPPLER_FACTOR. */
+#undef CONST_AL_DOPPLER_FACTOR
+
+/* The value of AL_EXPONENT_DISTANCE. */
+#undef CONST_AL_EXPONENT_DISTANCE
+
+/* The value of AL_EXPONENT_DISTANCE_CLAMPED. */
+#undef CONST_AL_EXPONENT_DISTANCE_CLAMPED
+
+/* The value of AL_EXTENSIONS. */
+#undef CONST_AL_EXTENSIONS
+
+/* The value of AL_FALSE. */
+#undef CONST_AL_FALSE
+
+/* The value of AL_FORMAT_MONO16. */
+#undef CONST_AL_FORMAT_MONO16
+
+/* The value of AL_FORMAT_MONO8. */
+#undef CONST_AL_FORMAT_MONO8
+
+/* The value of AL_FORMAT_STEREO16. */
+#undef CONST_AL_FORMAT_STEREO16
+
+/* The value of AL_FORMAT_STEREO8. */
+#undef CONST_AL_FORMAT_STEREO8
+
+/* The value of AL_FREQUENCY. */
+#undef CONST_AL_FREQUENCY
+
+/* The value of AL_GAIN. */
+#undef CONST_AL_GAIN
+
+/* The value of AL_INITIAL. */
+#undef CONST_AL_INITIAL
+
+/* The value of AL_INVALID_ENUM. */
+#undef CONST_AL_INVALID_ENUM
+
+/* The value of AL_INVALID_NAME. */
+#undef CONST_AL_INVALID_NAME
+
+/* The value of AL_INVALID_OPERATION. */
+#undef CONST_AL_INVALID_OPERATION
+
+/* The value of AL_INVALID_VALUE. */
+#undef CONST_AL_INVALID_VALUE
+
+/* The value of AL_INVERSE_DISTANCE. */
+#undef CONST_AL_INVERSE_DISTANCE
+
+/* The value of AL_INVERSE_DISTANCE_CLAMPED. */
+#undef CONST_AL_INVERSE_DISTANCE_CLAMPED
+
+/* The value of AL_LINEAR_DISTANCE. */
+#undef CONST_AL_LINEAR_DISTANCE
+
+/* The value of AL_LINEAR_DISTANCE_CLAMPED. */
+#undef CONST_AL_LINEAR_DISTANCE_CLAMPED
+
+/* The value of AL_LOOPING. */
+#undef CONST_AL_LOOPING
+
+/* The value of AL_MAX_DISTANCE. */
+#undef CONST_AL_MAX_DISTANCE
+
+/* The value of AL_MAX_GAIN. */
+#undef CONST_AL_MAX_GAIN
+
+/* The value of AL_MIN_GAIN. */
+#undef CONST_AL_MIN_GAIN
+
+/* The value of AL_NONE. */
+#undef CONST_AL_NONE
+
+/* The value of AL_NO_ERROR. */
+#undef CONST_AL_NO_ERROR
+
+/* The value of AL_ORIENTATION. */
+#undef CONST_AL_ORIENTATION
+
+/* The value of AL_OUT_OF_MEMORY. */
+#undef CONST_AL_OUT_OF_MEMORY
+
+/* The value of AL_PAUSED. */
+#undef CONST_AL_PAUSED
+
+/* The value of AL_PITCH. */
+#undef CONST_AL_PITCH
+
+/* The value of AL_PLAYING. */
+#undef CONST_AL_PLAYING
+
+/* The value of AL_POSITION. */
+#undef CONST_AL_POSITION
+
+/* The value of AL_REFERENCE_DISTANCE. */
+#undef CONST_AL_REFERENCE_DISTANCE
+
+/* The value of AL_RENDERER. */
+#undef CONST_AL_RENDERER
+
+/* The value of AL_ROLLOFF_FACTOR. */
+#undef CONST_AL_ROLLOFF_FACTOR
+
+/* The value of AL_SAMPLE_OFFSET. */
+#undef CONST_AL_SAMPLE_OFFSET
+
+/* The value of AL_SEC_OFFSET. */
+#undef CONST_AL_SEC_OFFSET
+
+/* The value of AL_SIZE. */
+#undef CONST_AL_SIZE
+
+/* The value of AL_SOURCE_RELATIVE. */
+#undef CONST_AL_SOURCE_RELATIVE
+
+/* The value of AL_SOURCE_STATE. */
+#undef CONST_AL_SOURCE_STATE
+
+/* The value of AL_SOURCE_TYPE. */
+#undef CONST_AL_SOURCE_TYPE
+
+/* The value of AL_SPEED_OF_SOUND. */
+#undef CONST_AL_SPEED_OF_SOUND
+
+/* The value of AL_STATIC. */
+#undef CONST_AL_STATIC
+
+/* The value of AL_STOPPED. */
+#undef CONST_AL_STOPPED
+
+/* The value of AL_STREAMING. */
+#undef CONST_AL_STREAMING
+
+/* The value of AL_TRUE. */
+#undef CONST_AL_TRUE
+
+/* The value of AL_UNDETERMINED. */
+#undef CONST_AL_UNDETERMINED
+
+/* The value of AL_VELOCITY. */
+#undef CONST_AL_VELOCITY
+
+/* The value of AL_VENDOR. */
+#undef CONST_AL_VENDOR
+
+/* The value of AL_VERSION. */
+#undef CONST_AL_VERSION
/* Define to 1 if you have the <AL/alc.h> header file. */
#undef HAVE_AL_ALC_H
@@ -63,6 +279,9 @@
/* Define to 1 if you have the <AL/alext.h> header file. */
#undef HAVE_AL_ALEXT_H
+/* Define to 1 if you have the <AL/al.h> header file. */
+#undef HAVE_AL_AL_H
+
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
@@ -75,6 +294,9 @@
/* Define to 1 if you have the <OpenAL/alext.h> header file. */
#undef HAVE_OPENAL_ALEXT_H
+/* Define to 1 if you have the <OpenAL/al.h> header file. */
+#undef HAVE_OPENAL_AL_H
+
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
@@ -96,23 +318,50 @@
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
-/* Define to Haskell type for ALbitfield */
-#undef HTYPE_ALBITFIELD
-
/* Define to Haskell type for ALboolean */
#undef HTYPE_ALBOOLEAN
/* Define to Haskell type for ALbyte */
#undef HTYPE_ALBYTE
+/* Define to Haskell type for ALCboolean */
+#undef HTYPE_ALCBOOLEAN
+
+/* Define to Haskell type for ALCbyte */
+#undef HTYPE_ALCBYTE
+
+/* Define to Haskell type for ALCchar */
+#undef HTYPE_ALCCHAR
+
+/* Define to Haskell type for ALCdouble */
+#undef HTYPE_ALCDOUBLE
+
/* Define to Haskell type for ALCenum */
#undef HTYPE_ALCENUM
-/* Define to Haskell type for ALclampd */
-#undef HTYPE_ALCLAMPD
+/* Define to Haskell type for ALCfloat */
+#undef HTYPE_ALCFLOAT
+
+/* Define to Haskell type for ALchar */
+#undef HTYPE_ALCHAR
+
+/* Define to Haskell type for ALCint */
+#undef HTYPE_ALCINT
+
+/* Define to Haskell type for ALCshort */
+#undef HTYPE_ALCSHORT
+
+/* Define to Haskell type for ALCsizei */
+#undef HTYPE_ALCSIZEI
+
+/* Define to Haskell type for ALCubyte */
+#undef HTYPE_ALCUBYTE
+
+/* Define to Haskell type for ALCuint */
+#undef HTYPE_ALCUINT
-/* Define to Haskell type for ALclampf */
-#undef HTYPE_ALCLAMPF
+/* Define to Haskell type for ALCushort */
+#undef HTYPE_ALCUSHORT
/* Define to Haskell type for ALdouble */
#undef HTYPE_ALDOUBLE
diff -uNr --exclude=autom4te.cache --exclude=.cvsignore hugs98-Mar2005-patched/fptools/libraries/OpenAL/package.conf.in ghc-6.4.2/libraries/OpenAL/package.conf.in
--- hugs98-Mar2005-patched/fptools/libraries/OpenAL/package.conf.in 2005-02-19 00:06:43.000000000 +0900
+++ ghc-6.4.2/libraries/OpenAL/package.conf.in 2006-03-22 00:58:03.000000000 +0900
@@ -9,27 +9,36 @@
exposed-modules:
Sound.OpenAL,
Sound.OpenAL.AL,
+ Sound.OpenAL.AL.ALboolean,
+ Sound.OpenAL.AL.Attenuation,
Sound.OpenAL.AL.BasicTypes,
Sound.OpenAL.AL.Buffer,
+ Sound.OpenAL.AL.BufferInternal,
+ Sound.OpenAL.AL.Doppler,
+ Sound.OpenAL.AL.Errors,
+ Sound.OpenAL.AL.Extensions,
+ Sound.OpenAL.AL.Format,
Sound.OpenAL.AL.Listener,
Sound.OpenAL.AL.Source,
+ Sound.OpenAL.AL.StringQueries,
Sound.OpenAL.ALC,
+ Sound.OpenAL.ALC.BasicTypes,
+ Sound.OpenAL.ALC.Capture,
Sound.OpenAL.ALC.Context,
Sound.OpenAL.ALC.Device,
Sound.OpenAL.ALC.Errors,
- Sound.OpenAL.ALC.Extensions,
- Sound.OpenAL.ALUT,
- Sound.OpenAL.ALUT.Initialization,
- Sound.OpenAL.ALUT.WAV
+ Sound.OpenAL.ALC.Extensions
hidden-modules:
- Sound.OpenAL.AL.ALboolean,
- Sound.OpenAL.AL.Format,
Sound.OpenAL.AL.PeekPoke,
Sound.OpenAL.AL.QueryUtils,
- Sound.OpenAL.ALC.BasicTypes,
- Sound.OpenAL.ALC.Queries,
- Sound.OpenAL.ALUT.Exception
+ Sound.OpenAL.AL.SourceState,
+ Sound.OpenAL.AL.String,
+ Sound.OpenAL.ALC.ALCboolean,
+ Sound.OpenAL.ALC.QueryUtils,
+ Sound.OpenAL.ALC.String,
+ Sound.OpenAL.Config,
+ Sound.OpenAL.Constants
import-dirs: IMPORT_DIR