]> gitweb.factorcode.org Git - factor.git/blobdiff - extra/openal/openal.factor
use radix literals
[factor.git] / extra / openal / openal.factor
old mode 100644 (file)
new mode 100755 (executable)
index bccdec1..6591518
@@ -1,28 +1,23 @@
 ! Copyright (C) 2007 Chris Double.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel accessors arrays alien system combinators
-alien.syntax namespaces alien.c-types sequences vocabs.loader
-shuffle openal.backend alien.libraries generalizations
-specialized-arrays ;
-FROM: alien.c-types => float short ;
+alien.syntax namespaces sequences vocabs.loader
+shuffle alien.libraries generalizations
+specialized-arrays alien.destructors alien.data ;
+FROM: alien.c-types => char double float int short uchar uint
+ushort void ;
 SPECIALIZED-ARRAY: uint
 IN: openal
 
-<< "alut" {
-        { [ os windows? ]  [ "alut.dll" ] }
-        { [ os macosx? ] [
-            "/System/Library/Frameworks/OpenAL.framework/OpenAL"
-        ] }
-        { [ os unix?  ]  [ "libalut.so" ] }
-    } cond "cdecl" add-library >>
-
 << "openal" {
         { [ os windows? ]  [ "OpenAL32.dll" ] }
         { [ os macosx? ] [
             "/System/Library/Frameworks/OpenAL.framework/OpenAL"
         ] }
         { [ os unix?  ]  [ "libopenal.so" ] }
-    } cond "cdecl" add-library >>
+    } cond cdecl add-library >>
+
+<< os unix? [ "openal" deploy-library ] unless >>
 
 LIBRARY: openal
 
@@ -43,71 +38,71 @@ CONSTANT: AL_INVALID -1
 CONSTANT: AL_NONE 0
 CONSTANT: AL_FALSE 0
 CONSTANT: AL_TRUE 1
