summaryrefslogtreecommitdiff
path: root/source/qal_api.c
blob: eb62ea433b0de783f4add3646c9192d3169e3b33 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/*
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 cvar_t   *al_device;

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 );
    al_device = Cvar_Get( "al_device", "", 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( al_device->string[0] ? al_device->string : 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;
}