alEffect.c 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308
  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., 59 Temple Place - Suite 330,
  17. * Boston, MA 02111-1307, 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 "AL/al.h"
  24. #include "AL/alc.h"
  25. #include "alMain.h"
  26. #include "alEffect.h"
  27. #include "alThunk.h"
  28. #include "alError.h"
  29. ALboolean DisabledEffects[MAX_EFFECTS];
  30. static void InitEffectParams(ALeffect *effect, ALenum type);
  31. AL_API ALvoid AL_APIENTRY alGenEffects(ALsizei n, ALuint *effects)
  32. {
  33. ALCcontext *Context;
  34. ALsizei i;
  35. Context = GetContextRef();
  36. if(!Context) return;
  37. if(n < 0 || IsBadWritePtr((void*)effects, n * sizeof(ALuint)))
  38. alSetError(Context, AL_INVALID_VALUE);
  39. else
  40. {
  41. ALCdevice *device = Context->Device;
  42. ALenum err;
  43. for(i = 0;i < n;i++)
  44. {
  45. ALeffect *effect = calloc(1, sizeof(ALeffect));
  46. if(!effect)
  47. {
  48. alSetError(Context, AL_OUT_OF_MEMORY);
  49. alDeleteEffects(i, effects);
  50. break;
  51. }
  52. InitEffectParams(effect, AL_EFFECT_NULL);
  53. err = NewThunkEntry(&effect->effect);
  54. if(err == AL_NO_ERROR)
  55. err = InsertUIntMapEntry(&device->EffectMap, effect->effect, effect);
  56. if(err != AL_NO_ERROR)
  57. {
  58. FreeThunkEntry(effect->effect);
  59. memset(effect, 0, sizeof(ALeffect));
  60. free(effect);
  61. alSetError(Context, err);
  62. alDeleteEffects(i, effects);
  63. break;
  64. }
  65. effects[i] = effect->effect;
  66. }
  67. }
  68. ALCcontext_DecRef(Context);
  69. }
  70. AL_API ALvoid AL_APIENTRY alDeleteEffects(ALsizei n, const ALuint *effects)
  71. {
  72. ALCcontext *Context;
  73. ALCdevice *device;
  74. ALeffect *ALEffect;
  75. ALsizei i;
  76. Context = GetContextRef();
  77. if(!Context) return;
  78. device = Context->Device;
  79. if(n < 0)
  80. alSetError(Context, AL_INVALID_VALUE);
  81. else
  82. {
  83. // Check that all effects are valid
  84. for(i = 0;i < n;i++)
  85. {
  86. if(!effects[i])
  87. continue;
  88. if(LookupEffect(device, effects[i]) == NULL)
  89. {
  90. alSetError(Context, AL_INVALID_NAME);
  91. n = 0;
  92. break;
  93. }
  94. }
  95. for(i = 0;i < n;i++)
  96. {
  97. // Recheck that the effect is valid, because there could be duplicated names
  98. if((ALEffect=RemoveEffect(device, effects[i])) == NULL)
  99. continue;
  100. FreeThunkEntry(ALEffect->effect);
  101. memset(ALEffect, 0, sizeof(ALeffect));
  102. free(ALEffect);
  103. }
  104. }
  105. ALCcontext_DecRef(Context);
  106. }
  107. AL_API ALboolean AL_APIENTRY alIsEffect(ALuint effect)
  108. {
  109. ALCcontext *Context;
  110. ALboolean result;
  111. Context = GetContextRef();
  112. if(!Context) return AL_FALSE;
  113. result = ((!effect || LookupEffect(Context->Device, effect)) ?
  114. AL_TRUE : AL_FALSE);
  115. ALCcontext_DecRef(Context);
  116. return result;
  117. }
  118. AL_API ALvoid AL_APIENTRY alEffecti(ALuint effect, ALenum param, ALint iValue)
  119. {
  120. ALCcontext *Context;
  121. ALCdevice *Device;
  122. ALeffect *ALEffect;
  123. Context = GetContextRef();
  124. if(!Context) return;
  125. Device = Context->Device;
  126. if((ALEffect=LookupEffect(Device, effect)) != NULL)
  127. {
  128. if(param == AL_EFFECT_TYPE)
  129. {
  130. ALboolean isOk = (iValue == AL_EFFECT_NULL);
  131. ALint i;
  132. for(i = 0;!isOk && EffectList[i].val;i++)
  133. {
  134. if(iValue == EffectList[i].val &&
  135. !DisabledEffects[EffectList[i].type])
  136. isOk = AL_TRUE;
  137. }
  138. if(isOk)
  139. InitEffectParams(ALEffect, iValue);
  140. else
  141. alSetError(Context, AL_INVALID_VALUE);
  142. }
  143. else
  144. {
  145. /* Call the appropriate handler */
  146. ALeffect_SetParami(ALEffect, Context, param, iValue);
  147. }
  148. }
  149. else
  150. alSetError(Context, AL_INVALID_NAME);
  151. ALCcontext_DecRef(Context);
  152. }
  153. AL_API ALvoid AL_APIENTRY alEffectiv(ALuint effect, ALenum param, const ALint *piValues)
  154. {
  155. ALCcontext *Context;
  156. ALCdevice *Device;
  157. ALeffect *ALEffect;
  158. Context = GetContextRef();
  159. if(!Context) return;
  160. Device = Context->Device;
  161. if((ALEffect=LookupEffect(Device, effect)) != NULL)
  162. {
  163. /* Call the appropriate handler */
  164. ALeffect_SetParamiv(ALEffect, Context, param, piValues);
  165. }
  166. else
  167. alSetError(Context, AL_INVALID_NAME);
  168. ALCcontext_DecRef(Context);
  169. }
  170. AL_API ALvoid AL_APIENTRY alEffectf(ALuint effect, ALenum param, ALfloat flValue)
  171. {
  172. ALCcontext *Context;
  173. ALCdevice *Device;
  174. ALeffect *ALEffect;
  175. Context = GetContextRef();
  176. if(!Context) return;
  177. Device = Context->Device;
  178. if((ALEffect=LookupEffect(Device, effect)) != NULL)
  179. {
  180. /* Call the appropriate handler */
  181. ALeffect_SetParamf(ALEffect, Context, param, flValue);
  182. }
  183. else
  184. alSetError(Context, AL_INVALID_NAME);
  185. ALCcontext_DecRef(Context);
  186. }
  187. AL_API ALvoid AL_APIENTRY alEffectfv(ALuint effect, ALenum param, const ALfloat *pflValues)
  188. {
  189. ALCcontext *Context;
  190. ALCdevice *Device;
  191. ALeffect *ALEffect;
  192. Context = GetContextRef();
  193. if(!Context) return;
  194. Device = Context->Device;
  195. if((ALEffect=LookupEffect(Device, effect)) != NULL)
  196. {
  197. /* Call the appropriate handler */
  198. ALeffect_SetParamfv(ALEffect, Context, param, pflValues);
  199. }
  200. else
  201. alSetError(Context, AL_INVALID_NAME);
  202. ALCcontext_DecRef(Context);
  203. }
  204. AL_API ALvoid AL_APIENTRY alGetEffecti(ALuint effect, ALenum param, ALint *piValue)
  205. {
  206. ALCcontext *Context;
  207. ALCdevice *Device;
  208. ALeffect *ALEffect;
  209. Context = GetContextRef();
  210. if(!Context) return;
  211. Device = Context->Device;
  212. if((ALEffect=LookupEffect(Device, effect)) != NULL)
  213. {
  214. if(param == AL_EFFECT_TYPE)
  215. {
  216. *piValue = ALEffect->type;
  217. }
  218. else
  219. {
  220. /* Call the appropriate handler */
  221. ALeffect_GetParamiv(ALEffect, Context, param, piValue);
  222. }
  223. }
  224. else
  225. alSetError(Context, AL_INVALID_NAME);
  226. ALCcontext_DecRef(Context);
  227. }
  228. AL_API ALvoid AL_APIENTRY alGetEffectiv(ALuint effect, ALenum param, ALint *piValues)
  229. {
  230. ALCcontext *Context;
  231. ALCdevice *Device;
  232. ALeffect *ALEffect;
  233. Context = GetContextRef();
  234. if(!Context) return;
  235. Device = Context->Device;
  236. if((ALEffect=LookupEffect(Device, effect)) != NULL)
  237. {
  238. /* Call the appropriate handler */
  239. ALeffect_GetParamiv(ALEffect, Context, param, piValues);
  240. }
  241. else
  242. alSetError(Context, AL_INVALID_NAME);
  243. ALCcontext_DecRef(Context);
  244. }
  245. AL_API ALvoid AL_APIENTRY alGetEffectf(ALuint effect, ALenum param, ALfloat *pflValue)
  246. {
  247. ALCcontext *Context;
  248. ALCdevice *Device;
  249. ALeffect *ALEffect;
  250. Context = GetContextRef();
  251. if(!Context) return;
  252. Device = Context->Device;
  253. if((ALEffect=LookupEffect(Device, effect)) != NULL)
  254. {
  255. /* Call the appropriate handler */
  256. ALeffect_GetParamf(ALEffect, Context, param, pflValue);
  257. }
  258. else
  259. alSetError(Context, AL_INVALID_NAME);
  260. ALCcontext_DecRef(Context);
  261. }
  262. AL_API ALvoid AL_APIENTRY alGetEffectfv(ALuint effect, ALenum param, ALfloat *pflValues)
  263. {
  264. ALCcontext *Context;
  265. ALCdevice *Device;
  266. ALeffect *ALEffect;
  267. Context = GetContextRef();
  268. if(!Context) return;
  269. Device = Context->Device;
  270. if((ALEffect=LookupEffect(Device, effect)) != NULL)
  271. {
  272. /* Call the appropriate handler */
  273. ALeffect_GetParamfv(ALEffect, Context, param, pflValues);
  274. }
  275. else
  276. alSetError(Context, AL_INVALID_NAME);
  277. ALCcontext_DecRef(Context);
  278. }
  279. static void eaxreverb_SetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val)
  280. {
  281. switch(param)
  282. {
  283. case AL_EAXREVERB_DECAY_HFLIMIT:
  284. if(val >= AL_EAXREVERB_MIN_DECAY_HFLIMIT && val <= AL_EAXREVERB_MAX_DECAY_HFLIMIT)
  285. effect->Reverb.DecayHFLimit = val;
  286. else
  287. alSetError(context, AL_INVALID_VALUE);
  288. break;
  289. default:
  290. alSetError(context, AL_INVALID_ENUM);
  291. break;
  292. }
  293. }
  294. static void eaxreverb_SetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
  295. {
  296. eaxreverb_SetParami(effect, context, param, vals[0]);
  297. }
  298. static void eaxreverb_SetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
  299. {
  300. switch(param)
  301. {
  302. case AL_EAXREVERB_DENSITY:
  303. if(val >= AL_EAXREVERB_MIN_DENSITY &&
  304. val <= AL_EAXREVERB_MAX_DENSITY)
  305. effect->Reverb.Density = val;
  306. else
  307. alSetError(context, AL_INVALID_VALUE);
  308. break;
  309. case AL_EAXREVERB_DIFFUSION:
  310. if(val >= AL_EAXREVERB_MIN_DIFFUSION &&
  311. val <= AL_EAXREVERB_MAX_DIFFUSION)
  312. effect->Reverb.Diffusion = val;
  313. else
  314. alSetError(context, AL_INVALID_VALUE);
  315. break;
  316. case AL_EAXREVERB_GAIN:
  317. if(val >= AL_EAXREVERB_MIN_GAIN &&
  318. val <= AL_EAXREVERB_MAX_GAIN)
  319. effect->Reverb.Gain = val;
  320. else
  321. alSetError(context, AL_INVALID_VALUE);
  322. break;
  323. case AL_EAXREVERB_GAINHF:
  324. if(val >= AL_EAXREVERB_MIN_GAINHF &&
  325. val <= AL_EAXREVERB_MAX_GAINHF)
  326. effect->Reverb.GainHF = val;
  327. else
  328. alSetError(context, AL_INVALID_VALUE);
  329. break;
  330. case AL_EAXREVERB_GAINLF:
  331. if(val >= AL_EAXREVERB_MIN_GAINLF &&
  332. val <= AL_EAXREVERB_MAX_GAINLF)
  333. effect->Reverb.GainLF = val;
  334. else
  335. alSetError(context, AL_INVALID_VALUE);
  336. break;
  337. case AL_EAXREVERB_DECAY_TIME:
  338. if(val >= AL_EAXREVERB_MIN_DECAY_TIME &&
  339. val <= AL_EAXREVERB_MAX_DECAY_TIME)
  340. effect->Reverb.DecayTime = val;
  341. else
  342. alSetError(context, AL_INVALID_VALUE);
  343. break;
  344. case AL_EAXREVERB_DECAY_HFRATIO:
  345. if(val >= AL_EAXREVERB_MIN_DECAY_HFRATIO &&
  346. val <= AL_EAXREVERB_MAX_DECAY_HFRATIO)
  347. effect->Reverb.DecayHFRatio = val;
  348. else
  349. alSetError(context, AL_INVALID_VALUE);
  350. break;
  351. case AL_EAXREVERB_DECAY_LFRATIO:
  352. if(val >= AL_EAXREVERB_MIN_DECAY_LFRATIO &&
  353. val <= AL_EAXREVERB_MAX_DECAY_LFRATIO)
  354. effect->Reverb.DecayLFRatio = val;
  355. else
  356. alSetError(context, AL_INVALID_VALUE);
  357. break;
  358. case AL_EAXREVERB_REFLECTIONS_GAIN:
  359. if(val >= AL_EAXREVERB_MIN_REFLECTIONS_GAIN &&
  360. val <= AL_EAXREVERB_MAX_REFLECTIONS_GAIN)
  361. effect->Reverb.ReflectionsGain = val;
  362. else
  363. alSetError(context, AL_INVALID_VALUE);
  364. break;
  365. case AL_EAXREVERB_REFLECTIONS_DELAY:
  366. if(val >= AL_EAXREVERB_MIN_REFLECTIONS_DELAY &&
  367. val <= AL_EAXREVERB_MAX_REFLECTIONS_DELAY)
  368. effect->Reverb.ReflectionsDelay = val;
  369. else
  370. alSetError(context, AL_INVALID_VALUE);
  371. break;
  372. case AL_EAXREVERB_LATE_REVERB_GAIN:
  373. if(val >= AL_EAXREVERB_MIN_LATE_REVERB_GAIN &&
  374. val <= AL_EAXREVERB_MAX_LATE_REVERB_GAIN)
  375. effect->Reverb.LateReverbGain = val;
  376. else
  377. alSetError(context, AL_INVALID_VALUE);
  378. break;
  379. case AL_EAXREVERB_LATE_REVERB_DELAY:
  380. if(val >= AL_EAXREVERB_MIN_LATE_REVERB_DELAY &&
  381. val <= AL_EAXREVERB_MAX_LATE_REVERB_DELAY)
  382. effect->Reverb.LateReverbDelay = val;
  383. else
  384. alSetError(context, AL_INVALID_VALUE);
  385. break;
  386. case AL_EAXREVERB_AIR_ABSORPTION_GAINHF:
  387. if(val >= AL_EAXREVERB_MIN_AIR_ABSORPTION_GAINHF &&
  388. val <= AL_EAXREVERB_MAX_AIR_ABSORPTION_GAINHF)
  389. effect->Reverb.AirAbsorptionGainHF = val;
  390. else
  391. alSetError(context, AL_INVALID_VALUE);
  392. break;
  393. case AL_EAXREVERB_ECHO_TIME:
  394. if(val >= AL_EAXREVERB_MIN_ECHO_TIME &&
  395. val <= AL_EAXREVERB_MAX_ECHO_TIME)
  396. effect->Reverb.EchoTime = val;
  397. else
  398. alSetError(context, AL_INVALID_VALUE);
  399. break;
  400. case AL_EAXREVERB_ECHO_DEPTH:
  401. if(val >= AL_EAXREVERB_MIN_ECHO_DEPTH &&
  402. val <= AL_EAXREVERB_MAX_ECHO_DEPTH)
  403. effect->Reverb.EchoDepth = val;
  404. else
  405. alSetError(context, AL_INVALID_VALUE);
  406. break;
  407. case AL_EAXREVERB_MODULATION_TIME:
  408. if(val >= AL_EAXREVERB_MIN_MODULATION_TIME &&
  409. val <= AL_EAXREVERB_MAX_MODULATION_TIME)
  410. effect->Reverb.ModulationTime = val;
  411. else
  412. alSetError(context, AL_INVALID_VALUE);
  413. break;
  414. case AL_EAXREVERB_MODULATION_DEPTH:
  415. if(val >= AL_EAXREVERB_MIN_MODULATION_DEPTH &&
  416. val <= AL_EAXREVERB_MAX_MODULATION_DEPTH)
  417. effect->Reverb.ModulationDepth = val;
  418. else
  419. alSetError(context, AL_INVALID_VALUE);
  420. break;
  421. case AL_EAXREVERB_HFREFERENCE:
  422. if(val >= AL_EAXREVERB_MIN_HFREFERENCE &&
  423. val <= AL_EAXREVERB_MAX_HFREFERENCE)
  424. effect->Reverb.HFReference = val;
  425. else
  426. alSetError(context, AL_INVALID_VALUE);
  427. break;
  428. case AL_EAXREVERB_LFREFERENCE:
  429. if(val >= AL_EAXREVERB_MIN_LFREFERENCE &&
  430. val <= AL_EAXREVERB_MAX_LFREFERENCE)
  431. effect->Reverb.LFReference = val;
  432. else
  433. alSetError(context, AL_INVALID_VALUE);
  434. break;
  435. case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR:
  436. if(val >= 0.0f && val <= 10.0f)
  437. effect->Reverb.RoomRolloffFactor = val;
  438. else
  439. alSetError(context, AL_INVALID_VALUE);
  440. break;
  441. default:
  442. alSetError(context, AL_INVALID_ENUM);
  443. break;
  444. }
  445. }
  446. static void eaxreverb_SetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
  447. {
  448. switch(param)
  449. {
  450. case AL_EAXREVERB_REFLECTIONS_PAN:
  451. if(isfinite(vals[0]) && isfinite(vals[1]) && isfinite(vals[2]))
  452. {
  453. LockContext(context);
  454. effect->Reverb.ReflectionsPan[0] = vals[0];
  455. effect->Reverb.ReflectionsPan[1] = vals[1];
  456. effect->Reverb.ReflectionsPan[2] = vals[2];
  457. UnlockContext(context);
  458. }
  459. else
  460. alSetError(context, AL_INVALID_VALUE);
  461. break;
  462. case AL_EAXREVERB_LATE_REVERB_PAN:
  463. if(isfinite(vals[0]) && isfinite(vals[1]) && isfinite(vals[2]))
  464. {
  465. LockContext(context);
  466. effect->Reverb.LateReverbPan[0] = vals[0];
  467. effect->Reverb.LateReverbPan[1] = vals[1];
  468. effect->Reverb.LateReverbPan[2] = vals[2];
  469. UnlockContext(context);
  470. }
  471. else
  472. alSetError(context, AL_INVALID_VALUE);
  473. break;
  474. default:
  475. eaxreverb_SetParamf(effect, context, param, vals[0]);
  476. break;
  477. }
  478. }
  479. static void eaxreverb_GetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint *val)
  480. {
  481. switch(param)
  482. {
  483. case AL_EAXREVERB_DECAY_HFLIMIT:
  484. *val = effect->Reverb.DecayHFLimit;
  485. break;
  486. default:
  487. alSetError(context, AL_INVALID_ENUM);
  488. break;
  489. }
  490. }
  491. static void eaxreverb_GetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
  492. {
  493. eaxreverb_GetParami(effect, context, param, vals);
  494. }
  495. static void eaxreverb_GetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
  496. {
  497. switch(param)
  498. {
  499. case AL_EAXREVERB_DENSITY:
  500. *val = effect->Reverb.Density;
  501. break;
  502. case AL_EAXREVERB_DIFFUSION:
  503. *val = effect->Reverb.Diffusion;
  504. break;
  505. case AL_EAXREVERB_GAIN:
  506. *val = effect->Reverb.Gain;
  507. break;
  508. case AL_EAXREVERB_GAINHF:
  509. *val = effect->Reverb.GainHF;
  510. break;
  511. case AL_EAXREVERB_GAINLF:
  512. *val = effect->Reverb.GainLF;
  513. break;
  514. case AL_EAXREVERB_DECAY_TIME:
  515. *val = effect->Reverb.DecayTime;
  516. break;
  517. case AL_EAXREVERB_DECAY_HFRATIO:
  518. *val = effect->Reverb.DecayHFRatio;
  519. break;
  520. case AL_EAXREVERB_DECAY_LFRATIO:
  521. *val = effect->Reverb.DecayLFRatio;
  522. break;
  523. case AL_EAXREVERB_REFLECTIONS_GAIN:
  524. *val = effect->Reverb.ReflectionsGain;
  525. break;
  526. case AL_EAXREVERB_REFLECTIONS_DELAY:
  527. *val = effect->Reverb.ReflectionsDelay;
  528. break;
  529. case AL_EAXREVERB_LATE_REVERB_GAIN:
  530. *val = effect->Reverb.LateReverbGain;
  531. break;
  532. case AL_EAXREVERB_LATE_REVERB_DELAY:
  533. *val = effect->Reverb.LateReverbDelay;
  534. break;
  535. case AL_EAXREVERB_AIR_ABSORPTION_GAINHF:
  536. *val = effect->Reverb.AirAbsorptionGainHF;
  537. break;
  538. case AL_EAXREVERB_ECHO_TIME:
  539. *val = effect->Reverb.EchoTime;
  540. break;
  541. case AL_EAXREVERB_ECHO_DEPTH:
  542. *val = effect->Reverb.EchoDepth;
  543. break;
  544. case AL_EAXREVERB_MODULATION_TIME:
  545. *val = effect->Reverb.ModulationTime;
  546. break;
  547. case AL_EAXREVERB_MODULATION_DEPTH:
  548. *val = effect->Reverb.ModulationDepth;
  549. break;
  550. case AL_EAXREVERB_HFREFERENCE:
  551. *val = effect->Reverb.HFReference;
  552. break;
  553. case AL_EAXREVERB_LFREFERENCE:
  554. *val = effect->Reverb.LFReference;
  555. break;
  556. case AL_EAXREVERB_ROOM_ROLLOFF_FACTOR:
  557. *val = effect->Reverb.RoomRolloffFactor;
  558. break;
  559. default:
  560. alSetError(context, AL_INVALID_ENUM);
  561. break;
  562. }
  563. }
  564. static void eaxreverb_GetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
  565. {
  566. switch(param)
  567. {
  568. case AL_EAXREVERB_REFLECTIONS_PAN:
  569. LockContext(context);
  570. vals[0] = effect->Reverb.ReflectionsPan[0];
  571. vals[1] = effect->Reverb.ReflectionsPan[1];
  572. vals[2] = effect->Reverb.ReflectionsPan[2];
  573. UnlockContext(context);
  574. break;
  575. case AL_EAXREVERB_LATE_REVERB_PAN:
  576. LockContext(context);
  577. vals[0] = effect->Reverb.LateReverbPan[0];
  578. vals[1] = effect->Reverb.LateReverbPan[1];
  579. vals[2] = effect->Reverb.LateReverbPan[2];
  580. UnlockContext(context);
  581. break;
  582. default:
  583. eaxreverb_GetParamf(effect, context, param, vals);
  584. break;
  585. }
  586. }
  587. static void reverb_SetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val)
  588. {
  589. switch(param)
  590. {
  591. case AL_REVERB_DECAY_HFLIMIT:
  592. if(val >= AL_REVERB_MIN_DECAY_HFLIMIT &&
  593. val <= AL_REVERB_MAX_DECAY_HFLIMIT)
  594. effect->Reverb.DecayHFLimit = val;
  595. else
  596. alSetError(context, AL_INVALID_VALUE);
  597. break;
  598. default:
  599. alSetError(context, AL_INVALID_ENUM);
  600. break;
  601. }
  602. }
  603. static void reverb_SetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
  604. {
  605. reverb_SetParami(effect, context, param, vals[0]);
  606. }
  607. static void reverb_SetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
  608. {
  609. switch(param)
  610. {
  611. case AL_REVERB_DENSITY:
  612. if(val >= AL_REVERB_MIN_DENSITY &&
  613. val <= AL_REVERB_MAX_DENSITY)
  614. effect->Reverb.Density = val;
  615. else
  616. alSetError(context, AL_INVALID_VALUE);
  617. break;
  618. case AL_REVERB_DIFFUSION:
  619. if(val >= AL_REVERB_MIN_DIFFUSION &&
  620. val <= AL_REVERB_MAX_DIFFUSION)
  621. effect->Reverb.Diffusion = val;
  622. else
  623. alSetError(context, AL_INVALID_VALUE);
  624. break;
  625. case AL_REVERB_GAIN:
  626. if(val >= AL_REVERB_MIN_GAIN &&
  627. val <= AL_REVERB_MAX_GAIN)
  628. effect->Reverb.Gain = val;
  629. else
  630. alSetError(context, AL_INVALID_VALUE);
  631. break;
  632. case AL_REVERB_GAINHF:
  633. if(val >= AL_REVERB_MIN_GAINHF &&
  634. val <= AL_REVERB_MAX_GAINHF)
  635. effect->Reverb.GainHF = val;
  636. else
  637. alSetError(context, AL_INVALID_VALUE);
  638. break;
  639. case AL_REVERB_DECAY_TIME:
  640. if(val >= AL_REVERB_MIN_DECAY_TIME &&
  641. val <= AL_REVERB_MAX_DECAY_TIME)
  642. effect->Reverb.DecayTime = val;
  643. else
  644. alSetError(context, AL_INVALID_VALUE);
  645. break;
  646. case AL_REVERB_DECAY_HFRATIO:
  647. if(val >= AL_REVERB_MIN_DECAY_HFRATIO &&
  648. val <= AL_REVERB_MAX_DECAY_HFRATIO)
  649. effect->Reverb.DecayHFRatio = val;
  650. else
  651. alSetError(context, AL_INVALID_VALUE);
  652. break;
  653. case AL_REVERB_REFLECTIONS_GAIN:
  654. if(val >= AL_REVERB_MIN_REFLECTIONS_GAIN &&
  655. val <= AL_REVERB_MAX_REFLECTIONS_GAIN)
  656. effect->Reverb.ReflectionsGain = val;
  657. else
  658. alSetError(context, AL_INVALID_VALUE);
  659. break;
  660. case AL_REVERB_REFLECTIONS_DELAY:
  661. if(val >= AL_REVERB_MIN_REFLECTIONS_DELAY &&
  662. val <= AL_REVERB_MAX_REFLECTIONS_DELAY)
  663. effect->Reverb.ReflectionsDelay = val;
  664. else
  665. alSetError(context, AL_INVALID_VALUE);
  666. break;
  667. case AL_REVERB_LATE_REVERB_GAIN:
  668. if(val >= AL_REVERB_MIN_LATE_REVERB_GAIN &&
  669. val <= AL_REVERB_MAX_LATE_REVERB_GAIN)
  670. effect->Reverb.LateReverbGain = val;
  671. else
  672. alSetError(context, AL_INVALID_VALUE);
  673. break;
  674. case AL_REVERB_LATE_REVERB_DELAY:
  675. if(val >= AL_REVERB_MIN_LATE_REVERB_DELAY &&
  676. val <= AL_REVERB_MAX_LATE_REVERB_DELAY)
  677. effect->Reverb.LateReverbDelay = val;
  678. else
  679. alSetError(context, AL_INVALID_VALUE);
  680. break;
  681. case AL_REVERB_AIR_ABSORPTION_GAINHF:
  682. if(val >= AL_REVERB_MIN_AIR_ABSORPTION_GAINHF &&
  683. val <= AL_REVERB_MAX_AIR_ABSORPTION_GAINHF)
  684. effect->Reverb.AirAbsorptionGainHF = val;
  685. else
  686. alSetError(context, AL_INVALID_VALUE);
  687. break;
  688. case AL_REVERB_ROOM_ROLLOFF_FACTOR:
  689. if(val >= AL_REVERB_MIN_ROOM_ROLLOFF_FACTOR &&
  690. val <= AL_REVERB_MAX_ROOM_ROLLOFF_FACTOR)
  691. effect->Reverb.RoomRolloffFactor = val;
  692. else
  693. alSetError(context, AL_INVALID_VALUE);
  694. break;
  695. default:
  696. alSetError(context, AL_INVALID_ENUM);
  697. break;
  698. }
  699. }
  700. static void reverb_SetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
  701. {
  702. reverb_SetParamf(effect, context, param, vals[0]);
  703. }
  704. static void reverb_GetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint *val)
  705. {
  706. switch(param)
  707. {
  708. case AL_REVERB_DECAY_HFLIMIT:
  709. *val = effect->Reverb.DecayHFLimit;
  710. break;
  711. default:
  712. alSetError(context, AL_INVALID_ENUM);
  713. break;
  714. }
  715. }
  716. static void reverb_GetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
  717. {
  718. reverb_GetParami(effect, context, param, vals);
  719. }
  720. static void reverb_GetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
  721. {
  722. switch(param)
  723. {
  724. case AL_REVERB_DENSITY:
  725. *val = effect->Reverb.Density;
  726. break;
  727. case AL_REVERB_DIFFUSION:
  728. *val = effect->Reverb.Diffusion;
  729. break;
  730. case AL_REVERB_GAIN:
  731. *val = effect->Reverb.Gain;
  732. break;
  733. case AL_REVERB_GAINHF:
  734. *val = effect->Reverb.GainHF;
  735. break;
  736. case AL_REVERB_DECAY_TIME:
  737. *val = effect->Reverb.DecayTime;
  738. break;
  739. case AL_REVERB_DECAY_HFRATIO:
  740. *val = effect->Reverb.DecayHFRatio;
  741. break;
  742. case AL_REVERB_REFLECTIONS_GAIN:
  743. *val = effect->Reverb.ReflectionsGain;
  744. break;
  745. case AL_REVERB_REFLECTIONS_DELAY:
  746. *val = effect->Reverb.ReflectionsDelay;
  747. break;
  748. case AL_REVERB_LATE_REVERB_GAIN:
  749. *val = effect->Reverb.LateReverbGain;
  750. break;
  751. case AL_REVERB_LATE_REVERB_DELAY:
  752. *val = effect->Reverb.LateReverbDelay;
  753. break;
  754. case AL_REVERB_AIR_ABSORPTION_GAINHF:
  755. *val = effect->Reverb.AirAbsorptionGainHF;
  756. break;
  757. case AL_REVERB_ROOM_ROLLOFF_FACTOR:
  758. *val = effect->Reverb.RoomRolloffFactor;
  759. break;
  760. default:
  761. alSetError(context, AL_INVALID_ENUM);
  762. break;
  763. }
  764. }
  765. static void reverb_GetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
  766. {
  767. reverb_GetParamf(effect, context, param, vals);
  768. }
  769. static void echo_SetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val)
  770. { (void)effect;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
  771. static void echo_SetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
  772. {
  773. echo_SetParami(effect, context, param, vals[0]);
  774. }
  775. static void echo_SetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
  776. {
  777. switch(param)
  778. {
  779. case AL_ECHO_DELAY:
  780. if(val >= AL_ECHO_MIN_DELAY && val <= AL_ECHO_MAX_DELAY)
  781. effect->Echo.Delay = val;
  782. else
  783. alSetError(context, AL_INVALID_VALUE);
  784. break;
  785. case AL_ECHO_LRDELAY:
  786. if(val >= AL_ECHO_MIN_LRDELAY && val <= AL_ECHO_MAX_LRDELAY)
  787. effect->Echo.LRDelay = val;
  788. else
  789. alSetError(context, AL_INVALID_VALUE);
  790. break;
  791. case AL_ECHO_DAMPING:
  792. if(val >= AL_ECHO_MIN_DAMPING && val <= AL_ECHO_MAX_DAMPING)
  793. effect->Echo.Damping = val;
  794. else
  795. alSetError(context, AL_INVALID_VALUE);
  796. break;
  797. case AL_ECHO_FEEDBACK:
  798. if(val >= AL_ECHO_MIN_FEEDBACK && val <= AL_ECHO_MAX_FEEDBACK)
  799. effect->Echo.Feedback = val;
  800. else
  801. alSetError(context, AL_INVALID_VALUE);
  802. break;
  803. case AL_ECHO_SPREAD:
  804. if(val >= AL_ECHO_MIN_SPREAD && val <= AL_ECHO_MAX_SPREAD)
  805. effect->Echo.Spread = val;
  806. else
  807. alSetError(context, AL_INVALID_VALUE);
  808. break;
  809. default:
  810. alSetError(context, AL_INVALID_ENUM);
  811. break;
  812. }
  813. }
  814. static void echo_SetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
  815. {
  816. echo_SetParamf(effect, context, param, vals[0]);
  817. }
  818. static void echo_GetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint *val)
  819. { (void)effect;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
  820. static void echo_GetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
  821. {
  822. echo_GetParami(effect, context, param, vals);
  823. }
  824. static void echo_GetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
  825. {
  826. switch(param)
  827. {
  828. case AL_ECHO_DELAY:
  829. *val = effect->Echo.Delay;
  830. break;
  831. case AL_ECHO_LRDELAY:
  832. *val = effect->Echo.LRDelay;
  833. break;
  834. case AL_ECHO_DAMPING:
  835. *val = effect->Echo.Damping;
  836. break;
  837. case AL_ECHO_FEEDBACK:
  838. *val = effect->Echo.Feedback;
  839. break;
  840. case AL_ECHO_SPREAD:
  841. *val = effect->Echo.Spread;
  842. break;
  843. default:
  844. alSetError(context, AL_INVALID_ENUM);
  845. break;
  846. }
  847. }
  848. static void echo_GetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
  849. {
  850. echo_GetParamf(effect, context, param, vals);
  851. }
  852. static void mod_SetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
  853. {
  854. switch(param)
  855. {
  856. case AL_RING_MODULATOR_FREQUENCY:
  857. if(val >= AL_RING_MODULATOR_MIN_FREQUENCY &&
  858. val <= AL_RING_MODULATOR_MAX_FREQUENCY)
  859. effect->Modulator.Frequency = val;
  860. else
  861. alSetError(context, AL_INVALID_VALUE);
  862. break;
  863. case AL_RING_MODULATOR_HIGHPASS_CUTOFF:
  864. if(val >= AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF &&
  865. val <= AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF)
  866. effect->Modulator.HighPassCutoff = val;
  867. else
  868. alSetError(context, AL_INVALID_VALUE);
  869. break;
  870. default:
  871. alSetError(context, AL_INVALID_ENUM);
  872. break;
  873. }
  874. }
  875. static void mod_SetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
  876. {
  877. mod_SetParamf(effect, context, param, vals[0]);
  878. }
  879. static void mod_SetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val)
  880. {
  881. switch(param)
  882. {
  883. case AL_RING_MODULATOR_FREQUENCY:
  884. case AL_RING_MODULATOR_HIGHPASS_CUTOFF:
  885. mod_SetParamf(effect, context, param, (ALfloat)val);
  886. break;
  887. case AL_RING_MODULATOR_WAVEFORM:
  888. if(val >= AL_RING_MODULATOR_MIN_WAVEFORM &&
  889. val <= AL_RING_MODULATOR_MAX_WAVEFORM)
  890. effect->Modulator.Waveform = val;
  891. else
  892. alSetError(context, AL_INVALID_VALUE);
  893. break;
  894. default:
  895. alSetError(context, AL_INVALID_ENUM);
  896. break;
  897. }
  898. }
  899. static void mod_SetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
  900. {
  901. mod_SetParami(effect, context, param, vals[0]);
  902. }
  903. static void mod_GetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint *val)
  904. {
  905. switch(param)
  906. {
  907. case AL_RING_MODULATOR_FREQUENCY:
  908. *val = (ALint)effect->Modulator.Frequency;
  909. break;
  910. case AL_RING_MODULATOR_HIGHPASS_CUTOFF:
  911. *val = (ALint)effect->Modulator.HighPassCutoff;
  912. break;
  913. case AL_RING_MODULATOR_WAVEFORM:
  914. *val = effect->Modulator.Waveform;
  915. break;
  916. default:
  917. alSetError(context, AL_INVALID_ENUM);
  918. break;
  919. }
  920. }
  921. static void mod_GetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
  922. {
  923. mod_GetParami(effect, context, param, vals);
  924. }
  925. static void mod_GetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
  926. {
  927. switch(param)
  928. {
  929. case AL_RING_MODULATOR_FREQUENCY:
  930. *val = effect->Modulator.Frequency;
  931. break;
  932. case AL_RING_MODULATOR_HIGHPASS_CUTOFF:
  933. *val = effect->Modulator.HighPassCutoff;
  934. break;
  935. default:
  936. alSetError(context, AL_INVALID_ENUM);
  937. break;
  938. }
  939. }
  940. static void mod_GetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
  941. {
  942. mod_GetParamf(effect, context, param, vals);
  943. }
  944. static void ded_SetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val)
  945. { (void)effect;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
  946. static void ded_SetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
  947. {
  948. ded_SetParami(effect, context, param, vals[0]);
  949. }
  950. static void ded_SetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
  951. {
  952. switch(param)
  953. {
  954. case AL_DEDICATED_GAIN:
  955. if(val >= 0.0f && isfinite(val))
  956. effect->Dedicated.Gain = val;
  957. else
  958. alSetError(context, AL_INVALID_VALUE);
  959. break;
  960. default:
  961. alSetError(context, AL_INVALID_ENUM);
  962. break;
  963. }
  964. }
  965. static void ded_SetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
  966. {
  967. ded_SetParamf(effect, context, param, vals[0]);
  968. }
  969. static void ded_GetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint *val)
  970. { (void)effect;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
  971. static void ded_GetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
  972. {
  973. ded_GetParami(effect, context, param, vals);
  974. }
  975. static void ded_GetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
  976. {
  977. switch(param)
  978. {
  979. case AL_DEDICATED_GAIN:
  980. *val = effect->Dedicated.Gain;
  981. break;
  982. default:
  983. alSetError(context, AL_INVALID_ENUM);
  984. break;
  985. }
  986. }
  987. static void ded_GetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
  988. {
  989. ded_GetParamf(effect, context, param, vals);
  990. }
  991. static void null_SetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint val)
  992. { (void)effect;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
  993. static void null_SetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, const ALint *vals)
  994. { (void)effect;(void)param;(void)vals; alSetError(context, AL_INVALID_ENUM); }
  995. static void null_SetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat val)
  996. { (void)effect;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
  997. static void null_SetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, const ALfloat *vals)
  998. { (void)effect;(void)param;(void)vals; alSetError(context, AL_INVALID_ENUM); }
  999. static void null_GetParami(ALeffect *effect, ALCcontext *context, ALenum param, ALint *val)
  1000. { (void)effect;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
  1001. static void null_GetParamiv(ALeffect *effect, ALCcontext *context, ALenum param, ALint *vals)
  1002. { (void)effect;(void)param;(void)vals; alSetError(context, AL_INVALID_ENUM); }
  1003. static void null_GetParamf(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *val)
  1004. { (void)effect;(void)param;(void)val; alSetError(context, AL_INVALID_ENUM); }
  1005. static void null_GetParamfv(ALeffect *effect, ALCcontext *context, ALenum param, ALfloat *vals)
  1006. { (void)effect;(void)param;(void)vals; alSetError(context, AL_INVALID_ENUM); }
  1007. ALvoid ReleaseALEffects(ALCdevice *device)
  1008. {
  1009. ALsizei i;
  1010. for(i = 0;i < device->EffectMap.size;i++)
  1011. {
  1012. ALeffect *temp = device->EffectMap.array[i].value;
  1013. device->EffectMap.array[i].value = NULL;
  1014. // Release effect structure
  1015. FreeThunkEntry(temp->effect);
  1016. memset(temp, 0, sizeof(ALeffect));
  1017. free(temp);
  1018. }
  1019. }
  1020. static void InitEffectParams(ALeffect *effect, ALenum type)
  1021. {
  1022. switch(type)
  1023. {
  1024. case AL_EFFECT_EAXREVERB:
  1025. effect->Reverb.Density = AL_EAXREVERB_DEFAULT_DENSITY;
  1026. effect->Reverb.Diffusion = AL_EAXREVERB_DEFAULT_DIFFUSION;
  1027. effect->Reverb.Gain = AL_EAXREVERB_DEFAULT_GAIN;
  1028. effect->Reverb.GainHF = AL_EAXREVERB_DEFAULT_GAINHF;
  1029. effect->Reverb.GainLF = AL_EAXREVERB_DEFAULT_GAINLF;
  1030. effect->Reverb.DecayTime = AL_EAXREVERB_DEFAULT_DECAY_TIME;
  1031. effect->Reverb.DecayHFRatio = AL_EAXREVERB_DEFAULT_DECAY_HFRATIO;
  1032. effect->Reverb.DecayLFRatio = AL_EAXREVERB_DEFAULT_DECAY_LFRATIO;
  1033. effect->Reverb.ReflectionsGain = AL_EAXREVERB_DEFAULT_REFLECTIONS_GAIN;
  1034. effect->Reverb.ReflectionsDelay = AL_EAXREVERB_DEFAULT_REFLECTIONS_DELAY;
  1035. effect->Reverb.ReflectionsPan[0] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ;
  1036. effect->Reverb.ReflectionsPan[1] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ;
  1037. effect->Reverb.ReflectionsPan[2] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ;
  1038. effect->Reverb.LateReverbGain = AL_EAXREVERB_DEFAULT_LATE_REVERB_GAIN;
  1039. effect->Reverb.LateReverbDelay = AL_EAXREVERB_DEFAULT_LATE_REVERB_DELAY;
  1040. effect->Reverb.LateReverbPan[0] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ;
  1041. effect->Reverb.LateReverbPan[1] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ;
  1042. effect->Reverb.LateReverbPan[2] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ;
  1043. effect->Reverb.EchoTime = AL_EAXREVERB_DEFAULT_ECHO_TIME;
  1044. effect->Reverb.EchoDepth = AL_EAXREVERB_DEFAULT_ECHO_DEPTH;
  1045. effect->Reverb.ModulationTime = AL_EAXREVERB_DEFAULT_MODULATION_TIME;
  1046. effect->Reverb.ModulationDepth = AL_EAXREVERB_DEFAULT_MODULATION_DEPTH;
  1047. effect->Reverb.AirAbsorptionGainHF = AL_EAXREVERB_DEFAULT_AIR_ABSORPTION_GAINHF;
  1048. effect->Reverb.HFReference = AL_EAXREVERB_DEFAULT_HFREFERENCE;
  1049. effect->Reverb.LFReference = AL_EAXREVERB_DEFAULT_LFREFERENCE;
  1050. effect->Reverb.RoomRolloffFactor = AL_EAXREVERB_DEFAULT_ROOM_ROLLOFF_FACTOR;
  1051. effect->Reverb.DecayHFLimit = AL_EAXREVERB_DEFAULT_DECAY_HFLIMIT;
  1052. effect->SetParami = eaxreverb_SetParami;
  1053. effect->SetParamiv = eaxreverb_SetParamiv;
  1054. effect->SetParamf = eaxreverb_SetParamf;
  1055. effect->SetParamfv = eaxreverb_SetParamfv;
  1056. effect->GetParami = eaxreverb_GetParami;
  1057. effect->GetParamiv = eaxreverb_GetParamiv;
  1058. effect->GetParamf = eaxreverb_GetParamf;
  1059. effect->GetParamfv = eaxreverb_GetParamfv;
  1060. break;
  1061. case AL_EFFECT_REVERB:
  1062. effect->Reverb.Density = AL_REVERB_DEFAULT_DENSITY;
  1063. effect->Reverb.Diffusion = AL_REVERB_DEFAULT_DIFFUSION;
  1064. effect->Reverb.Gain = AL_REVERB_DEFAULT_GAIN;
  1065. effect->Reverb.GainHF = AL_REVERB_DEFAULT_GAINHF;
  1066. effect->Reverb.DecayTime = AL_REVERB_DEFAULT_DECAY_TIME;
  1067. effect->Reverb.DecayHFRatio = AL_REVERB_DEFAULT_DECAY_HFRATIO;
  1068. effect->Reverb.ReflectionsGain = AL_REVERB_DEFAULT_REFLECTIONS_GAIN;
  1069. effect->Reverb.ReflectionsDelay = AL_REVERB_DEFAULT_REFLECTIONS_DELAY;
  1070. effect->Reverb.LateReverbGain = AL_REVERB_DEFAULT_LATE_REVERB_GAIN;
  1071. effect->Reverb.LateReverbDelay = AL_REVERB_DEFAULT_LATE_REVERB_DELAY;
  1072. effect->Reverb.AirAbsorptionGainHF = AL_REVERB_DEFAULT_AIR_ABSORPTION_GAINHF;
  1073. effect->Reverb.RoomRolloffFactor = AL_REVERB_DEFAULT_ROOM_ROLLOFF_FACTOR;
  1074. effect->Reverb.DecayHFLimit = AL_REVERB_DEFAULT_DECAY_HFLIMIT;
  1075. effect->SetParami = reverb_SetParami;
  1076. effect->SetParamiv = reverb_SetParamiv;
  1077. effect->SetParamf = reverb_SetParamf;
  1078. effect->SetParamfv = reverb_SetParamfv;
  1079. effect->GetParami = reverb_GetParami;
  1080. effect->GetParamiv = reverb_GetParamiv;
  1081. effect->GetParamf = reverb_GetParamf;
  1082. effect->GetParamfv = reverb_GetParamfv;
  1083. break;
  1084. case AL_EFFECT_ECHO:
  1085. effect->Echo.Delay = AL_ECHO_DEFAULT_DELAY;
  1086. effect->Echo.LRDelay = AL_ECHO_DEFAULT_LRDELAY;
  1087. effect->Echo.Damping = AL_ECHO_DEFAULT_DAMPING;
  1088. effect->Echo.Feedback = AL_ECHO_DEFAULT_FEEDBACK;
  1089. effect->Echo.Spread = AL_ECHO_DEFAULT_SPREAD;
  1090. effect->SetParami = echo_SetParami;
  1091. effect->SetParamiv = echo_SetParamiv;
  1092. effect->SetParamf = echo_SetParamf;
  1093. effect->SetParamfv = echo_SetParamfv;
  1094. effect->GetParami = echo_GetParami;
  1095. effect->GetParamiv = echo_GetParamiv;
  1096. effect->GetParamf = echo_GetParamf;
  1097. effect->GetParamfv = echo_GetParamfv;
  1098. break;
  1099. case AL_EFFECT_RING_MODULATOR:
  1100. effect->Modulator.Frequency = AL_RING_MODULATOR_DEFAULT_FREQUENCY;
  1101. effect->Modulator.HighPassCutoff = AL_RING_MODULATOR_DEFAULT_HIGHPASS_CUTOFF;
  1102. effect->Modulator.Waveform = AL_RING_MODULATOR_DEFAULT_WAVEFORM;
  1103. effect->SetParami = mod_SetParami;
  1104. effect->SetParamiv = mod_SetParamiv;
  1105. effect->SetParamf = mod_SetParamf;
  1106. effect->SetParamfv = mod_SetParamfv;
  1107. effect->GetParami = mod_GetParami;
  1108. effect->GetParamiv = mod_GetParamiv;
  1109. effect->GetParamf = mod_GetParamf;
  1110. effect->GetParamfv = mod_GetParamfv;
  1111. break;
  1112. case AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT:
  1113. case AL_EFFECT_DEDICATED_DIALOGUE:
  1114. effect->Dedicated.Gain = 1.0f;
  1115. effect->SetParami = ded_SetParami;
  1116. effect->SetParamiv = ded_SetParamiv;
  1117. effect->SetParamf = ded_SetParamf;
  1118. effect->SetParamfv = ded_SetParamfv;
  1119. effect->GetParami = ded_GetParami;
  1120. effect->GetParamiv = ded_GetParamiv;
  1121. effect->GetParamf = ded_GetParamf;
  1122. effect->GetParamfv = ded_GetParamfv;
  1123. break;
  1124. default:
  1125. effect->SetParami = null_SetParami;
  1126. effect->SetParamiv = null_SetParamiv;
  1127. effect->SetParamf = null_SetParamf;
  1128. effect->SetParamfv = null_SetParamfv;
  1129. effect->GetParami = null_GetParami;
  1130. effect->GetParamiv = null_GetParamiv;
  1131. effect->GetParamf = null_GetParamf;
  1132. effect->GetParamfv = null_GetParamfv;
  1133. break;
  1134. }
  1135. effect->type = type;
  1136. }