-CONSTANT: AL_SOURCE_RELATIVE HEX: 202
-CONSTANT: AL_CONE_INNER_ANGLE HEX: 1001
-CONSTANT: AL_CONE_OUTER_ANGLE HEX: 1002
-CONSTANT: AL_PITCH HEX: 1003
-CONSTANT: AL_POSITION HEX: 1004
-CONSTANT: AL_DIRECTION HEX: 1005
-CONSTANT: AL_VELOCITY HEX: 1006
-CONSTANT: AL_LOOPING HEX: 1007
-CONSTANT: AL_BUFFER HEX: 1009
-CONSTANT: AL_GAIN HEX: 100A
-CONSTANT: AL_MIN_GAIN HEX: 100D
-CONSTANT: AL_MAX_GAIN HEX: 100E
-CONSTANT: AL_ORIENTATION HEX: 100F
-CONSTANT: AL_CHANNEL_MASK HEX: 3000
-CONSTANT: AL_SOURCE_STATE HEX: 1010
-CONSTANT: AL_INITIAL HEX: 1011
-CONSTANT: AL_PLAYING HEX: 1012
-CONSTANT: AL_PAUSED HEX: 1013
-CONSTANT: AL_STOPPED HEX: 1014
-CONSTANT: AL_BUFFERS_QUEUED HEX: 1015
-CONSTANT: AL_BUFFERS_PROCESSED HEX: 1016
-CONSTANT: AL_SEC_OFFSET HEX: 1024
-CONSTANT: AL_SAMPLE_OFFSET HEX: 1025
-CONSTANT: AL_BYTE_OFFSET HEX: 1026
-CONSTANT: AL_SOURCE_TYPE HEX: 1027
-CONSTANT: AL_STATIC HEX: 1028
-CONSTANT: AL_STREAMING HEX: 1029
-CONSTANT: AL_UNDETERMINED HEX: 1030
-CONSTANT: AL_FORMAT_MONO8 HEX: 1100
-CONSTANT: AL_FORMAT_MONO16 HEX: 1101
-CONSTANT: AL_FORMAT_STEREO8 HEX: 1102
-CONSTANT: AL_FORMAT_STEREO16 HEX: 1103
-CONSTANT: AL_REFERENCE_DISTANCE HEX: 1020
-CONSTANT: AL_ROLLOFF_FACTOR HEX: 1021
-CONSTANT: AL_CONE_OUTER_GAIN HEX: 1022
-CONSTANT: AL_MAX_DISTANCE HEX: 1023
-CONSTANT: AL_FREQUENCY HEX: 2001
-CONSTANT: AL_BITS HEX: 2002
-CONSTANT: AL_CHANNELS HEX: 2003
-CONSTANT: AL_SIZE HEX: 2004
-CONSTANT: AL_UNUSED HEX: 2010
-CONSTANT: AL_PENDING HEX: 2011
-CONSTANT: AL_PROCESSED HEX: 2012
+CONSTANT: AL_SOURCE_RELATIVE 0x202
+CONSTANT: AL_CONE_INNER_ANGLE 0x1001
+CONSTANT: AL_CONE_OUTER_ANGLE 0x1002
+CONSTANT: AL_PITCH 0x1003
+CONSTANT: AL_POSITION 0x1004
+CONSTANT: AL_DIRECTION 0x1005
+CONSTANT: AL_VELOCITY 0x1006
+CONSTANT: AL_LOOPING 0x1007
+CONSTANT: AL_BUFFER 0x1009
+CONSTANT: AL_GAIN 0x100A
+CONSTANT: AL_MIN_GAIN 0x100D
+CONSTANT: AL_MAX_GAIN 0x100E
+CONSTANT: AL_ORIENTATION 0x100F
+CONSTANT: AL_CHANNEL_MASK 0x3000
+CONSTANT: AL_SOURCE_STATE 0x1010
+CONSTANT: AL_INITIAL 0x1011
+CONSTANT: AL_PLAYING 0x1012
+CONSTANT: AL_PAUSED 0x1013
+CONSTANT: AL_STOPPED 0x1014
+CONSTANT: AL_BUFFERS_QUEUED 0x1015
+CONSTANT: AL_BUFFERS_PROCESSED 0x1016
+CONSTANT: AL_SEC_OFFSET 0x1024
+CONSTANT: AL_SAMPLE_OFFSET 0x1025
+CONSTANT: AL_BYTE_OFFSET 0x1026
+CONSTANT: AL_SOURCE_TYPE 0x1027
+CONSTANT: AL_STATIC 0x1028
+CONSTANT: AL_STREAMING 0x1029
+CONSTANT: AL_UNDETERMINED 0x1030
+CONSTANT: AL_FORMAT_MONO8 0x1100
+CONSTANT: AL_FORMAT_MONO16 0x1101
+CONSTANT: AL_FORMAT_STEREO8 0x1102
+CONSTANT: AL_FORMAT_STEREO16 0x1103
+CONSTANT: AL_REFERENCE_DISTANCE 0x1020
+CONSTANT: AL_ROLLOFF_FACTOR 0x1021
+CONSTANT: AL_CONE_OUTER_GAIN 0x1022
+CONSTANT: AL_MAX_DISTANCE 0x1023
+CONSTANT: AL_FREQUENCY 0x2001
+CONSTANT: AL_BITS 0x2002
+CONSTANT: AL_CHANNELS 0x2003
+CONSTANT: AL_SIZE 0x2004
+CONSTANT: AL_UNUSED 0x2010
+CONSTANT: AL_PENDING 0x2011
+CONSTANT: AL_PROCESSED 0x2012
 CONSTANT: AL_NO_ERROR AL_FALSE
