diff options
author | Andrey Nazarov <skuller@skuller.net> | 2010-05-09 17:06:27 +0000 |
---|---|---|
committer | Andrey Nazarov <skuller@skuller.net> | 2010-05-09 17:06:27 +0000 |
commit | 633c832e43c42bce0a685a93acfc3937c84ed6bb (patch) | |
tree | 93f1da6ad3d2e66ec52a6b7548343dccb67facdf /source/qal_api.c | |
parent | 1f3c71bf0acc8cf7d8893acfdc4ed0e24dde2e0e (diff) |
Added support for OpenAL sound output, activated by setting ‘s_enable’ cvar to 2.
Added ‘al_driver’ cvar for choosing what OpenAL library to link dynamically with.
Diffstat (limited to 'source/qal_api.c')
-rw-r--r-- | source/qal_api.c | 122 |
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; +} + |