summaryrefslogtreecommitdiff
path: root/source/qal_api.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/qal_api.c')
-rw-r--r--source/qal_api.c122
1 files changed, 122 insertions, 0 deletions
diff --git a/source/qal_api.c b/source/qal_api.c
new file mode 100644
index 0000000..c2f53e7
--- /dev/null
+++ b/source/qal_api.c
@@ -0,0 +1,122 @@
+/*
+Copyright (C) 2010 skuller.net
+
+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.
+
+*/
+
+#include "com_local.h"
+#include "sys_public.h"
+#include "qal_api.h"
+#include <AL/alc.h>
+
+#define QALC_IMP \
+ QAL( LPALCCREATECONTEXT, alcCreateContext ); \
+ QAL( LPALCMAKECONTEXTCURRENT, alcMakeContextCurrent ); \
+ QAL( LPALCPROCESSCONTEXT, alcProcessContext ); \
+ QAL( LPALCSUSPENDCONTEXT, alcSuspendContext ); \
+ QAL( LPALCDESTROYCONTEXT, alcDestroyContext ); \
+ QAL( LPALCGETCURRENTCONTEXT, alcGetCurrentContext ); \
+ QAL( LPALCGETCONTEXTSDEVICE, alcGetContextsDevice ); \
+ QAL( LPALCOPENDEVICE, alcOpenDevice ); \
+ QAL( LPALCCLOSEDEVICE, alcCloseDevice ); \
+ QAL( LPALCGETERROR, alcGetError ); \
+ QAL( LPALCISEXTENSIONPRESENT, alcIsExtensionPresent ); \
+ QAL( LPALCGETPROCADDRESS, alcGetProcAddress ); \
+ QAL( LPALCGETENUMVALUE, alcGetEnumValue ); \
+ QAL( LPALCGETSTRING, alcGetString ); \
+ QAL( LPALCGETINTEGERV, alcGetIntegerv ); \
+ QAL( LPALCCAPTUREOPENDEVICE, alcCaptureOpenDevice ); \
+ QAL( LPALCCAPTURECLOSEDEVICE, alcCaptureCloseDevice ); \
+ QAL( LPALCCAPTURESTART, alcCaptureStart ); \
+ QAL( LPALCCAPTURESTOP, alcCaptureStop ); \
+ QAL( LPALCCAPTURESAMPLES, alcCaptureSamples );
+
+static cvar_t *al_driver;
+
+static void *handle;
+static ALCdevice *device;
+static ALCcontext *context;
+
+#define QAL(type,func) static type q##func;
+QALC_IMP
+#undef QAL
+
+#define QAL(type,func) type q##func;
+QAL_IMP
+#undef QAL
+
+void QAL_Shutdown( void ) {
+ if( context ) {
+ qalcMakeContextCurrent( NULL );
+ qalcDestroyContext( context );
+ context = NULL;
+ }
+ if( device ) {
+ qalcCloseDevice( device );
+ device = NULL;
+ }
+
+#define QAL(type,func) q##func = NULL;
+QALC_IMP
+QAL_IMP
+#undef QAL
+
+ Sys_FreeLibrary( handle );
+ handle = NULL;
+}
+
+qboolean QAL_Init( void ) {
+ al_driver = Cvar_Get( "al_driver", DEFAULT_OPENAL_DRIVER, 0 );
+
+ Sys_LoadLibrary( al_driver->string, NULL, &handle );
+ if( !handle ) {
+ return qfalse;
+ }
+
+#define QAL(type,func) q##func = Sys_GetProcAddress( handle, #func );
+QALC_IMP
+QAL_IMP
+#undef QAL
+
+ Com_DPrintf( "...opening OpenAL device: " );
+ device = qalcOpenDevice( NULL );
+ if( !device ) {
+ goto fail;
+ }
+ Com_DPrintf( "ok\n" );
+
+ Com_DPrintf( "...creating OpenAL context: " );
+ context = qalcCreateContext( device, NULL );
+ if( !context ) {
+ goto fail;
+ }
+ Com_DPrintf( "ok\n" );
+
+ Com_DPrintf( "...making context current: " );
+ if( !qalcMakeContextCurrent( context ) ) {
+ goto fail;
+ }
+ Com_DPrintf( "ok\n" );
+
+ return qtrue;
+
+fail:
+ Com_DPrintf( "failed\n" );
+ QAL_Shutdown();
+ return qfalse;
+}
+