-CONSTANT: AL_INVALID_NAME HEX: A001
-CONSTANT: AL_ILLEGAL_ENUM HEX: A002
-CONSTANT: AL_INVALID_ENUM HEX: A002
-CONSTANT: AL_INVALID_VALUE HEX: A003
-CONSTANT: AL_ILLEGAL_COMMAND HEX: A004
-CONSTANT: AL_INVALID_OPERATION HEX: A004
-CONSTANT: AL_OUT_OF_MEMORY HEX: A005
-CONSTANT: AL_VENDOR HEX: B001
-CONSTANT: AL_VERSION HEX: B002
-CONSTANT: AL_RENDERER HEX: B003
-CONSTANT: AL_EXTENSIONS HEX: B004
-CONSTANT: AL_DOPPLER_FACTOR HEX: C000
-CONSTANT: AL_DOPPLER_VELOCITY HEX: C001
-CONSTANT: AL_SPEED_OF_SOUND HEX: C003
-CONSTANT: AL_DISTANCE_MODEL HEX: D000
-CONSTANT: AL_INVERSE_DISTANCE HEX: D001
-CONSTANT: AL_INVERSE_DISTANCE_CLAMPED HEX: D002
-CONSTANT: AL_LINEAR_DISTANCE HEX: D003
-CONSTANT: AL_LINEAR_DISTANCE_CLAMPED HEX: D004
-CONSTANT: AL_EXPONENT_DISTANCE HEX: D005
-CONSTANT: AL_EXPONENT_DISTANCE_CLAMPED HEX: D006
+CONSTANT: AL_INVALID_NAME 0xA001
+CONSTANT: AL_ILLEGAL_ENUM 0xA002
+CONSTANT: AL_INVALID_ENUM 0xA002
+CONSTANT: AL_INVALID_VALUE 0xA003
+CONSTANT: AL_ILLEGAL_COMMAND 0xA004
+CONSTANT: AL_INVALID_OPERATION 0xA004
+CONSTANT: AL_OUT_OF_MEMORY 0xA005
+CONSTANT: AL_VENDOR 0xB001
+CONSTANT: AL_VERSION 0xB002
+CONSTANT: AL_RENDERER 0xB003
+CONSTANT: AL_EXTENSIONS 0xB004
+CONSTANT: AL_DOPPLER_FACTOR 0xC000
+CONSTANT: AL_DOPPLER_VELOCITY 0xC001
+CONSTANT: AL_SPEED_OF_SOUND 0xC003
+CONSTANT: AL_DISTANCE_MODEL 0xD000
+CONSTANT: AL_INVERSE_DISTANCE 0xD001
+CONSTANT: AL_INVERSE_DISTANCE_CLAMPED 0xD002
+CONSTANT: AL_LINEAR_DISTANCE 0xD003
+CONSTANT: AL_LINEAR_DISTANCE_CLAMPED 0xD004
+CONSTANT: AL_EXPONENT_DISTANCE 0xD005
+CONSTANT: AL_EXPONENT_DISTANCE_CLAMPED 0xD006
 
 FUNCTION: void alEnable ( ALenum capability ) ;
 FUNCTION: void alDisable ( ALenum capability ) ; 
@@ -183,92 +178,85 @@ FUNCTION: void alDopplerVelocity ( ALfloat value ) ;
 FUNCTION: void alSpeedOfSound ( ALfloat value ) ;
 FUNCTION: void alDistanceModel ( ALenum distanceModel ) ;
 
-LIBRARY: alut
+C-TYPE: ALCdevice
+C-TYPE: ALCcontext
+TYPEDEF: char ALCboolean
+TYPEDEF: char ALCchar
+TYPEDEF: int ALCenum
+TYPEDEF: int ALCint
+TYPEDEF: int ALCsizei
+TYPEDEF: uint ALCuint
 
-CONSTANT: ALUT_API_MAJOR_VERSION 1
-CONSTANT: ALUT_API_MINOR_VERSION 1
-CONSTANT: ALUT_ERROR_NO_ERROR 0
-CONSTANT: ALUT_ERROR_OUT_OF_MEMORY HEX: 200
-CONSTANT: ALUT_ERROR_INVALID_ENUM HEX: 201
-CONSTANT: ALUT_ERROR_INVALID_VALUE HEX: 202
-CONSTANT: ALUT_ERROR_INVALID_OPERATION HEX: 203
-CONSTANT: ALUT_ERROR_NO_CURRENT_CONTEXT HEX: 204
-CONSTANT: ALUT_ERROR_AL_ERROR_ON_ENTRY HEX: 205
-CONSTANT: ALUT_ERROR_ALC_ERROR_ON_ENTRY HEX: 206
-CONSTANT: ALUT_ERROR_OPEN_DEVICE HEX: 207
-CONSTANT: ALUT_ERROR_CLOSE_DEVICE HEX: 208
-CONSTANT: ALUT_ERROR_CREATE_CONTEXT HEX: 209
-CONSTANT: ALUT_ERROR_MAKE_CONTEXT_CURRENT HEX: 20A
-CONSTANT: ALUT_ERROR_DESTRY_CONTEXT HEX: 20B
-CONSTANT: ALUT_ERROR_GEN_BUFFERS HEX: 20C
-CONSTANT: ALUT_ERROR_BUFFER_DATA HEX: 20D
-CONSTANT: ALUT_ERROR_IO_ERROR HEX: 20E
-CONSTANT: ALUT_ERROR_UNSUPPORTED_FILE_TYPE HEX: 20F
-CONSTANT: ALUT_ERROR_UNSUPPORTED_FILE_SUBTYPE HEX: 210
-CONSTANT: ALUT_ERROR_CORRUPT_OR_TRUNCATED_DATA HEX: 211
-CONSTANT: ALUT_WAVEFORM_SINE HEX: 100
-CONSTANT: ALUT_WAVEFORM_SQUARE HEX: 101
-CONSTANT: ALUT_WAVEFORM_SAWTOOTH HEX: 102
-CONSTANT: ALUT_WAVEFORM_WHITENOISE HEX: 103
-CONSTANT: ALUT_WAVEFORM_IMPULSE HEX: 104
-CONSTANT: ALUT_LOADER_BUFFER HEX: 300
-CONSTANT: ALUT_LOADER_MEMORY HEX: 301
+CONSTANT: ALC_FALSE                                0
+CONSTANT: ALC_TRUE                                 1
+CONSTANT: ALC_FREQUENCY                            0x1007
+CONSTANT: ALC_REFRESH                              0x1008
+CONSTANT: ALC_SYNC                                 0x1009
+CONSTANT: ALC_MONO_SOURCES                         0x1010
+CONSTANT: ALC_STEREO_SOURCES                       0x1011
 
