alEffect.c 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511
  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 || InitEffect(effect) != AL_NO_ERROR)
  47. {
  48. free(effect);
  49. alSetError(Context, AL_OUT_OF_MEMORY);
  50. alDeleteEffects(i, effects);
  51. break;
  52. }
  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. ALenum InitEffect(ALeffect *effect)
  1008. {
  1009. InitEffectParams(effect, AL_EFFECT_NULL);
  1010. return AL_NO_ERROR;
  1011. }
  1012. ALvoid ReleaseALEffects(ALCdevice *device)
  1013. {
  1014. ALsizei i;
  1015. for(i = 0;i < device->EffectMap.size;i++)
  1016. {
  1017. ALeffect *temp = device->EffectMap.array[i].value;
  1018. device->EffectMap.array[i].value = NULL;
  1019. // Release effect structure
  1020. FreeThunkEntry(temp->effect);
  1021. memset(temp, 0, sizeof(ALeffect));
  1022. free(temp);
  1023. }
  1024. }
  1025. static void InitEffectParams(ALeffect *effect, ALenum type)
  1026. {
  1027. switch(type)
  1028. {
  1029. case AL_EFFECT_EAXREVERB:
  1030. effect->Reverb.Density = AL_EAXREVERB_DEFAULT_DENSITY;
  1031. effect->Reverb.Diffusion = AL_EAXREVERB_DEFAULT_DIFFUSION;
  1032. effect->Reverb.Gain = AL_EAXREVERB_DEFAULT_GAIN;
  1033. effect->Reverb.GainHF = AL_EAXREVERB_DEFAULT_GAINHF;
  1034. effect->Reverb.GainLF = AL_EAXREVERB_DEFAULT_GAINLF;
  1035. effect->Reverb.DecayTime = AL_EAXREVERB_DEFAULT_DECAY_TIME;
  1036. effect->Reverb.DecayHFRatio = AL_EAXREVERB_DEFAULT_DECAY_HFRATIO;
  1037. effect->Reverb.DecayLFRatio = AL_EAXREVERB_DEFAULT_DECAY_LFRATIO;
  1038. effect->Reverb.ReflectionsGain = AL_EAXREVERB_DEFAULT_REFLECTIONS_GAIN;
  1039. effect->Reverb.ReflectionsDelay = AL_EAXREVERB_DEFAULT_REFLECTIONS_DELAY;
  1040. effect->Reverb.ReflectionsPan[0] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ;
  1041. effect->Reverb.ReflectionsPan[1] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ;
  1042. effect->Reverb.ReflectionsPan[2] = AL_EAXREVERB_DEFAULT_REFLECTIONS_PAN_XYZ;
  1043. effect->Reverb.LateReverbGain = AL_EAXREVERB_DEFAULT_LATE_REVERB_GAIN;
  1044. effect->Reverb.LateReverbDelay = AL_EAXREVERB_DEFAULT_LATE_REVERB_DELAY;
  1045. effect->Reverb.LateReverbPan[0] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ;
  1046. effect->Reverb.LateReverbPan[1] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ;
  1047. effect->Reverb.LateReverbPan[2] = AL_EAXREVERB_DEFAULT_LATE_REVERB_PAN_XYZ;
  1048. effect->Reverb.EchoTime = AL_EAXREVERB_DEFAULT_ECHO_TIME;
  1049. effect->Reverb.EchoDepth = AL_EAXREVERB_DEFAULT_ECHO_DEPTH;
  1050. effect->Reverb.ModulationTime = AL_EAXREVERB_DEFAULT_MODULATION_TIME;
  1051. effect->Reverb.ModulationDepth = AL_EAXREVERB_DEFAULT_MODULATION_DEPTH;
  1052. effect->Reverb.AirAbsorptionGainHF = AL_EAXREVERB_DEFAULT_AIR_ABSORPTION_GAINHF;
  1053. effect->Reverb.HFReference = AL_EAXREVERB_DEFAULT_HFREFERENCE;
  1054. effect->Reverb.LFReference = AL_EAXREVERB_DEFAULT_LFREFERENCE;
  1055. effect->Reverb.RoomRolloffFactor = AL_EAXREVERB_DEFAULT_ROOM_ROLLOFF_FACTOR;
  1056. effect->Reverb.DecayHFLimit = AL_EAXREVERB_DEFAULT_DECAY_HFLIMIT;
  1057. effect->SetParami = eaxreverb_SetParami;
  1058. effect->SetParamiv = eaxreverb_SetParamiv;
  1059. effect->SetParamf = eaxreverb_SetParamf;
  1060. effect->SetParamfv = eaxreverb_SetParamfv;
  1061. effect->GetParami = eaxreverb_GetParami;
  1062. effect->GetParamiv = eaxreverb_GetParamiv;
  1063. effect->GetParamf = eaxreverb_GetParamf;
  1064. effect->GetParamfv = eaxreverb_GetParamfv;
  1065. break;
  1066. case AL_EFFECT_REVERB:
  1067. effect->Reverb.Density = AL_REVERB_DEFAULT_DENSITY;
  1068. effect->Reverb.Diffusion = AL_REVERB_DEFAULT_DIFFUSION;
  1069. effect->Reverb.Gain = AL_REVERB_DEFAULT_GAIN;
  1070. effect->Reverb.GainHF = AL_REVERB_DEFAULT_GAINHF;
  1071. effect->Reverb.DecayTime = AL_REVERB_DEFAULT_DECAY_TIME;
  1072. effect->Reverb.DecayHFRatio = AL_REVERB_DEFAULT_DECAY_HFRATIO;
  1073. effect->Reverb.ReflectionsGain = AL_REVERB_DEFAULT_REFLECTIONS_GAIN;
  1074. effect->Reverb.ReflectionsDelay = AL_REVERB_DEFAULT_REFLECTIONS_DELAY;
  1075. effect->Reverb.LateReverbGain = AL_REVERB_DEFAULT_LATE_REVERB_GAIN;
  1076. effect->Reverb.LateReverbDelay = AL_REVERB_DEFAULT_LATE_REVERB_DELAY;
  1077. effect->Reverb.AirAbsorptionGainHF = AL_REVERB_DEFAULT_AIR_ABSORPTION_GAINHF;
  1078. effect->Reverb.RoomRolloffFactor = AL_REVERB_DEFAULT_ROOM_ROLLOFF_FACTOR;
  1079. effect->Reverb.DecayHFLimit = AL_REVERB_DEFAULT_DECAY_HFLIMIT;
  1080. effect->SetParami = reverb_SetParami;
  1081. effect->SetParamiv = reverb_SetParamiv;
  1082. effect->SetParamf = reverb_SetParamf;
  1083. effect->SetParamfv = reverb_SetParamfv;
  1084. effect->GetParami = reverb_GetParami;
  1085. effect->GetParamiv = reverb_GetParamiv;
  1086. effect->GetParamf = reverb_GetParamf;
  1087. effect->GetParamfv = reverb_GetParamfv;
  1088. break;
  1089. case AL_EFFECT_ECHO:
  1090. effect->Echo.Delay = AL_ECHO_DEFAULT_DELAY;
  1091. effect->Echo.LRDelay = AL_ECHO_DEFAULT_LRDELAY;
  1092. effect->Echo.Damping = AL_ECHO_DEFAULT_DAMPING;
  1093. effect->Echo.Feedback = AL_ECHO_DEFAULT_FEEDBACK;
  1094. effect->Echo.Spread = AL_ECHO_DEFAULT_SPREAD;
  1095. effect->SetParami = echo_SetParami;
  1096. effect->SetParamiv = echo_SetParamiv;
  1097. effect->SetParamf = echo_SetParamf;
  1098. effect->SetParamfv = echo_SetParamfv;
  1099. effect->GetParami = echo_GetParami;
  1100. effect->GetParamiv = echo_GetParamiv;
  1101. effect->GetParamf = echo_GetParamf;
  1102. effect->GetParamfv = echo_GetParamfv;
  1103. break;
  1104. case AL_EFFECT_RING_MODULATOR:
  1105. effect->Modulator.Frequency = AL_RING_MODULATOR_DEFAULT_FREQUENCY;
  1106. effect->Modulator.HighPassCutoff = AL_RING_MODULATOR_DEFAULT_HIGHPASS_CUTOFF;
  1107. effect->Modulator.Waveform = AL_RING_MODULATOR_DEFAULT_WAVEFORM;
  1108. effect->SetParami = mod_SetParami;
  1109. effect->SetParamiv = mod_SetParamiv;
  1110. effect->SetParamf = mod_SetParamf;
  1111. effect->SetParamfv = mod_SetParamfv;
  1112. effect->GetParami = mod_GetParami;
  1113. effect->GetParamiv = mod_GetParamiv;
  1114. effect->GetParamf = mod_GetParamf;
  1115. effect->GetParamfv = mod_GetParamfv;
  1116. break;
  1117. case AL_EFFECT_DEDICATED_LOW_FREQUENCY_EFFECT:
  1118. case AL_EFFECT_DEDICATED_DIALOGUE:
  1119. effect->Dedicated.Gain = 1.0f;
  1120. effect->SetParami = ded_SetParami;
  1121. effect->SetParamiv = ded_SetParamiv;
  1122. effect->SetParamf = ded_SetParamf;
  1123. effect->SetParamfv = ded_SetParamfv;
  1124. effect->GetParami = ded_GetParami;
  1125. effect->GetParamiv = ded_GetParamiv;
  1126. effect->GetParamf = ded_GetParamf;
  1127. effect->GetParamfv = ded_GetParamfv;
  1128. break;
  1129. default:
  1130. effect->SetParami = null_SetParami;
  1131. effect->SetParamiv = null_SetParamiv;
  1132. effect->SetParamf = null_SetParamf;
  1133. effect->SetParamfv = null_SetParamfv;
  1134. effect->GetParami = null_GetParami;
  1135. effect->GetParamiv = null_GetParamiv;
  1136. effect->GetParamf = null_GetParamf;
  1137. effect->GetParamfv = null_GetParamfv;
  1138. break;
  1139. }
  1140. effect->type = type;
  1141. }
  1142. #include "AL/efx-presets.h"
  1143. #define DECL(x) { #x, EFX_REVERB_PRESET_##x }
  1144. static const struct {
  1145. const char name[32];
  1146. EFXEAXREVERBPROPERTIES props;
  1147. } reverblist[] = {
  1148. DECL(GENERIC),
  1149. DECL(PADDEDCELL),
  1150. DECL(ROOM),
  1151. DECL(BATHROOM),
  1152. DECL(LIVINGROOM),
  1153. DECL(STONEROOM),
  1154. DECL(AUDITORIUM),
  1155. DECL(CONCERTHALL),
  1156. DECL(CAVE),
  1157. DECL(ARENA),
  1158. DECL(HANGAR),
  1159. DECL(CARPETEDHALLWAY),
  1160. DECL(HALLWAY),
  1161. DECL(STONECORRIDOR),
  1162. DECL(ALLEY),
  1163. DECL(FOREST),
  1164. DECL(CITY),
  1165. DECL(MOUNTAINS),
  1166. DECL(QUARRY),
  1167. DECL(PLAIN),
  1168. DECL(PARKINGLOT),
  1169. DECL(SEWERPIPE),
  1170. DECL(UNDERWATER),
  1171. DECL(DRUGGED),
  1172. DECL(DIZZY),
  1173. DECL(PSYCHOTIC),
  1174. DECL(CASTLE_SMALLROOM),
  1175. DECL(CASTLE_SHORTPASSAGE),
  1176. DECL(CASTLE_MEDIUMROOM),
  1177. DECL(CASTLE_LARGEROOM),
  1178. DECL(CASTLE_LONGPASSAGE),
  1179. DECL(CASTLE_HALL),
  1180. DECL(CASTLE_CUPBOARD),
  1181. DECL(CASTLE_COURTYARD),
  1182. DECL(CASTLE_ALCOVE),
  1183. DECL(FACTORY_SMALLROOM),
  1184. DECL(FACTORY_SHORTPASSAGE),
  1185. DECL(FACTORY_MEDIUMROOM),
  1186. DECL(FACTORY_LARGEROOM),
  1187. DECL(FACTORY_LONGPASSAGE),
  1188. DECL(FACTORY_HALL),
  1189. DECL(FACTORY_CUPBOARD),
  1190. DECL(FACTORY_COURTYARD),
  1191. DECL(FACTORY_ALCOVE),
  1192. DECL(ICEPALACE_SMALLROOM),
  1193. DECL(ICEPALACE_SHORTPASSAGE),
  1194. DECL(ICEPALACE_MEDIUMROOM),
  1195. DECL(ICEPALACE_LARGEROOM),
  1196. DECL(ICEPALACE_LONGPASSAGE),
  1197. DECL(ICEPALACE_HALL),
  1198. DECL(ICEPALACE_CUPBOARD),
  1199. DECL(ICEPALACE_COURTYARD),
  1200. DECL(ICEPALACE_ALCOVE),
  1201. DECL(SPACESTATION_SMALLROOM),
  1202. DECL(SPACESTATION_SHORTPASSAGE),
  1203. DECL(SPACESTATION_MEDIUMROOM),
  1204. DECL(SPACESTATION_LARGEROOM),
  1205. DECL(SPACESTATION_LONGPASSAGE),
  1206. DECL(SPACESTATION_HALL),
  1207. DECL(SPACESTATION_CUPBOARD),
  1208. DECL(SPACESTATION_ALCOVE),
  1209. DECL(WOODEN_SMALLROOM),
  1210. DECL(WOODEN_SHORTPASSAGE),
  1211. DECL(WOODEN_MEDIUMROOM),
  1212. DECL(WOODEN_LARGEROOM),
  1213. DECL(WOODEN_LONGPASSAGE),
  1214. DECL(WOODEN_HALL),
  1215. DECL(WOODEN_CUPBOARD),
  1216. DECL(WOODEN_COURTYARD),
  1217. DECL(WOODEN_ALCOVE),
  1218. DECL(SPORT_EMPTYSTADIUM),
  1219. DECL(SPORT_SQUASHCOURT),
  1220. DECL(SPORT_SMALLSWIMMINGPOOL),
  1221. DECL(SPORT_LARGESWIMMINGPOOL),
  1222. DECL(SPORT_GYMNASIUM),
  1223. DECL(SPORT_FULLSTADIUM),
  1224. DECL(SPORT_STADIUMTANNOY),
  1225. DECL(PREFAB_WORKSHOP),
  1226. DECL(PREFAB_SCHOOLROOM),
  1227. DECL(PREFAB_PRACTISEROOM),
  1228. DECL(PREFAB_OUTHOUSE),
  1229. DECL(PREFAB_CARAVAN),
  1230. DECL(DOME_TOMB),
  1231. DECL(PIPE_SMALL),
  1232. DECL(DOME_SAINTPAULS),
  1233. DECL(PIPE_LONGTHIN),
  1234. DECL(PIPE_LARGE),
  1235. DECL(PIPE_RESONANT),
  1236. DECL(OUTDOORS_BACKYARD),
  1237. DECL(OUTDOORS_ROLLINGPLAINS),
  1238. DECL(OUTDOORS_DEEPCANYON),
  1239. DECL(OUTDOORS_CREEK),
  1240. DECL(OUTDOORS_VALLEY),
  1241. DECL(MOOD_HEAVEN),
  1242. DECL(MOOD_HELL),
  1243. DECL(MOOD_MEMORY),
  1244. DECL(DRIVING_COMMENTATOR),
  1245. DECL(DRIVING_PITGARAGE),
  1246. DECL(DRIVING_INCAR_RACER),
  1247. DECL(DRIVING_INCAR_SPORTS),
  1248. DECL(DRIVING_INCAR_LUXURY),
  1249. DECL(DRIVING_FULLGRANDSTAND),
  1250. DECL(DRIVING_EMPTYGRANDSTAND),
  1251. DECL(DRIVING_TUNNEL),
  1252. DECL(CITY_STREETS),
  1253. DECL(CITY_SUBWAY),
  1254. DECL(CITY_MUSEUM),
  1255. DECL(CITY_LIBRARY),
  1256. DECL(CITY_UNDERPASS),
  1257. DECL(CITY_ABANDONED),
  1258. DECL(DUSTYROOM),
  1259. DECL(CHAPEL),
  1260. DECL(SMALLWATERROOM),
  1261. };
  1262. #undef DECL
  1263. static const ALsizei reverblistsize = COUNTOF(reverblist);
  1264. ALvoid LoadReverbPreset(const char *name, ALeffect *effect)
  1265. {
  1266. int i;
  1267. if(strcasecmp(name, "NONE") == 0)
  1268. {
  1269. InitEffectParams(effect, AL_EFFECT_NULL);
  1270. TRACE("Loading reverb '%s'\n", "NONE");
  1271. return;
  1272. }
  1273. if(!DisabledEffects[EAXREVERB])
  1274. InitEffectParams(effect, AL_EFFECT_EAXREVERB);
  1275. else if(!DisabledEffects[REVERB])
  1276. InitEffectParams(effect, AL_EFFECT_REVERB);
  1277. else
  1278. InitEffectParams(effect, AL_EFFECT_NULL);
  1279. for(i = 0;i < reverblistsize;i++)
  1280. {
  1281. const EFXEAXREVERBPROPERTIES *props;
  1282. if(strcasecmp(name, reverblist[i].name) != 0)
  1283. continue;
  1284. TRACE("Loading reverb '%s'\n", reverblist[i].name);
  1285. props = &reverblist[i].props;
  1286. effect->Reverb.Density = props->flDensity;
  1287. effect->Reverb.Diffusion = props->flDiffusion;
  1288. effect->Reverb.Gain = props->flGain;
  1289. effect->Reverb.GainHF = props->flGainHF;
  1290. effect->Reverb.GainLF = props->flGainLF;
  1291. effect->Reverb.DecayTime = props->flDecayTime;
  1292. effect->Reverb.DecayHFRatio = props->flDecayHFRatio;
  1293. effect->Reverb.DecayLFRatio = props->flDecayLFRatio;
  1294. effect->Reverb.ReflectionsGain = props->flReflectionsGain;
  1295. effect->Reverb.ReflectionsDelay = props->flReflectionsDelay;
  1296. effect->Reverb.ReflectionsPan[0] = props->flReflectionsPan[0];
  1297. effect->Reverb.ReflectionsPan[1] = props->flReflectionsPan[1];
  1298. effect->Reverb.ReflectionsPan[2] = props->flReflectionsPan[2];
  1299. effect->Reverb.LateReverbGain = props->flLateReverbGain;
  1300. effect->Reverb.LateReverbDelay = props->flLateReverbDelay;
  1301. effect->Reverb.LateReverbPan[0] = props->flLateReverbPan[0];
  1302. effect->Reverb.LateReverbPan[1] = props->flLateReverbPan[1];
  1303. effect->Reverb.LateReverbPan[2] = props->flLateReverbPan[2];
  1304. effect->Reverb.EchoTime = props->flEchoTime;
  1305. effect->Reverb.EchoDepth = props->flEchoDepth;
  1306. effect->Reverb.ModulationTime = props->flModulationTime;
  1307. effect->Reverb.ModulationDepth = props->flModulationDepth;
  1308. effect->Reverb.AirAbsorptionGainHF = props->flAirAbsorptionGainHF;
  1309. effect->Reverb.HFReference = props->flHFReference;
  1310. effect->Reverb.LFReference = props->flLFReference;
  1311. effect->Reverb.RoomRolloffFactor = props->flRoomRolloffFactor;
  1312. effect->Reverb.DecayHFLimit = props->iDecayHFLimit;
  1313. break;
  1314. }
  1315. if(i == reverblistsize)
  1316. WARN("Reverb preset '%s' not found\n", name);
  1317. }