wolf3d-ios/wolf3d/code/env/openal_binding.c

335 lines
11 KiB
C

/*
Copyright (C) 2004 Michael Liebscher
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
* openal_binding.c: Interface to OpenAL library.
*
* Author: Michael Liebscher <johnnycanuck@users.sourceforge.net>
* Date: 2004
*
*/
#include "../wolfiphone.h"
#ifdef _WIN32
HINSTANCE hinstOpenAL;
#elif __unix__
void *OpenALLib;
#elif IPHONE
void *OpenALLib;
// from here on in this file, behave like unix
#define __unix__ 1
#else
#error "Please define interface to OpenAL library!"
#endif
/*
-----------------------------------------------------------------------------
Function: OpenAL_Shutdown -Shutdown interface to OpenAL.
Parameters: Nothing.
Returns: Nothing.
Notes:
Unloads the specified Dynamic Link Library then NULLs out all the
proc pointers.
-----------------------------------------------------------------------------
*/
PUBLIC void OpenAL_Shutdown( void )
{
#ifdef _WIN32
if( hinstOpenAL )
{
FreeLibrary( hinstOpenAL );
hinstOpenAL = NULL;
}
hinstOpenAL = NULL;
#elif __unix__
if( OpenALLib )
{
dlclose( OpenALLib );
OpenALLib = NULL;
}
OpenALLib = NULL;
#else
#error "Please define interface to OpenAL library!"
#endif
pfalcCloseDevice = NULL;
pfalcCreateContext = NULL;
pfalcDestroyContext = NULL;
pfalcGetContextsDevice = NULL;
pfalcGetCurrentContext = NULL;
pfalcGetEnumValue = NULL;
pfalcGetError = NULL;
pfalcGetIntegerv = NULL;
pfalcGetProcAddress = NULL;
pfalcGetString = NULL;
pfalcIsExtensionPresent = NULL;
pfalcMakeContextCurrent = NULL;
pfalcOpenDevice = NULL;
pfalcProcessContext = NULL;
pfalcSuspendContext = NULL;
pfalGenBuffers = NULL;
pfalDeleteBuffers = NULL;
pfalIsBuffer = NULL;
pfalBufferData = NULL;
pfalGetBufferf = NULL;
pfalGetBufferi = NULL;
pfalEnable = NULL;
pfalDisable = NULL;
pfalDopplerFactor = NULL;
pfalDopplerVelocity = NULL;
pfalDistanceModel = NULL;
pfalGetBoolean = NULL;
pfalGetBooleanv = NULL;
pfalGetDouble = NULL;
pfalGetDoublev = NULL;
pfalGetFloat = NULL;
pfalGetFloatv = NULL;
pfalGetInteger = NULL;
pfalGetIntegerv = NULL;
pfalGetEnumValue = NULL;
pfalGetError = NULL;
pfalGetProcAddress = NULL;
pfalGetString = NULL;
pfalIsExtensionPresent = NULL;
pfalIsEnabled = NULL;
pfalListenerf = NULL;
pfalListener3f = NULL;
pfalListenerfv = NULL;
pfalListeneri = NULL;
pfalGetListenerf = NULL;
pfalGetListener3f = NULL;
pfalGetListenerfv = NULL;
pfalGetListeneri = NULL;
pfalGenSources = NULL;
pfalDeleteSources = NULL;
pfalIsSource = NULL;
pfalSourcef = NULL;
pfalSourcefv = NULL;
pfalSource3f = NULL;
pfalSourcei = NULL;
pfalGetSourcef = NULL;
pfalGetSource3f = NULL;
pfalGetSourcefv = NULL;
pfalGetSourcei = NULL;
pfalSourcePlay = NULL;
pfalSourcePlayv = NULL;
pfalSourcePause = NULL;
pfalSourcePausev = NULL;
pfalSourceStop = NULL;
pfalSourceStopv = NULL;
pfalSourceRewind = NULL;
pfalSourceRewindv = NULL;
pfalSourceQueueBuffers = NULL;
pfalSourceUnqueueBuffers = NULL;
}
#ifdef _WIN32
#define GPA( a ) GetProcAddress( hinstOpenAL, a )
#elif __unix__
#define GPA( a ) dlsym( OpenALLib, a )
#else
#error "Please define interface to OpenAL library!"
#endif
/*
-----------------------------------------------------------------------------
Function: OpenAL_Init -Setup interface to OpenAL.
Parameters: dllname -[in] Name of the OpenAL dynamic link library.
Returns: true on success, otherwise false.
Notes:
This is responsible for binding our al function pointers to
the appropriate OpenAL stuff. In Windows this means doing a
LoadLibrary and a bunch of calls to GetProcAddress. On other
operating systems we need to do the right thing, whatever that
might be.
-----------------------------------------------------------------------------
*/
PUBLIC _boolean OpenAL_Init( const char *dllname )
{
#ifdef _WIN32
char buffer[ 1024 ], *ptr;
SearchPath( NULL, dllname, NULL, sizeof( buffer ) - 1, buffer, &ptr );
Com_Printf( "...calling LoadLibrary( %s ): ", buffer );
if( ( hinstOpenAL = LoadLibrary( dllname ) ) == 0 )
{
char *buf = NULL;
Com_Printf( "failed\n" );
FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, GetLastError(),
MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
(LPTSTR) &buf, 0, NULL );
Com_Printf( "%s\n", buf );
return false;
}
#elif __unix__
Com_Printf( "...calling dlopen( %s ): ", dllname );
if( ( OpenALLib = dlopen( dllname, RTLD_LAZY | RTLD_GLOBAL ) ) == 0 )
{
Com_Printf( "failed\n" );
Com_Printf( "%s\n", dlerror() );
return false;
}
#else
#error "Please define interface to OpenAL library!"
#endif
Com_Printf( "succeeded\n" );
if( ! (pfalcCloseDevice = (ALCCLOSEDEVICE)GPA( "alcCloseDevice" )) ) return false;
if( ! (pfalcCreateContext = (ALCCREATECONTEXT)GPA( "alcCreateContext" )) ) return false;
if( ! (pfalcDestroyContext = (ALCDESTROYCONTEXT)GPA( "alcDestroyContext" )) ) return false;
if( ! (pfalcGetContextsDevice = (ALCGETCONTEXTSDEVICE)GPA( "alcGetContextsDevice" )) ) return false;
if( ! (pfalcGetCurrentContext = (ALCGETCURRENTCONTEXT)GPA( "alcGetCurrentContext" )) ) return false;
if( ! (pfalcGetEnumValue = (ALCGETENUMVALUE)GPA( "alcGetEnumValue" )) ) return false;
if( ! (pfalcGetError = (ALCGETERROR)GPA( "alcGetError" )) ) return false;
if( ! (pfalcGetIntegerv = (ALCGETINTEGERV)GPA( "alcGetIntegerv" )) ) return false;
if( ! (pfalcGetProcAddress = (ALCGETPROCADDRESS)GPA( "alcGetProcAddress" )) ) return false;
if( ! (pfalcGetString = (ALCGETSTRING)GPA( "alcGetString" )) ) return false;
if( ! (pfalcIsExtensionPresent = (ALCISEXTENSIONPRESENT)GPA( "alcIsExtensionPresent" )) ) return false;
if( ! (pfalcMakeContextCurrent = (ALCMAKECONTEXTCURRENT)GPA( "alcMakeContextCurrent" )) ) return false;
if( ! (pfalcOpenDevice = (ALCOPENDEVICE)GPA( "alcOpenDevice" )) ) return false;
if( ! (pfalcProcessContext = (ALCPROCESSCONTEXT)GPA( "alcProcessContext" )) ) return false;
if( ! (pfalcSuspendContext = (ALCSUSPENDCONTEXT)GPA( "alcSuspendContext" )) ) return false;
if( ! (pfalGenBuffers = (ALGENBUFFERS)GPA("alGenBuffers")) ) return false;
if( ! (pfalDeleteBuffers = (ALDELETEBUFFERS)GPA("alDeleteBuffers")) ) return false;
if( ! (pfalIsBuffer = (ALISBUFFER)GPA("alIsBuffer")) ) return false;
if( ! (pfalBufferData = (ALBUFFERDATA)GPA("alBufferData")) ) return false;
if( ! (pfalGetBufferf = (ALGETBUFFERF)GPA("alGetBufferf")) ) return false;
if( ! (pfalGetBufferi = (ALGETBUFFERI)GPA("alGetBufferi")) ) return false;
if( ! (pfalEnable = (ALENABLE)GPA("alEnable")) ) return false;
if( ! (pfalDisable = (ALDISABLE)GPA("alDisable")) ) return false;
if( ! (pfalDopplerFactor = (ALDOPPLERFACTOR)GPA("alDopplerFactor")) ) return false;
if( ! (pfalDopplerVelocity = (ALDOPPLERVELOCITY)GPA("alDopplerVelocity")) ) return false;
if( ! (pfalDistanceModel = (ALDISTANCEMODEL)GPA("alDistanceModel")) ) return false;
if( ! (pfalGetBoolean = (ALGETBOOLEAN)GPA("alGetBoolean")) ) return false;
if( ! (pfalGetBooleanv = (ALGETBOOLEANV)GPA("alGetBooleanv")) ) return false;
if( ! (pfalGetDouble = (ALGETDOUBLE)GPA("alGetDouble")) ) return false;
if( ! (pfalGetDoublev = (ALGETDOUBLEV)GPA("alGetDoublev")) ) return false;
if( ! (pfalGetFloat = (ALGETFLOAT)GPA("alGetFloat")) ) return false;
if( ! (pfalGetFloatv = (ALGETFLOATV)GPA("alGetFloatv")) ) return false;
if( ! (pfalGetInteger = (ALGETINTEGER)GPA("alGetInteger")) ) return false;
if( ! (pfalGetIntegerv = (ALGETINTEGERV)GPA("alGetIntegerv")) ) return false;
if( ! (pfalGetEnumValue = (ALGETENUMVALUE)GPA("alGetEnumValue")) ) return false;
if( ! (pfalGetError = (ALGETERROR)GPA("alGetError")) ) return false;
if( ! (pfalGetProcAddress = (ALGETPROCADDRESS)GPA("alGetProcAddress")) ) return false;
if( ! (pfalGetString = (ALGETSTRING)GPA("alGetString")) ) return false;
if( ! (pfalIsExtensionPresent = (ALISEXTENSIONPRESENT)GPA("alIsExtensionPresent")) ) return false;
if( ! (pfalIsEnabled = (ALISENABLED)GPA("alIsEnabled")) ) return false;
if( ! (pfalListenerf = (ALLISTENERF)GPA("alListenerf")) ) return false;
if( ! (pfalListener3f = (ALLISTENER3F)GPA("alListener3f")) ) return false;
if( ! (pfalListenerfv = (ALLISTENERFV)GPA("alListenerfv")) ) return false;
if( ! (pfalListeneri = (ALLISTENERI)GPA("alListeneri")) ) return false;
if( ! (pfalGetListenerf = (ALGETLISTENERF)GPA("alGetListenerf")) ) return false;
if( ! (pfalGetListener3f = (ALGETLISTENER3F)GPA("alGetListener3f")) ) return false;
if( ! (pfalGetListenerfv = (ALGETLISTENERFV)GPA("alGetListenerfv")) ) return false;
if( ! (pfalGetListeneri = (ALGETLISTENERI)GPA("alGetListeneri")) ) return false;
if( ! (pfalGenSources = (ALGENSOURCES)GPA("alGenSources")) ) return false;
if( ! (pfalDeleteSources = (ALDELETESOURCES)GPA("alDeleteSources")) ) return false;
if( ! (pfalIsSource = (ALISSOURCE)GPA("alIsSource")) ) return false;
if( ! (pfalSourcef = (ALSOURCEF)GPA("alSourcef")) ) return false;
if( ! (pfalSourcefv = (ALSOURCEFV)GPA("alSourcefv")) ) return false;
if( ! (pfalSource3f = (ALSOURCE3F)GPA("alSource3f")) ) return false;
if( ! (pfalSourcei = (ALSOURCEI)GPA("alSourcei")) ) return false;
if( ! (pfalGetSourcef = (ALGETSOURCEF)GPA("alGetSourcef")) ) return false;
if( ! (pfalGetSource3f = (ALGETSOURCE3F)GPA("alGetSource3f")) ) return false;
if( ! (pfalGetSourcefv = (ALGETSOURCEFV)GPA("alGetSourcefv")) ) return false;
if( ! (pfalGetSourcei = (ALGETSOURCEI)GPA("alGetSourcei")) ) return false;
if( ! (pfalSourcePlay = (ALSOURCEPLAY)GPA("alSourcePlay")) ) return false;
if( ! (pfalSourcePlayv = (ALSOURCEPLAYV)GPA("alSourcePlayv")) ) return false;
if( ! (pfalSourcePause = (ALSOURCEPAUSE)GPA("alSourcePause")) ) return false;
if( ! (pfalSourcePausev = (ALSOURCEPAUSEV)GPA("alSourcePausev")) ) return false;
if( ! (pfalSourceStop = (ALSOURCESTOP)GPA("alSourceStop")) ) return false;
if( ! (pfalSourceStopv = (ALSOURCESTOPV)GPA("alSourceStopv")) ) return false;
if( ! (pfalSourceRewind = (ALSOURCEREWIND)GPA("alSourceRewind")) ) return false;
if( ! (pfalSourceRewindv = (ALSOURCEREWINDV)GPA("alSourceRewindv")) ) return false;
if( ! (pfalSourceQueueBuffers = (ALSOURCEQUEUEBUFFERS)GPA("alSourceQueueBuffers")) ) return false;
if( ! (pfalSourceUnqueueBuffers = (ALSOURCEUNQUEUEBUFFERS)GPA("alSourceUnqueueBuffers")) ) return false;
return true;
}