-FUNCTION: ALboolean alutInit ( int* argcp, char** argv ) ;
-FUNCTION: ALboolean alutInitWithoutContext ( int* argcp, char** argv ) ;
-FUNCTION: ALboolean alutExit ( ) ;
-FUNCTION: ALenum alutGetError ( ) ;
-FUNCTION: char* alutGetErrorString ( ALenum error ) ;
-FUNCTION: ALuint alutCreateBufferFromFile ( char* fileName ) ;
-FUNCTION: ALuint alutCreateBufferFromFileImage ( void* data, ALsizei length ) ;
-FUNCTION: ALuint alutCreateBufferHelloWorld ( ) ;
-FUNCTION: ALuint alutCreateBufferWaveform ( ALenum waveshape, ALfloat frequency, ALfloat phase, ALfloat duration ) ;
-FUNCTION: void* alutLoadMemoryFromFile ( char* fileName, ALenum* format, ALsizei* size, ALfloat* frequency ) ;
-FUNCTION: void* alutLoadMemoryFromFileImage ( void* data, ALsizei length, ALenum* format, ALsizei* size, ALfloat* frequency ) ;
-FUNCTION: void* alutLoadMemoryHelloWorld ( ALenum* format, ALsizei* size, ALfloat* frequency ) ;
-FUNCTION: void* alutLoadMemoryWaveform ( ALenum waveshape, ALfloat frequency, ALfloat phase, ALfloat duration, ALenum* format, ALsizei* size, ALfloat* freq ) ;
-FUNCTION: char* alutGetMIMETypes ( ALenum loader ) ;
-FUNCTION: ALint alutGetMajorVersion ( ) ;
-FUNCTION: ALint alutGetMinorVersion ( ) ;
-FUNCTION: ALboolean alutSleep ( ALfloat duration ) ;
+CONSTANT: ALC_NO_ERROR                             0
 
-FUNCTION: void alutUnloadWAV ( ALenum format, void* data, ALsizei size, ALsizei frequency ) ;
+CONSTANT: ALC_INVALID_DEVICE                       0xA001
+CONSTANT: ALC_INVALID_CONTEXT                      0xA002
+CONSTANT: ALC_INVALID_ENUM                         0xA003
+CONSTANT: ALC_INVALID_VALUE                        0xA004
+CONSTANT: ALC_OUT_OF_MEMORY                        0xA005
 
-SYMBOL: init
+CONSTANT: ALC_DEFAULT_DEVICE_SPECIFIER             0x1004
+CONSTANT: ALC_DEVICE_SPECIFIER                     0x1005
+CONSTANT: ALC_EXTENSIONS                           0x1006
 
-: init-openal ( -- )
-    init get-global expired? [
-        f f alutInit 0 = [ "Could not initialize OpenAL" throw ] when
-        1337 <alien> init set-global
-    ] when ;
+CONSTANT: ALC_MAJOR_VERSION                        0x1000
+CONSTANT: ALC_MINOR_VERSION                        0x1001
 
-: exit-openal ( -- )
-    init get-global expired? [
-        alutExit 0 = [ "Could not close OpenAL" throw ] when
-        f init set-global
-    ] unless ;
+CONSTANT: ALC_ATTRIBUTES_SIZE                      0x1002
+CONSTANT: ALC_ALL_ATTRIBUTES                       0x1003
+CONSTANT: ALC_DEFAULT_ALL_DEVICES_SPECIFIER        0x1012
+CONSTANT: ALC_ALL_DEVICES_SPECIFIER                0x1013
+CONSTANT: ALC_CAPTURE_DEVICE_SPECIFIER             0x310
+CONSTANT: ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER     0x311
+CONSTANT: ALC_CAPTURE_SAMPLES                      0x312
 
