alEffect.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716
  1. /**
  2. * OpenAL cross platform audio library
  3. * Copyright (C) 1999-2007 by authors.
  4. * This library is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU Library General Public
  6. * License as published by the Free Software Foundation; either
  7. * version 2 of the License, or (at your option) any later version.
  8. *
  9. * This library is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * Library General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Library General Public
  15. * License along with this library; if not, write to the
  16. * Free Software Foundation, Inc.,
  17. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  18. * Or go to http://www.gnu.org/copyleft/lgpl.html
  19. */
  20. #include "config.h"
  21. #include <stdlib.h>
  22. #include <math.h>
  23. #include <float.h>
  24. #include "AL/al.h"
  25. #include "AL/alc.h"
  26. #include "alMain.h"
  27. #include "alEffect.h"
  28. #include "alThunk.h"
  29. #include "alError.h"
  30. ALboolean DisabledEffects[MAX_EFFECTS];
  31. extern inline void LockEffectsRead(ALCdevice *device);
  32. extern inline void UnlockEffectsRead(ALCdevice *device);
  33. extern inline void LockEffectsWrite(ALCdevice *device);
  34. extern inline void UnlockEffectsWrite(ALCdevice *device);
  35. extern inline struct ALeffect *LookupEffect(ALCdevice *device, ALuint id);
  36. extern inline struct ALeffect *RemoveEffect(ALCdevice *device, ALuint id);
  37. extern inline ALboolean IsReverbEffect(ALenum type);
  38. static void InitEffectParams(ALeffect *effect, ALenum type);
  39. AL_API ALvoid AL_APIENTRY alGenEffects(ALsizei n, ALuint *effects)
  40. {
  41. ALCdevice *device;
  42. ALCcontext *context;
  43. ALsizei cur;
  44. context = GetContextRef();
  45. if(!context) return;
  46. if(!(n >= 0))
  47. SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
  48. device = context->Device;
  49. for(cur = 0;cur < n;cur++)
  50. {
  51. ALeffect *effect = al_calloc(16, sizeof(ALeffect));
  52. ALenum err = AL_OUT_OF_MEMORY;
  53. if(!effect || (err=InitEffect(effect)) != AL_NO_ERROR)
  54. {
  55. al_free(effect);
  56. alDeleteEffects(cur, effects);
  57. SET_ERROR_AND_GOTO(context, err, done);
  58. }
  59. err = NewThunkEntry(&effect->id);
  60. if(err == AL_NO_ERROR)
  61. err = InsertUIntMapEntry(&device->EffectMap, effect->id, effect);
  62. if(err != AL_NO_ERROR)
  63. {
  64. FreeThunkEntry(effect->id);
  65. memset(effect, 0, sizeof(ALeffect));
  66. al_free(effect);
  67. alDeleteEffects(cur, effects);
  68. SET_ERROR_AND_GOTO(context, err, done);
  69. }
  70. effects[cur] = effect->id;
  71. }
  72. done:
  73. ALCcontext_DecRef(context);
  74. }
  75. AL_API ALvoid AL_APIENTRY alDeleteEffects(ALsizei n, const ALuint *effects)
  76. {
  77. ALCdevice *device;
  78. ALCcontext *context;
  79. ALeffect *effect;
  80. ALsizei i;
  81. context = GetContextRef();
  82. if(!context) return;
  83. device = context->Device;
  84. LockEffectsWrite(device);
  85. if(!(n >= 0))
  86. SET_ERROR_AND_GOTO(context, AL_INVALID_VALUE, done);
  87. for(i = 0;i < n;i++)
  88. {
  89. if(effects[i] && LookupEffect(device, effects[i]) == NULL)
  90. SET_ERROR_AND_GOTO(context, AL_INVALID_NAME, done);
  91. }
  92. for(i = 0;i < n;i++)
  93. {
  94. if((effect=RemoveEffect(device, effects[i])) == NULL)
  95. continue;
  96. FreeThunkEntry(effect->id);
  97. memset(effect, 0, sizeof(*effect));
  98. al_free(effect);
  99. }
  100. done:
  101. UnlockEffectsWrite(device);
  102. ALCcontext_DecRef(context);
  103. }
  104. AL_API ALboolean AL_APIENTRY alIsEffect(ALuint effect)
  105. {
  106. ALCcontext *Context;
  107. ALboolean result;
  108. Context = GetContextRef();
  109. if(!Context) return AL_FALSE;
  110. LockEffectsRead(Context->Device);
  111. result = ((!effect || LookupEffect(Context->Device, effect)) ?
  112. AL_TRUE : AL_FALSE);
  113. UnlockEffectsRead(Context->Device);
  114. ALCcontext_DecRef(Context);
  115. return result;
  116. }
  117. AL_API ALvoid AL_APIENTRY alEffecti(ALuint effect, ALenum param, ALint value)
  118. {
  119. ALCcontext *Context;
  120. ALCdevice *Device;
  121. ALeffect *ALEffect;
  122. Context = GetContextRef();
  123. if(!Context) return;
  124. Device = Context->Device;
  125. LockEffectsWrite(Device);
  126. if((ALEffect=LookupEffect(Device, effect)) == NULL)
  127. alSetError(Context, AL_INVALID_NAME);
  128. else
  129. {
  130. if(param == AL_EFFECT_TYPE)
  131. {
  132. ALboolean isOk = (value == AL_EFFECT_NULL);
  133. ALint i;
  134. for(i = 0;!isOk && EffectList[i].val;i++)
  135. {
  136. if(value == EffectList[i].val &&
  137. !DisabledEffects[EffectList[i].type])
  138. isOk = AL_TRUE;
  139. }
  140. if(isOk)
  141. InitEffectParams(ALEffect, value);
  142. else
  143. alSetError(Context, AL_INVALID_VALUE);
  144. }
  145. else
  146. {
  147. /* Call the appropriate handler */
  148. V(ALEffect,setParami)(Context, param, value);
  149. }
  150. }
  151. UnlockEffectsWrite(Device);
  152. ALCcontext_DecRef(Context);
  153. }
  154. AL_API ALvoid AL_APIENTRY alEffectiv(ALuint effect, ALenum param, const ALint *values)
  155. {
  156. ALCcontext *Context;
  157. ALCdevice *Device;
  158. ALeffect *ALEffect;
  159. switch(param)
  160. {
  161. case AL_EFFECT_TYPE:
  162. alEffecti(effect, param, values[0]);
  163. return;
  164. }
  165. Context = GetContextRef();
  166. if(!Context) return;
  167. Device = Context->Device;
  168. LockEffectsWrite(Device);
  169. if((ALEffect=LookupEffect(Device, effect)) == NULL)
  170. alSetError(Context, AL_INVALID_NAME);
  171. else
  172. {
  173. /* Call the appropriate handler */
  174. V(ALEffect,setParamiv)(Context, param, values);
  175. }
  176. UnlockEffectsWrite(Device);
  177. ALCcontext_DecRef(Context);
  178. }
  179. AL_API ALvoid AL_APIENTRY alEffectf(ALuint effect, ALenum param, ALfloat value)
  180. {
  181. ALCcontext *Context;
  182. ALCdevice *Device;
  183. ALeffect *ALEffect;
  184. Context = GetContextRef();
  185. if(!Context) return;
  186. Device = Context->Device;
  187. LockEffectsWrite(Device);
  188. if((ALEffect=LookupEffect(Device, effect)) == NULL)
  189. alSetError(Context, AL_INVALID_NAME);
  190. else
  191. {
  192. /* Call the appropriate handler */
  193. V(ALEffect,setParamf)(Context, param, value);
  194. }
  195. UnlockEffectsWrite(Device);
  196. ALCcontext_DecRef(Context);
  197. }
  198. AL_API ALvoid AL_APIENTRY alEffectfv(ALuint effect, ALenum param, const ALfloat *values)
  199. {
  200. ALCcontext *Context;
  201. ALCdevice *Device;
  202. ALeffect *ALEffect;
  203. Context = GetContextRef();
  204. if(!Context) return;
  205. Device = Context->Device;
  206. LockEffectsWrite(Device);
  207. if((ALEffect=LookupEffect(Device, effect)) == NULL)
  208. alSetError(Context, AL_INVALID_NAME);
  209. else
  210. {
  211. /* Call the appropriate handler */
  212. V(ALEffect,setParamfv)(Context, param, values);
  213. }
  214. UnlockEffectsWrite(Device);
  215. ALCcontext_DecRef(Context);
  216. }
  217. AL_API ALvoid AL_APIENTRY alGetEffecti(ALuint effect, ALenum param, ALint *value)
  218. {
  219. ALCcontext *Context;
  220. ALCdevice *Device;
  221. ALeffect *ALEffect;
  222. Context = GetContextRef();
  223. if(!Context) return;
  224. Device = Context->Device;
  225. LockEffectsRead(Device);
  226. if((ALEffect=LookupEffect(Device, effect)) == NULL)
  227. alSetError(Context, AL_INVALID_NAME);
  228. else
  229. {
  230. if(param == AL_EFFECT_TYPE)
  231. *value = ALEffect->type;
  232. else
  233. {
  234. /* Call the appropriate handler */
  235. V(ALEffect,getParami)(Context, param, value);
  236. }
  237. }
  238. UnlockEffectsRead(Device);
  239. ALCcontext_DecRef(Context);
  240. }
  241. AL_API ALvoid AL_APIENTRY alGetEffectiv(ALuint effect, ALenum param, ALint *values)
  242. {
  243. ALCcontext *Context;
  244. ALCdevice *Device;
  245. ALeffect *ALEffect;
  246. switch(param)
  247. {
  248. case AL_EFFECT_TYPE:
  249. alGetEffecti(effect, param, values);
  250. return;
  251. }
  252. Context = GetContextRef();
  253. if(!Context) return;
  254. Device = Context->Device;
  255. LockEffectsRead(Device);
  256. if((ALEffect=LookupEffect(Device, effect)) == NULL)
  257. alSetError(Context, AL_INVALID_NAME);
  258. else
  259. {
  260. /* Call the appropriate handler */
  261. V(ALEffect,getParamiv)(Context, param, values);
  262. }
  263. UnlockEffectsRead(Device);
  264. ALCcontext_DecRef(Context);
  265. }
  266. AL_API ALvoid AL_APIENTRY alGetEffectf(ALuint effect, ALenum param, ALfloat *value)
  267. {
  268. ALCcontext *Context;
  269. ALCdevice *Device;
  270. ALeffect *ALEffect;
  271. Context = GetContextRef();
  272. if(!Context) return;
  273. Device = Context->Device;
  274. LockEffectsRead(Device);
  275. if((ALEffect=LookupEffect(Device, effect)) == NULL)
  276. alSetError(Context, AL_INVALID_NAME);
  277. else
  278. {
  279. /* Call the appropriate handler */
  280. V(ALEffect,getParamf)(Context, param, value);
  281. }
  282. UnlockEffectsRead(Device);
  283. ALCcontext_DecRef(Context);
  284. }
  285. AL_API ALvoid AL_APIENTRY alGetEffectfv(ALuint effect, ALenum param, ALfloat *values)
  286. {
  287. ALCcontext *Context;
  288. ALCdevice *Device;
  289. ALeffect *ALEffect;
  290. Context = GetContextRef();
  291. if(!Context) return;
  292. Device = Context->Device;
  293. LockEffectsRead(Device);
  294. if((ALEffect=LookupEffect(Device, effect)) == NULL)
  295. alSetError(Context, AL_INVALID_NAME);
  296. else
  297. {
  298. /* Call the appropriate handler */
  299. V(ALEffect,getParamfv)(Context, param, values);
  300. }
  301. UnlockEffectsRead(Device);
  302. ALCcontext_DecRef(Context);
  303. }
  304. ALenum InitEffect(ALeffect *effect)
  305. {
  306. InitEffectParams(effect, AL_EFFECT_NULL);
  307. return AL_NO_ERROR;
  308. }
  309. ALvoid ReleaseALEffects(ALCdevice *device)
  310. {
  311. ALsizei i;
  312. for(i = 0;i < device->EffectMap.size;i++)
  313. {
  314. ALeffect *temp = device->EffectMap.values[i];
  315. device->EffectMap.values[i] = NULL;
  316. // Release effect structure
  317. FreeThunkEntry(temp->id);
  318. memset(temp, 0, sizeof(ALeffect));
  319. al_free(temp);
  320. }
  321. }
  322. static void InitEffectParams(ALeffect *effect, ALenum type)
  323. {
  324. switch(type)
  325. {
  326. case AL_EFFECT_EAXREVERB:
  327. effect->Props.Reverb.Density = AL_EAXREVERB_DEFAULT_DENSITY;
  328. effect->Props.Reverb.Diffusion = AL_EAXREVERB_DEFAULT_DIFFUSION;
  329. effect->Props.Reverb.Gain = AL_EAXREVERB_DEFAULT_GAIN;
  330. effect->Props.Reverb.GainHF = AL_EAXREVERB_DEFAULT_GAINHF;
  331. effect->Props.Reverb.GainLF = AL_EAXREVERB_DEFAULT_GAINLF;
  332. effect->Props.Reverb.DecayTime = AL_EAXREVERB_DEFAULT_DECAY_TIME;
  333. effect->Props.Reverb.DecayHFRatio = AL_EAXREVERB_DEFAULT_DECAY_HFRATIO;
  334. effect->Props.Reverb.DecayLFRatio = AL_EAXREVERB_DEFAULT_DECAY_LFRATIO;
  335. effect->Props.Reverb.ReflectionsGain = AL_EAXREVERB_DEFAULT_REFLECTIONS_GAIN;
  336. effect->Props.Reverb.ReflectionsDelay = AL_EAXREVERB_DEFAULT_REFLECTIONS_DELAY;
  337. effect->Props.Reverb.ReflectionsPan[0] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ;
  338. effect->Props.Reverb.ReflectionsPan[1] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ;
  339. effect->Props.Reverb.ReflectionsPan[2] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ;
  340. effect->Props.Reverb.LateReverbGain = AL_EAXREVERB_DEFAULT_LATE_REVERB_GAIN;
  341. effect->Props.Reverb.LateReverbDelay = AL_EAXREVERB_DEFAULT_LATE_REVERB_DELAY;
  342. effect->Props.Reverb.LateReverbPan[0] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ;
  343. effect->Props.Reverb.LateReverbPan[1] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ;
  344. effect->Props.Reverb.LateReverbPan[2] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ;
  345. effect->Props.Reverb.EchoTime = AL_EAXREVERB_DEFAULT_ECHO_TIME;
  346. effect->Props.Reverb.EchoDepth = AL_EAXREVERB_DEFAULT_ECHO_DEPTH;
  347. effect->Props.Reverb.ModulationTime = AL_EAXREVERB_DEFAULT_MODULATION_TIME;
  348. effect->Props.Reverb.ModulationDepth = AL_EAXREVERB_DEFAULT_MODULATION_DEPTH;
  349. effect->Props.Reverb.AirAbsorptionGainHF = AL_EAXREVERB_DEFAULT_AIR_ABSORPTION_GAINHF;
  350. effect->Props.Reverb.HFReference = AL_EAXREVERB_DEFAULT_HFREFERENCE;
  351. effect->Props.Reverb.LFReference = AL_EAXREVERB_DEFAULT_LFREFERENCE;
  352. effect->Props.Reverb.RoomRolloffFactor = AL_EAXREVERB_DEFAULT_ROOM_ROLLOFF_FACTOR;
  353. effect->Props.Reverb.DecayHFLimit = AL_EAXREVERB_DEFAULT_DECAY_HFLIMIT;
  354. SET_VTABLE1(ALeaxreverb, effect);
  355. break;
  356. case AL_EFFECT_REVERB:
  357. effect->Props.Reverb.Density = AL_REVERB_DEFAULT_DENSITY;
  358. effect->Props.Reverb.Diffusion = AL_REVERB_DEFAULT_DIFFUSION;
  359. effect->Props.Reverb.Gain = AL_REVERB_DEFAULT_GAIN;
  360. effect->Props.Reverb.GainHF = AL_REVERB_DEFAULT_GAINHF;
  361. effect->Props.Reverb.GainLF = 1.0f;
  362. effect->Props.Reverb.DecayTime = AL_REVERB_DEFAULT_DECAY_TIME;
  363. effect->Props.Reverb.DecayHFRatio = AL_REVERB_DEFAULT_DECAY_HFRATIO;
  364. effect->Props.Reverb.DecayLFRatio = 1.0f;
  365. effect->Props.Reverb.ReflectionsGain = AL_REVERB_DEFAULT_REFLECTIONS_GAIN;
  366. effect->Props.Reverb.ReflectionsDelay = AL_REVERB_DEFAULT_REFLECTIONS_DELAY;
  367. effect->Props.Reverb.ReflectionsPan[0] = 0.0f;
  368. effect->Props.Reverb.ReflectionsPan[1] = 0.0f;
  369. effect->Props.Reverb.ReflectionsPan[2] = 0.0f;
  370. effect->Props.Reverb.LateReverbGain = AL_REVERB_DEFAULT_LATE_REVERB_GAIN;
  371. effect->Props.Reverb.LateReverbDelay = AL_REVERB_DEFAULT_LATE_REVERB_DELAY;
  372. effect->Props.Reverb.LateReverbPan[0] = 0.0f;
  373. effect->Props.Reverb.LateReverbPan[1] = 0.0f;
  374. effect->Props.Reverb.LateReverbPan[2] = 0.0f;
  375. effect->Props.Reverb.EchoTime = 0.25f;
  376. effect->Props.Reverb.EchoDepth = 0.0f;
  377. effect->Props.Reverb.ModulationTime = 0.25f;
  378. effect->Props.Reverb.ModulationDepth = 0.0f;
  379. effect->Props.Reverb.AirAbsorptionGainHF = AL_REVERB_DEFAULT_AIR_ABSORPTION_GAINHF;
  380. effect->Props.Reverb.HFReference = 5000.0f;
  381. effect->Props.Reverb.LFReference = 250.0f;
  382. effect->Props.Reverb.RoomRolloffFactor = AL_REVERB_DEFAULT_ROOM_ROLLOFF_FACTOR;
  383. effect->Props.Reverb.DecayHFLimit = AL_REVERB_DEFAULT_DECAY_HFLIMIT;
  384. SET_VTABLE1(ALreverb, effect);
  385. break;
  386. case AL_EFFECT_CHORUS:
  387. effect->Props.Chorus.Waveform = AL_CHORUS_DEFAULT_WAVEFORM;
  388. effect->Props.Chorus.Phase = AL_CHORUS_DEFAULT_PHASE;
  389. effect->Props.Chorus.Rate = AL_CHORUS_DEFAULT_RATE;
  390. effect->Props.Chorus.Depth = AL_CHORUS_DEFAULT_DEPTH;
  391. effect->Props.Chorus.Feedback = AL_CHORUS_DEFAULT_FEEDBACK;
  392. effect->Props.Chorus.Delay = AL_CHORUS_DEFAULT_DELAY;
  393. SET_VTABLE1(ALchorus, effect);
  394. break;
  395. case AL_EFFECT_COMPRESSOR:
  396. effect->Props.Compressor.OnOff = AL_COMPRESSOR_DEFAULT_ONOFF;
  397. SET_VTABLE1(ALcompressor, effect);
  398. break;
  399. case AL_EFFECT_DISTORTION:
  400. effect->Props.Distortion.Edge = AL_DISTORTION_DEFAULT_EDGE;
  401. effect->Props.Distortion.Gain = AL_DISTORTION_DEFAULT_GAIN;
  402. effect->Props.Distortion.LowpassCutoff = AL_DISTORTION_DEFAULT_LOWPASS_CUTOFF;
  403. effect->Props.Distortion.EQCenter = AL_DISTORTION_DEFAULT_EQCENTER;
  404. effect->Props.Distortion.EQBandwidth = AL_DISTORTION_DEFAULT_EQBANDWIDTH;
  405. SET_VTABLE1(ALdistortion, effect);
  406. break;
  407. case AL_EFFECT_ECHO:
  408. effect->Props.Echo.Delay = AL_ECHO_DEFAULT_DELAY;
  409. effect->Props.Echo.LRDelay = AL_ECHO_DEFAULT_LRDELAY;
  410. effect->Props.Echo.Damping = AL_ECHO_DEFAULT_DAMPING;
  411. effect->Props.Echo.Feedback = AL_ECHO_DEFAULT_FEEDBACK;
  412. effect->Props.Echo.Spread = AL_ECHO_DEFAULT_SPREAD;
  413. SET_VTABLE1(ALecho, effect);
  414. break;
  415. case AL_EFFECT_EQUALIZER:
  416. effect->Props.Equalizer.LowCutoff = AL_EQUALIZER_DEFAULT_LOW_CUTOFF;
  417. effect->Props.Equalizer.LowGain = AL_EQUALIZER_DEFAULT_LOW_GAIN;
  418. effect->Props.Equalizer.Mid1Center = AL_EQUALIZER_DEFAULT_MID1_CENTER;
  419. effect->Props.Equalizer.Mid1Gain = AL_EQUALIZER_DEFAULT_MID1_GAIN;
  420. effect->Props.Equalizer.Mid1Width = AL_EQUALIZER_DEFAULT_MID1_WIDTH;
  421. effect->Props.Equalizer.Mid2Center = AL_EQUALIZER_DEFAULT_MID2_CENTER;
  422. effect->Props.Equalizer.Mid2Gain = AL_EQUALIZER_DEFAULT_MID2_GAIN;
  423. effect->Props.Equalizer.Mid2Width = AL_EQUALIZER_DEFAULT_MID2_WIDTH;
  424. effect->Props.Equalizer.HighCutoff = AL_EQUALIZER_DEFAULT_HIGH_CUTOFF;
  425. effect->Props.Equalizer.HighGain = AL_EQUALIZER_DEFAULT_HIGH_GAIN;
  426. SET_VTABLE1(ALequalizer, effect);
  427. break;
  428. case AL_EFFECT_FLANGER:
  429. effect->Props.Flanger.Waveform = AL_FLANGER_DEFAULT_WAVEFORM;
  430. effect->Props.Flanger.Phase = AL_FLANGER_DEFAULT_PHASE;
  431. effect->Props.Flanger.Rate = AL_FLANGER_DEFAULT_RATE;
  432. effect->Props.Flanger.Depth = AL_FLANGER_DEFAULT_DEPTH;
  433. effect->Props.Flanger.Feedback = AL_FLANGER_DEFAULT_FEEDBACK;
  434. effect->Props.Flanger.Delay = AL_FLANGER_DEFAULT_DELAY;
  435. SET_VTABLE1(ALflanger, effect);
  436. break;
  437. case AL_EFFECT_RING_MODULATOR:
  438. effect->Props.Modulator.Frequency = AL_RING_MODULATOR_DEFAULT_FREQUENCY;
  439. effect->Props.Modulator.HighPassCutoff = AL_RING_MODULATOR_DEFAULT_HIGHPASS_CUTOFF;
  440. effect->Props.Modulator.Waveform = AL_RING_MODULATOR_DEFAULT_WAVEFORM;
  441. SET_VTABLE1(ALmodulator, effect);
  442. break;
  443. case AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT:
  444. case AL_EFFECT_DEDICATED_DIALOGUE:
  445. effect->Props.Dedicated.Gain = 1.0f;
  446. SET_VTABLE1(ALdedicated, effect);
  447. break;
  448. default:
  449. SET_VTABLE1(ALnull, effect);
  450. break;
  451. }
  452. effect->type = type;
  453. }
  454. #include "AL/efx-presets.h"
  455. #define DECL(x) { #x, EFX_REVERB_PRESET_##x }
  456. static const struct {
  457. const char name[32];
  458. EFXEAXREVERBPROPERTIES props;
  459. } reverblist[] = {
  460. DECL(GENERIC),
  461. DECL(PADDEDCELL),
  462. DECL(ROOM),
  463. DECL(BATHROOM),
  464. DECL(LIVINGROOM),
  465. DECL(STONEROOM),
  466. DECL(AUDITORIUM),
  467. DECL(CONCERTHALL),
  468. DECL(CAVE),
  469. DECL(ARENA),
  470. DECL(HANGAR),
  471. DECL(CARPETEDHALLWAY),
  472. DECL(HALLWAY),
  473. DECL(STONECORRIDOR),
  474. DECL(ALLEY),
  475. DECL(FOREST),
  476. DECL(CITY),
  477. DECL(MOUNTAINS),
  478. DECL(QUARRY),
  479. DECL(PLAIN),
  480. DECL(PARKINGLOT),
  481. DECL(SEWERPIPE),
  482. DECL(UNDERWATER),
  483. DECL(DRUGGED),
  484. DECL(DIZZY),
  485. DECL(PSYCHOTIC),
  486. DECL(CASTLE_SMALLROOM),
  487. DECL(CASTLE_SHORTPASSAGE),
  488. DECL(CASTLE_MEDIUMROOM),
  489. DECL(CASTLE_LARGEROOM),
  490. DECL(CASTLE_LONGPASSAGE),
  491. DECL(CASTLE_HALL),
  492. DECL(CASTLE_CUPBOARD),
  493. DECL(CASTLE_COURTYARD),
  494. DECL(CASTLE_ALCOVE),
  495. DECL(FACTORY_SMALLROOM),
  496. DECL(FACTORY_SHORTPASSAGE),
  497. DECL(FACTORY_MEDIUMROOM),
  498. DECL(FACTORY_LARGEROOM),
  499. DECL(FACTORY_LONGPASSAGE),
  500. DECL(FACTORY_HALL),
  501. DECL(FACTORY_CUPBOARD),
  502. DECL(FACTORY_COURTYARD),
  503. DECL(FACTORY_ALCOVE),
  504. DECL(ICEPALACE_SMALLROOM),
  505. DECL(ICEPALACE_SHORTPASSAGE),
  506. DECL(ICEPALACE_MEDIUMROOM),
  507. DECL(ICEPALACE_LARGEROOM),
  508. DECL(ICEPALACE_LONGPASSAGE),
  509. DECL(ICEPALACE_HALL),
  510. DECL(ICEPALACE_CUPBOARD),
  511. DECL(ICEPALACE_COURTYARD),
  512. DECL(ICEPALACE_ALCOVE),
  513. DECL(SPACESTATION_SMALLROOM),
  514. DECL(SPACESTATION_SHORTPASSAGE),
  515. DECL(SPACESTATION_MEDIUMROOM),
  516. DECL(SPACESTATION_LARGEROOM),
  517. DECL(SPACESTATION_LONGPASSAGE),
  518. DECL(SPACESTATION_HALL),
  519. DECL(SPACESTATION_CUPBOARD),
  520. DECL(SPACESTATION_ALCOVE),
  521. DECL(WOODEN_SMALLROOM),
  522. DECL(WOODEN_SHORTPASSAGE),
  523. DECL(WOODEN_MEDIUMROOM),
  524. DECL(WOODEN_LARGEROOM),
  525. DECL(WOODEN_LONGPASSAGE),
  526. DECL(WOODEN_HALL),
  527. DECL(WOODEN_CUPBOARD),
  528. DECL(WOODEN_COURTYARD),
  529. DECL(WOODEN_ALCOVE),
  530. DECL(SPORT_EMPTYSTADIUM),
  531. DECL(SPORT_SQUASHCOURT),
  532. DECL(SPORT_SMALLSWIMMINGPOOL),
  533. DECL(SPORT_LARGESWIMMINGPOOL),
  534. DECL(SPORT_GYMNASIUM),
  535. DECL(SPORT_FULLSTADIUM),
  536. DECL(SPORT_STADIUMTANNOY),
  537. DECL(PREFAB_WORKSHOP),
  538. DECL(PREFAB_SCHOOLROOM),
  539. DECL(PREFAB_PRACTISEROOM),
  540. DECL(PREFAB_OUTHOUSE),
  541. DECL(PREFAB_CARAVAN),
  542. DECL(DOME_TOMB),
  543. DECL(PIPE_SMALL),
  544. DECL(DOME_SAINTPAULS),
  545. DECL(PIPE_LONGTHIN),
  546. DECL(PIPE_LARGE),
  547. DECL(PIPE_RESONANT),
  548. DECL(OUTDOORS_BACKYARD),
  549. DECL(OUTDOORS_ROLLINGPLAINS),
  550. DECL(OUTDOORS_DEEPCANYON),
  551. DECL(OUTDOORS_CREEK),
  552. DECL(OUTDOORS_VALLEY),
  553. DECL(MOOD_HEAVEN),
  554. DECL(MOOD_HELL),
  555. DECL(MOOD_MEMORY),
  556. DECL(DRIVING_COMMENTATOR),
  557. DECL(DRIVING_PITGARAGE),
  558. DECL(DRIVING_INCAR_RACER),
  559. DECL(DRIVING_INCAR_SPORTS),
  560. DECL(DRIVING_INCAR_LUXURY),
  561. DECL(DRIVING_FULLGRANDSTAND),
  562. DECL(DRIVING_EMPTYGRANDSTAND),
  563. DECL(DRIVING_TUNNEL),
  564. DECL(CITY_STREETS),
  565. DECL(CITY_SUBWAY),
  566. DECL(CITY_MUSEUM),
  567. DECL(CITY_LIBRARY),
  568. DECL(CITY_UNDERPASS),
  569. DECL(CITY_ABANDONED),
  570. DECL(DUSTYROOM),
  571. DECL(CHAPEL),
  572. DECL(SMALLWATERROOM),
  573. };
  574. #undef DECL
  575. ALvoid LoadReverbPreset(const char *name, ALeffect *effect)
  576. {
  577. size_t i;
  578. if(strcasecmp(name, "NONE") == 0)
  579. {
  580. InitEffectParams(effect, AL_EFFECT_NULL);
  581. TRACE("Loading reverb '%s'\n", "NONE");
  582. return;
  583. }
  584. if(!DisabledEffects[EAXREVERB])
  585. InitEffectParams(effect, AL_EFFECT_EAXREVERB);
  586. else if(!DisabledEffects[REVERB])
  587. InitEffectParams(effect, AL_EFFECT_REVERB);
  588. else
  589. InitEffectParams(effect, AL_EFFECT_NULL);
  590. for(i = 0;i < COUNTOF(reverblist);i++)
  591. {
  592. const EFXEAXREVERBPROPERTIES *props;
  593. if(strcasecmp(name, reverblist[i].name) != 0)
  594. continue;
  595. TRACE("Loading reverb '%s'\n", reverblist[i].name);
  596. props = &reverblist[i].props;
  597. effect->Props.Reverb.Density = props->flDensity;
  598. effect->Props.Reverb.Diffusion = props->flDiffusion;
  599. effect->Props.Reverb.Gain = props->flGain;
  600. effect->Props.Reverb.GainHF = props->flGainHF;
  601. effect->Props.Reverb.GainLF = props->flGainLF;
  602. effect->Props.Reverb.DecayTime = props->flDecayTime;
  603. effect->Props.Reverb.DecayHFRatio = props->flDecayHFRatio;
  604. effect->Props.Reverb.DecayLFRatio = props->flDecayLFRatio;
  605. effect->Props.Reverb.ReflectionsGain = props->flReflectionsGain;
  606. effect->Props.Reverb.ReflectionsDelay = props->flReflectionsDelay;
  607. effect->Props.Reverb.ReflectionsPan[0] = props->flReflectionsPan[0];
  608. effect->Props.Reverb.ReflectionsPan[1] = props->flReflectionsPan[1];
  609. effect->Props.Reverb.ReflectionsPan[2] = props->flReflectionsPan[2];
  610. effect->Props.Reverb.LateReverbGain = props->flLateReverbGain;
  611. effect->Props.Reverb.LateReverbDelay = props->flLateReverbDelay;
  612. effect->Props.Reverb.LateReverbPan[0] = props->flLateReverbPan[0];
  613. effect->Props.Reverb.LateReverbPan[1] = props->flLateReverbPan[1];
  614. effect->Props.Reverb.LateReverbPan[2] = props->flLateReverbPan[2];
  615. effect->Props.Reverb.EchoTime = props->flEchoTime;
  616. effect->Props.Reverb.EchoDepth = props->flEchoDepth;
  617. effect->Props.Reverb.ModulationTime = props->flModulationTime;
  618. effect->Props.Reverb.ModulationDepth = props->flModulationDepth;
  619. effect->Props.Reverb.AirAbsorptionGainHF = props->flAirAbsorptionGainHF;
  620. effect->Props.Reverb.HFReference = props->flHFReference;
  621. effect->Props.Reverb.LFReference = props->flLFReference;
  622. effect->Props.Reverb.RoomRolloffFactor = props->flRoomRolloffFactor;
  623. effect->Props.Reverb.DecayHFLimit = props->iDecayHFLimit;
  624. return;
  625. }
  626. WARN("Reverb preset '%s' not found\n", name);
  627. }