Vegastrike 0.5.1 rc1  1.0
Original sources for Vegastrike Evolved
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
al_init.cpp
Go to the documentation of this file.
1 #include "audiolib.h"
2 #include "config_xml.h"
3 #include "xml_support.h"
4 #include "vs_globals.h"
5 
6 #ifdef HAVE_AL
7 #ifdef __APPLE__
8 #include <al.h>
9 #include <alc.h>
10 #define KeyMap AppleKeyMap
11 #undef KeyMap
12 #else
13 #include <AL/al.h>
14 #include <AL/alc.h>
15 #endif
16 #include <stdlib.h>
17 #include <stdio.h>
18 #include "al_globals.h"
19 #include <vector>
20 
21 #if 1
22 #define AL_GET_PROC( name ) ( alGetProcAddress( const_cast< ALubyte* > ( reinterpret_cast< const ALubyte* > (name) ) ) )
23 #else
24 #define AL_GET_PROC( name ) ( alGetProcAddress( name ) )
25 #endif
26 
27 static void fixup_function_pointers( void )
28 {
29  /* UNCOMMENT AS NEEDED
30  * talcGetAudioChannel = (ALfloat (*)(ALuint channel))
31  * GP("alcGetAudioChannel_LOKI");
32  * talcSetAudioChannel = (void (*)(ALuint channel, ALfloat volume))
33  * GP("alcSetAudioChannel_LOKI");
34  *
35  * talMute = (void (*)(ALvoid)) GP("alMute_LOKI");
36  * talUnMute = (void (*)(ALvoid)) GP("alUnMute_LOKI");
37  *
38  * talReverbScale = (void (*)(ALuint sid, ALfloat param))
39  * GP("alReverbScale_LOKI");
40  * talReverbDelay = (void (*)(ALuint sid, ALfloat param))
41  * GP("alReverbDelay_LOKI");
42  *
43  * talBombOnError = (void (*)(void))
44  * GP("alBombOnError_LOKI");
45  *
46  * if(talBombOnError == NULL) {
47  * VSFileSystem::vs_fprintf(stderr,
48  * "Could not GetProcAddress alBombOnError_LOKI\n");
49  * exit(1);
50  * }
51  *
52  * talBufferi = (void (*)(ALuint, ALenum, ALint ))
53  * GP("alBufferi_LOKI");
54  *
55  * if(talBufferi == NULL) {
56  * VSFileSystem::vs_fprintf(stderr,
57  * "Could not GetProcAddress alBufferi_LOKI\n");
58  * exit(1);
59  * }
60  *
61  * alCaptureInit = (ALboolean (*)( ALenum, ALuint, ALsizei )) GP("alCaptureInit_EXT");
62  * alCaptureDestroy = (ALboolean (*)( ALvoid )) GP("alCaptureDestroy_EXT");
63  * alCaptureStart = (ALboolean (*)( ALvoid )) GP("alCaptureStart_EXT");
64  * alCaptureStop = (ALboolean (*)( ALvoid )) GP("alCaptureStop_EXT");
65  * alCaptureGetData = (ALsizei (*)( ALvoid*, ALsizei, ALenum, ALuint )) GP("alCaptureGetData_EXT");
66  *
67  * talBufferAppendData = (ALuint (*)(ALuint, ALenum, ALvoid *, ALint, ALint)) GP("alBufferAppendData_LOKI");
68  * talBufferAppendWriteData = (ALuint (*)(ALuint, ALenum, ALvoid *, ALint, ALint, ALenum)) GP("alBufferAppendWriteData_LOKI");
69  *
70  * talGenStreamingBuffers = (void (*)(ALsizei n, ALuint *bids )) GP("alGenStreamingBuffers_LOKI");
71  * if( talGenStreamingBuffers == NULL ) {
72  * VSFileSystem::vs_fprintf( stderr, "Could not GP alGenStreamingBuffers_LOKI\n");
73  * exit(1);
74  * }
75  *
76  *
77  *
78  */
79 }
80 #endif
81 void AUDChangeVolume( float volume )
82 {
83 #ifdef HAVE_AL
84  if (volume == 0) {
85  usepositional = false;
86  return;
87  } else {
88  usepositional = true;
89  }
90  scalepos = 1./volume;
91 #endif
92 }
93 float AUDGetVolume()
94 {
95 #ifdef HAVE_AL
96  return 1./scalepos;
97 
98 #else
99  return 1;
100 #endif
101 }
102 void AUDChangeDoppler( float doppler )
103 {
104 #ifdef HAVE_AL
105  if (doppler <= 0)
106  usedoppler = false;
107  else
108  usedoppler = true;
109  scalevel = doppler;
110 #endif
111 }
113 {
114 #ifdef HAVE_AL
115  return scalevel;
116 
117 #else
118  return 1;
119 #endif
120 }
121 
122 #ifdef HAVE_AL
123 static ALCdevice *dev = NULL;
125 
126 #ifndef _WIN32
127 static ALvoid *context_id = NULL;
128 #else
129 static ALCcontext *context_id = NULL;
130 #endif
131 #endif
132 bool AUDInit()
133 {
135  g_game.music_enabled = false;
136 #ifdef HAVE_AL
137  usedoppler = XMLSupport::parse_bool( vs_config->getVariable( "audio", "Doppler", "false" ) );
138  usepositional = XMLSupport::parse_bool( vs_config->getVariable( "audio", "Positional", "true" ) );
139  double linuxadjust=1;
140 #ifndef _WIN32
141 #ifndef __APPLE__
142  linuxadjust=1./3.;
143 #endif
144 #endif
145  scalepos = 1.0f/(XMLSupport::parse_float( vs_config->getVariable( "audio", "Volume", "100" ) )
146  *linuxadjust
147  );
148  scalevel = XMLSupport::parse_float( vs_config->getVariable( "audio", "DopplerScale", "1" ) );
149  //enabled = XMLSupport::parse_bool (vs_config->getVariable ("audio","enabled","true"));
150  g_game.audio_frequency_mode = XMLSupport::parse_int( vs_config->getVariable( "audio", "frequency", "48000" ) );
151  maxallowedsingle = XMLSupport::parse_int( vs_config->getVariable( "audio", "MaxSingleSounds", "8" ) );
153  maxallowedtotal = XMLSupport::parse_int( vs_config->getVariable( "audio", "MaxTotalSounds", "20" ) );
154  bool sound_enabled = XMLSupport::parse_bool( vs_config->getVariable( "audio", "Sound", "true" ) );
155  bool music_enabled = XMLSupport::parse_bool( vs_config->getVariable( "audio", "Music", "true" ) );
156  if (!sound_enabled && !music_enabled)
157  return false;
158  int attrlist[] = {ALC_FREQUENCY, g_game.audio_frequency_mode, 0};
159 #ifdef _WIN32
160  dev = alcOpenDevice( (ALCchar*)"DirectSound3D" );
161  // dev = alcOpenDevice( (ALCubyte*)"DirectSound3D" ); pre update. New includes barf on ubyte. cannot convert parameter.
162 #else
163 #ifdef __APPLE__
164  dev = alcOpenDevice( "sdl" );
165  if (dev == NULL)
166  dev = alcOpenDevice( NULL );
167 #else
168  dev = alcOpenDevice( NULL );
169 #endif
170 #endif
171  if (dev == NULL)
172  return false;
173  context_id = alcCreateContext( dev, attrlist );
174  if (context_id == NULL) {
175  alcCloseDevice( dev );
176  return false;
177  }
178  alcMakeContextCurrent( (ALCcontext*) context_id );
179 
180  fixup_function_pointers();
181  ALenum alGetEr = 0;
182  ALuint cursrc;
183  alGetError();
184  alGenSources( 1, &cursrc );
185  alGetEr = alGetError();
186  while (alGetEr == 0) {
187  unusedsrcs.push_back( cursrc );
188  if (unusedsrcs.size() >= maxallowedtotal)
189  break;
190  alGenSources( 1, &cursrc );
191  alGetEr = alGetError();
192  }
193 
194  alDistanceModel(AL_INVERSE_DISTANCE_CLAMPED);
195 
196  g_game.sound_enabled = sound_enabled;
197  g_game.music_enabled = music_enabled;
198 
199  return true;
200 #endif
201  return false;
202 }
203 
205 {
206 #ifdef HAVE_AL
207  //Go through and delete all loaded wavs
208  unsigned int i;
209  for (i = 0; i < sounds.size(); i++) {
210  if (sounds[i].buffer != 0)
211  AUDStopPlaying( i );
212  AUDDeleteSound( i );
213  }
214  for (i = 0; i < unusedsrcs.size(); i++)
215  alDeleteSources( 1, &unusedsrcs[i] );
216  for (i = 0; i < buffers.size(); i++)
217  alDeleteBuffers( 1, &buffers[i] );
218  buffers.clear();
219  if (context_id)
220  alcDestroyContext( (ALCcontext*) context_id );
221  if (dev)
222  alcCloseDevice( dev );
223 #endif
224 }
225