-: gen-sources ( size -- seq )
-    dup <uint-array> [ alGenSources ] keep ;
+FUNCTION: ALCdevice* alcOpenDevice ( ALCchar* deviceSpecifier ) ;
+FUNCTION: ALCboolean alcCloseDevice ( ALCdevice* deviceHandle ) ;
 
-: gen-buffers ( size -- seq )
-    dup <uint-array> [ alGenBuffers ] keep ;
+: alcCloseDevice* ( deviceHandle -- )
+    alcCloseDevice drop ;
 
-: gen-buffer ( -- buffer ) 1 gen-buffers first ;
+FUNCTION: ALCcontext* alcCreateContext ( ALCdevice* deviceHandle, ALCint* attrList ) ;
+FUNCTION: ALCboolean alcMakeContextCurrent ( ALCcontext* context ) ;
+FUNCTION: void alcProcessContext ( ALCcontext* context ) ;
+FUNCTION: void alcSuspendContext ( ALCcontext* context ) ;
+FUNCTION: void alcDestroyContext ( ALCcontext* context ) ;
+FUNCTION: ALCcontext* alcGetCurrentContext ( ) ;
+FUNCTION: ALCdevice* alcGetContextsDevice ( ALCcontext* context ) ;
+FUNCTION: ALCboolean alcIsExtensionPresent ( ALCdevice* deviceHandle, ALCchar* extName ) ;
+FUNCTION: void* alcGetProcAddress ( ALCdevice* deviceHandle, ALCchar* funcName ) ;
+FUNCTION: ALCenum alcGetEnumValue ( ALCdevice* deviceHandle, ALCchar* enumName ) ;
+FUNCTION: ALCenum alcGetError ( ALCdevice* deviceHandle ) ;
+FUNCTION: ALCchar* alcGetString ( ALCdevice* deviceHandle, ALCenum token ) ;
+FUNCTION: void alcGetIntegerv ( ALCdevice* deviceHandle, ALCenum token, ALCsizei size, ALCint* dest ) ;
+
+FUNCTION: ALCdevice* alcCaptureOpenDevice ( ALCchar* deviceName, ALCuint freq, ALCenum fmt, ALCsizei bufsize ) ;
+FUNCTION: ALCboolean alcCaptureCloseDevice ( ALCdevice* device ) ;
+FUNCTION: void alcCaptureStart ( ALCdevice* device ) ;
+FUNCTION: void alcCaptureStop ( ALCdevice* device ) ;
+FUNCTION: void alcCaptureSamples ( ALCdevice* device, void* buf, ALCsizei samps ) ;
 
-: create-buffer-from-file ( filename -- buffer )
-    alutCreateBufferFromFile dup AL_NONE = [
-        "create-buffer-from-file failed" throw
-    ] when ;
+DESTRUCTOR: alcCloseDevice*
+DESTRUCTOR: alcDestroyContext
 
-os macosx? "openal.macosx" "openal.other" ? require
+: gen-sources ( size -- seq )
+    dup uint <c-array> [ alGenSources ] keep ;
 
-: create-buffer-from-wav ( filename -- buffer )
-    gen-buffer dup rot load-wav-file
-    [ alBufferData ] 4 nkeep alutUnloadWAV ;
+: gen-buffers ( size -- seq )
+    dup uint <c-array> [ alGenBuffers ] keep ;
+
+: gen-buffer ( -- buffer ) 1 gen-buffers first ;
 
 : queue-buffers ( source buffers -- )
-    [ length ] [ >uint-array ] bi alSourceQueueBuffers ;
+    [ length ] [ uint >c-array ] bi alSourceQueueBuffers ;
 
 : queue-buffer ( source buffer -- )
     1array queue-buffers ;
@@ -277,24 +265,17 @@ os macosx? "openal.macosx" "openal.other" ? require
     alSourcei ;
 
 : get-source-param ( source param -- value )
-    0 <uint> dup [ alGetSourcei ] dip *uint ;
+    0 uint <ref> dup [ alGetSourcei ] dip uint deref ;
 
 : set-buffer-param ( source param value -- )
     alBufferi ;
 
 : get-buffer-param ( source param -- value )
-    0 <uint> dup [ alGetBufferi ] dip *uint ;
+    0 uint <ref> dup [ alGetBufferi ] dip uint deref ;
 
 : source-play ( source -- ) alSourcePlay ;
 
 : source-stop ( source -- ) alSourceStop ;
 
-: check-error ( -- )
-    alGetError dup ALUT_ERROR_NO_ERROR = [
-        drop
-    ] [
-        alGetString throw
-    ] if ;
-
 : source-playing? ( source -- bool )
     AL_SOURCE_STATE get-source-param AL_PLAYING = ;