12 #include "midi/base.h"
15 extern inline struct ALfontsound
*LookupFontsound(ALCdevice
*device
, ALuint id
);
16 extern inline struct ALfontsound
*RemoveFontsound(ALCdevice
*device
, ALuint id
);
18 static void ALfontsound_Construct(ALfontsound
*self
);
19 static void ALfontsound_Destruct(ALfontsound
*self
);
20 void ALfontsound_setPropi(ALfontsound
*self
, ALCcontext
*context
, ALenum param
, ALint value
);
23 AL_API
void AL_APIENTRY
alGenFontsoundsSOFT(ALsizei n
, ALuint
*ids
)
28 context
= GetContextRef();
32 SET_ERROR_AND_GOTO(context
, AL_INVALID_VALUE
, done
);
34 for(cur
= 0;cur
< n
;cur
++)
36 ALfontsound
*sound
= NewFontsound(context
);
39 alDeleteFontsoundsSOFT(cur
, ids
);
47 ALCcontext_DecRef(context
);
50 AL_API ALvoid AL_APIENTRY
alDeleteFontsoundsSOFT(ALsizei n
, const ALuint
*ids
)
57 context
= GetContextRef();
61 SET_ERROR_AND_GOTO(context
, AL_INVALID_VALUE
, done
);
63 device
= context
->Device
;
66 /* Check for valid ID */
67 if((inst
=LookupFontsound(device
, ids
[i
])) == NULL
)
68 SET_ERROR_AND_GOTO(context
, AL_INVALID_NAME
, done
);
70 SET_ERROR_AND_GOTO(context
, AL_INVALID_OPERATION
, done
);
75 if((inst
=RemoveFontsound(device
, ids
[i
])) == NULL
)
78 ALfontsound_Destruct(inst
);
80 memset(inst
, 0, sizeof(*inst
));
85 ALCcontext_DecRef(context
);
88 AL_API ALboolean AL_APIENTRY
alIsFontsoundSOFT(ALuint id
)
93 context
= GetContextRef();
94 if(!context
) return AL_FALSE
;
96 ret
= LookupFontsound(context
->Device
, id
) ? AL_TRUE
: AL_FALSE
;
98 ALCcontext_DecRef(context
);
103 AL_API
void AL_APIENTRY
alFontsoundiSOFT(ALuint id
, ALenum param
, ALint value
)
109 context
= GetContextRef();
112 device
= context
->Device
;
113 if(!(sound
=LookupFontsound(device
, id
)))
114 SET_ERROR_AND_GOTO(context
, AL_INVALID_NAME
, done
);
116 SET_ERROR_AND_GOTO(context
, AL_INVALID_OPERATION
, done
);
118 ALfontsound_setPropi(sound
, context
, param
, value
);
121 ALCcontext_DecRef(context
);
124 AL_API
void AL_APIENTRY
alFontsound2iSOFT(ALuint id
, ALenum param
, ALint value1
, ALint value2
)
130 context
= GetContextRef();
133 device
= context
->Device
;
134 if(!(sound
=LookupFontsound(device
, id
)))
135 SET_ERROR_AND_GOTO(context
, AL_INVALID_NAME
, done
);
137 SET_ERROR_AND_GOTO(context
, AL_INVALID_OPERATION
, done
);
140 case AL_KEY_RANGE_SOFT
:
141 if(!(value1
>= 0 && value1
<= 127 && value2
>= 0 && value2
<= 127))
142 SET_ERROR_AND_GOTO(context
, AL_INVALID_VALUE
, done
);
143 sound
->MinKey
= value1
;
144 sound
->MaxKey
= value2
;
147 case AL_VELOCITY_RANGE_SOFT
:
148 if(!(value1
>= 0 && value1
<= 127 && value2
>= 0 && value2
<= 127))
149 SET_ERROR_AND_GOTO(context
, AL_INVALID_VALUE
, done
);
150 sound
->MinVelocity
= value1
;
151 sound
->MaxVelocity
= value2
;
155 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
159 ALCcontext_DecRef(context
);
162 AL_API
void AL_APIENTRY
alFontsoundivSOFT(ALuint id
, ALenum param
, const ALint
*values
)
170 case AL_KEY_RANGE_SOFT
:
171 case AL_VELOCITY_RANGE_SOFT
:
172 alFontsound2iSOFT(id
, param
, values
[0], values
[1]);
175 case AL_MOD_LFO_TO_PITCH_SOFT
:
176 case AL_VIBRATO_LFO_TO_PITCH_SOFT
:
177 case AL_MOD_ENV_TO_PITCH_SOFT
:
178 case AL_FILTER_CUTOFF_SOFT
:
179 case AL_FILTER_RESONANCE_SOFT
:
180 case AL_MOD_LFO_TO_FILTER_CUTOFF_SOFT
:
181 case AL_MOD_ENV_TO_FILTER_CUTOFF_SOFT
:
182 case AL_MOD_LFO_TO_VOLUME_SOFT
:
183 case AL_CHORUS_SEND_SOFT
:
184 case AL_REVERB_SEND_SOFT
:
186 case AL_MOD_LFO_DELAY_SOFT
:
187 case AL_MOD_LFO_FREQUENCY_SOFT
:
188 case AL_VIBRATO_LFO_DELAY_SOFT
:
189 case AL_VIBRATO_LFO_FREQUENCY_SOFT
:
190 case AL_MOD_ENV_DELAYTIME_SOFT
:
191 case AL_MOD_ENV_ATTACKTIME_SOFT
:
192 case AL_MOD_ENV_HOLDTIME_SOFT
:
193 case AL_MOD_ENV_DECAYTIME_SOFT
:
194 case AL_MOD_ENV_SUSTAINVOLUME_SOFT
:
195 case AL_MOD_ENV_RELEASETIME_SOFT
:
196 case AL_MOD_ENV_KEY_TO_HOLDTIME_SOFT
:
197 case AL_MOD_ENV_KEY_TO_DECAYTIME_SOFT
:
198 case AL_VOLUME_ENV_DELAYTIME_SOFT
:
199 case AL_VOLUME_ENV_ATTACKTIME_SOFT
:
200 case AL_VOLUME_ENV_HOLDTIME_SOFT
:
201 case AL_VOLUME_ENV_DECAYTIME_SOFT
:
202 case AL_VOLUME_ENV_SUSTAINVOLUME_SOFT
:
203 case AL_VOLUME_ENV_RELEASETIME_SOFT
:
204 case AL_VOLUME_ENV_KEY_TO_HOLDTIME_SOFT
:
205 case AL_VOLUME_ENV_KEY_TO_DECAYTIME_SOFT
:
206 case AL_ATTENUATION_SOFT
:
207 case AL_TUNING_COARSE_SOFT
:
208 case AL_TUNING_FINE_SOFT
:
209 case AL_LOOP_MODE_SOFT
:
210 case AL_TUNING_SCALE_SOFT
:
211 case AL_EXCLUSIVE_CLASS_SOFT
:
212 case AL_SAMPLE_START_SOFT
:
213 case AL_SAMPLE_END_SOFT
:
214 case AL_SAMPLE_LOOP_START_SOFT
:
215 case AL_SAMPLE_LOOP_END_SOFT
:
216 case AL_SAMPLE_RATE_SOFT
:
217 case AL_BASE_KEY_SOFT
:
218 case AL_KEY_CORRECTION_SOFT
:
219 case AL_SAMPLE_TYPE_SOFT
:
220 case AL_FONTSOUND_LINK_SOFT
:
221 alFontsoundiSOFT(id
, param
, values
[0]);
225 context
= GetContextRef();
228 device
= context
->Device
;
229 if(!(sound
=LookupFontsound(device
, id
)))
230 SET_ERROR_AND_GOTO(context
, AL_INVALID_NAME
, done
);
232 SET_ERROR_AND_GOTO(context
, AL_INVALID_OPERATION
, done
);
236 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
240 ALCcontext_DecRef(context
);
243 AL_API
void AL_APIENTRY
alGetFontsoundivSOFT(ALuint id
, ALenum param
, ALint
*values
)
247 const ALfontsound
*sound
;
249 context
= GetContextRef();
252 device
= context
->Device
;
253 if(!(sound
=LookupFontsound(device
, id
)))
254 SET_ERROR_AND_GOTO(context
, AL_INVALID_NAME
, done
);
257 case AL_MOD_LFO_TO_PITCH_SOFT
:
258 values
[0] = sound
->ModLfoToPitch
;
261 case AL_VIBRATO_LFO_TO_PITCH_SOFT
:
262 values
[0] = sound
->VibratoLfoToPitch
;
265 case AL_MOD_ENV_TO_PITCH_SOFT
:
266 values
[0] = sound
->ModEnvToPitch
;
269 case AL_FILTER_CUTOFF_SOFT
:
270 values
[0] = sound
->FilterCutoff
;
273 case AL_FILTER_RESONANCE_SOFT
:
274 values
[0] = sound
->FilterQ
;
277 case AL_MOD_LFO_TO_FILTER_CUTOFF_SOFT
:
278 values
[0] = sound
->ModLfoToFilterCutoff
;
281 case AL_MOD_ENV_TO_FILTER_CUTOFF_SOFT
:
282 values
[0] = sound
->ModEnvToFilterCutoff
;
285 case AL_MOD_LFO_TO_VOLUME_SOFT
:
286 values
[0] = sound
->ModLfoToVolume
;
289 case AL_CHORUS_SEND_SOFT
:
290 values
[0] = sound
->ChorusSend
;
293 case AL_REVERB_SEND_SOFT
:
294 values
[0] = sound
->ReverbSend
;
298 values
[0] = sound
->Pan
;
301 case AL_MOD_LFO_DELAY_SOFT
:
302 values
[0] = sound
->ModLfo
.Delay
;
304 case AL_MOD_LFO_FREQUENCY_SOFT
:
305 values
[0] = sound
->ModLfo
.Frequency
;
308 case AL_VIBRATO_LFO_DELAY_SOFT
:
309 values
[0] = sound
->VibratoLfo
.Delay
;
311 case AL_VIBRATO_LFO_FREQUENCY_SOFT
:
312 values
[0] = sound
->VibratoLfo
.Frequency
;
315 case AL_MOD_ENV_DELAYTIME_SOFT
:
316 values
[0] = sound
->ModEnv
.DelayTime
;
318 case AL_MOD_ENV_ATTACKTIME_SOFT
:
319 values
[0] = sound
->ModEnv
.AttackTime
;
321 case AL_MOD_ENV_HOLDTIME_SOFT
:
322 values
[0] = sound
->ModEnv
.HoldTime
;
324 case AL_MOD_ENV_DECAYTIME_SOFT
:
325 values
[0] = sound
->ModEnv
.DecayTime
;
327 case AL_MOD_ENV_SUSTAINVOLUME_SOFT
:
328 values
[0] = sound
->ModEnv
.SustainVol
;
330 case AL_MOD_ENV_RELEASETIME_SOFT
:
331 values
[0] = sound
->ModEnv
.ReleaseTime
;
333 case AL_MOD_ENV_KEY_TO_HOLDTIME_SOFT
:
334 values
[0] = sound
->ModEnv
.KeyToHoldTime
;
336 case AL_MOD_ENV_KEY_TO_DECAYTIME_SOFT
:
337 values
[0] = sound
->ModEnv
.KeyToDecayTime
;
340 case AL_VOLUME_ENV_DELAYTIME_SOFT
:
341 values
[0] = sound
->VolEnv
.DelayTime
;
343 case AL_VOLUME_ENV_ATTACKTIME_SOFT
:
344 values
[0] = sound
->VolEnv
.AttackTime
;
346 case AL_VOLUME_ENV_HOLDTIME_SOFT
:
347 values
[0] = sound
->VolEnv
.HoldTime
;
349 case AL_VOLUME_ENV_DECAYTIME_SOFT
:
350 values
[0] = sound
->VolEnv
.DecayTime
;
352 case AL_VOLUME_ENV_SUSTAINVOLUME_SOFT
:
353 values
[0] = sound
->VolEnv
.SustainVol
;
355 case AL_VOLUME_ENV_RELEASETIME_SOFT
:
356 values
[0] = sound
->VolEnv
.ReleaseTime
;
358 case AL_VOLUME_ENV_KEY_TO_HOLDTIME_SOFT
:
359 values
[0] = sound
->VolEnv
.KeyToHoldTime
;
361 case AL_VOLUME_ENV_KEY_TO_DECAYTIME_SOFT
:
362 values
[0] = sound
->VolEnv
.KeyToDecayTime
;
365 case AL_KEY_RANGE_SOFT
:
366 values
[0] = sound
->MinKey
;
367 values
[1] = sound
->MaxKey
;
370 case AL_VELOCITY_RANGE_SOFT
:
371 values
[0] = sound
->MinVelocity
;
372 values
[1] = sound
->MaxVelocity
;
375 case AL_ATTENUATION_SOFT
:
376 values
[0] = sound
->Attenuation
;
379 case AL_TUNING_COARSE_SOFT
:
380 values
[0] = sound
->CoarseTuning
;
382 case AL_TUNING_FINE_SOFT
:
383 values
[0] = sound
->FineTuning
;
386 case AL_LOOP_MODE_SOFT
:
387 values
[0] = sound
->LoopMode
;
390 case AL_TUNING_SCALE_SOFT
:
391 values
[0] = sound
->TuningScale
;
394 case AL_EXCLUSIVE_CLASS_SOFT
:
395 values
[0] = sound
->ExclusiveClass
;
398 case AL_SAMPLE_START_SOFT
:
399 values
[0] = sound
->Start
;
402 case AL_SAMPLE_END_SOFT
:
403 values
[0] = sound
->End
;
406 case AL_SAMPLE_LOOP_START_SOFT
:
407 values
[0] = sound
->LoopStart
;
410 case AL_SAMPLE_LOOP_END_SOFT
:
411 values
[0] = sound
->LoopEnd
;
414 case AL_SAMPLE_RATE_SOFT
:
415 values
[0] = sound
->SampleRate
;
418 case AL_BASE_KEY_SOFT
:
419 values
[0] = sound
->PitchKey
;
422 case AL_KEY_CORRECTION_SOFT
:
423 values
[0] = sound
->PitchCorrection
;
426 case AL_SAMPLE_TYPE_SOFT
:
427 values
[0] = sound
->SampleType
;
430 case AL_FONTSOUND_LINK_SOFT
:
431 values
[0] = (sound
->Link
? sound
->Link
->id
: 0);
435 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
439 ALCcontext_DecRef(context
);
443 ALfontsound
*NewFontsound(ALCcontext
*context
)
445 ALCdevice
*device
= context
->Device
;
449 sound
= calloc(1, sizeof(*sound
));
451 SET_ERROR_AND_RETURN_VALUE(context
, AL_OUT_OF_MEMORY
, NULL
);
452 ALfontsound_Construct(sound
);
454 err
= NewThunkEntry(&sound
->id
);
455 if(err
== AL_NO_ERROR
)
456 err
= InsertUIntMapEntry(&device
->FontsoundMap
, sound
->id
, sound
);
457 if(err
!= AL_NO_ERROR
)
459 ALfontsound_Destruct(sound
);
460 memset(sound
, 0, sizeof(*sound
));
463 SET_ERROR_AND_RETURN_VALUE(context
, err
, NULL
);
470 static void ALfontsound_Construct(ALfontsound
*self
)
476 self
->MinVelocity
= 0;
477 self
->MaxVelocity
= 127;
479 self
->ModLfoToPitch
= 0;
480 self
->VibratoLfoToPitch
= 0;
481 self
->ModEnvToPitch
= 0;
483 self
->FilterCutoff
= 13500;
485 self
->ModLfoToFilterCutoff
= 0;
486 self
->ModEnvToFilterCutoff
= 0;
487 self
->ModLfoToVolume
= 0;
489 self
->ChorusSend
= 0;
490 self
->ReverbSend
= 0;
494 self
->ModLfo
.Delay
= 0;
495 self
->ModLfo
.Frequency
= 0;
497 self
->VibratoLfo
.Delay
= 0;
498 self
->VibratoLfo
.Frequency
= 0;
500 self
->ModEnv
.DelayTime
= -12000;
501 self
->ModEnv
.AttackTime
= -12000;
502 self
->ModEnv
.HoldTime
= -12000;
503 self
->ModEnv
.DecayTime
= -12000;
504 self
->ModEnv
.SustainVol
= 0;
505 self
->ModEnv
.ReleaseTime
= -12000;
506 self
->ModEnv
.KeyToHoldTime
= 0;
507 self
->ModEnv
.KeyToDecayTime
= 0;
509 self
->VolEnv
.DelayTime
= -12000;
510 self
->VolEnv
.AttackTime
= -12000;
511 self
->VolEnv
.HoldTime
= -12000;
512 self
->VolEnv
.DecayTime
= -12000;
513 self
->VolEnv
.SustainVol
= 0;
514 self
->VolEnv
.ReleaseTime
= -12000;
515 self
->VolEnv
.KeyToHoldTime
= 0;
516 self
->VolEnv
.KeyToDecayTime
= 0;
518 self
->Attenuation
= 0;
520 self
->CoarseTuning
= 0;
521 self
->FineTuning
= 0;
523 self
->LoopMode
= AL_NONE
;
525 self
->TuningScale
= 100;
527 self
->ExclusiveClass
= 0;
533 self
->SampleRate
= 0;
535 self
->PitchCorrection
= 0;
536 self
->SampleType
= AL_NONE
;
539 InitUIntMap(&self
->ModulatorMap
, ~0);
544 static void ALfontsound_Destruct(ALfontsound
*self
)
548 FreeThunkEntry(self
->id
);
552 DecrementRef(&self
->Link
->ref
);
555 for(i
= 0;i
< self
->ModulatorMap
.size
;i
++)
557 free(self
->ModulatorMap
.array
[i
].value
);
558 self
->ModulatorMap
.array
[i
].value
= NULL
;
560 ResetUIntMap(&self
->ModulatorMap
);
563 void ALfontsound_setPropi(ALfontsound
*self
, ALCcontext
*context
, ALenum param
, ALint value
)
569 case AL_MOD_LFO_TO_PITCH_SOFT
:
570 self
->ModLfoToPitch
= value
;
573 case AL_VIBRATO_LFO_TO_PITCH_SOFT
:
574 self
->VibratoLfoToPitch
= value
;
577 case AL_MOD_ENV_TO_PITCH_SOFT
:
578 self
->ModEnvToPitch
= value
;
581 case AL_FILTER_CUTOFF_SOFT
:
582 self
->FilterCutoff
= value
;
585 case AL_FILTER_RESONANCE_SOFT
:
587 SET_ERROR_AND_RETURN(context
, AL_INVALID_VALUE
);
588 self
->FilterQ
= value
;
591 case AL_MOD_LFO_TO_FILTER_CUTOFF_SOFT
:
592 self
->ModLfoToFilterCutoff
= value
;
595 case AL_MOD_ENV_TO_FILTER_CUTOFF_SOFT
:
596 self
->ModEnvToFilterCutoff
= value
;
599 case AL_MOD_LFO_TO_VOLUME_SOFT
:
600 self
->ModLfoToVolume
= value
;
603 case AL_CHORUS_SEND_SOFT
:
604 if(!(value
>= 0 && value
<= 1000))
605 SET_ERROR_AND_RETURN(context
, AL_INVALID_VALUE
);
606 self
->ChorusSend
= value
;
608 case AL_REVERB_SEND_SOFT
:
609 if(!(value
>= 0 && value
<= 1000))
610 SET_ERROR_AND_RETURN(context
, AL_INVALID_VALUE
);
611 self
->ReverbSend
= value
;
618 case AL_MOD_LFO_DELAY_SOFT
:
619 self
->ModLfo
.Delay
= value
;
621 case AL_MOD_LFO_FREQUENCY_SOFT
:
622 self
->ModLfo
.Frequency
= value
;
625 case AL_VIBRATO_LFO_DELAY_SOFT
:
626 self
->VibratoLfo
.Delay
= value
;
628 case AL_VIBRATO_LFO_FREQUENCY_SOFT
:
629 self
->VibratoLfo
.Frequency
= value
;
632 case AL_MOD_ENV_DELAYTIME_SOFT
:
633 self
->ModEnv
.DelayTime
= value
;
635 case AL_MOD_ENV_ATTACKTIME_SOFT
:
636 self
->ModEnv
.AttackTime
= value
;
638 case AL_MOD_ENV_HOLDTIME_SOFT
:
639 self
->ModEnv
.HoldTime
= value
;
641 case AL_MOD_ENV_DECAYTIME_SOFT
:
642 self
->ModEnv
.DecayTime
= value
;
644 case AL_MOD_ENV_SUSTAINVOLUME_SOFT
:
645 self
->ModEnv
.SustainVol
= value
;
647 case AL_MOD_ENV_RELEASETIME_SOFT
:
648 self
->ModEnv
.ReleaseTime
= value
;
650 case AL_MOD_ENV_KEY_TO_HOLDTIME_SOFT
:
651 self
->ModEnv
.KeyToHoldTime
= value
;
653 case AL_MOD_ENV_KEY_TO_DECAYTIME_SOFT
:
654 self
->ModEnv
.KeyToDecayTime
= value
;
657 case AL_VOLUME_ENV_DELAYTIME_SOFT
:
658 self
->VolEnv
.DelayTime
= value
;
660 case AL_VOLUME_ENV_ATTACKTIME_SOFT
:
661 self
->VolEnv
.AttackTime
= value
;
663 case AL_VOLUME_ENV_HOLDTIME_SOFT
:
664 self
->VolEnv
.HoldTime
= value
;
666 case AL_VOLUME_ENV_DECAYTIME_SOFT
:
667 self
->VolEnv
.DecayTime
= value
;
669 case AL_VOLUME_ENV_SUSTAINVOLUME_SOFT
:
670 self
->VolEnv
.SustainVol
= value
;
672 case AL_VOLUME_ENV_RELEASETIME_SOFT
:
673 self
->VolEnv
.ReleaseTime
= value
;
675 case AL_VOLUME_ENV_KEY_TO_HOLDTIME_SOFT
:
676 self
->VolEnv
.KeyToHoldTime
= value
;
678 case AL_VOLUME_ENV_KEY_TO_DECAYTIME_SOFT
:
679 self
->VolEnv
.KeyToDecayTime
= value
;
682 case AL_ATTENUATION_SOFT
:
684 SET_ERROR_AND_RETURN(context
, AL_INVALID_VALUE
);
685 self
->Attenuation
= value
;
688 case AL_TUNING_COARSE_SOFT
:
689 self
->CoarseTuning
= value
;
691 case AL_TUNING_FINE_SOFT
:
692 self
->FineTuning
= value
;
695 case AL_LOOP_MODE_SOFT
:
696 if(!(value
== AL_NONE
|| value
== AL_LOOP_CONTINUOUS_SOFT
||
697 value
== AL_LOOP_UNTIL_RELEASE_SOFT
))
698 SET_ERROR_AND_RETURN(context
, AL_INVALID_VALUE
);
699 self
->LoopMode
= value
;
702 case AL_TUNING_SCALE_SOFT
:
703 self
->TuningScale
= value
;
706 case AL_EXCLUSIVE_CLASS_SOFT
:
707 self
->ExclusiveClass
= value
;
710 case AL_SAMPLE_START_SOFT
:
714 case AL_SAMPLE_END_SOFT
:
718 case AL_SAMPLE_LOOP_START_SOFT
:
719 self
->LoopStart
= value
;
722 case AL_SAMPLE_LOOP_END_SOFT
:
723 self
->LoopEnd
= value
;
726 case AL_SAMPLE_RATE_SOFT
:
728 SET_ERROR_AND_RETURN(context
, AL_INVALID_VALUE
);
729 self
->SampleRate
= value
;
732 case AL_BASE_KEY_SOFT
:
733 if(!((value
>= 0 && value
<= 127) || value
== 255))
734 SET_ERROR_AND_RETURN(context
, AL_INVALID_VALUE
);
735 self
->PitchKey
= value
;
738 case AL_KEY_CORRECTION_SOFT
:
739 if(!(value
>= -99 && value
<= 99))
740 SET_ERROR_AND_RETURN(context
, AL_INVALID_VALUE
);
741 self
->PitchCorrection
= value
;
744 case AL_SAMPLE_TYPE_SOFT
:
745 if(!(value
>= 1 && value
<= 4))
746 SET_ERROR_AND_RETURN(context
, AL_INVALID_VALUE
);
747 self
->SampleType
= value
;
750 case AL_FONTSOUND_LINK_SOFT
:
755 link
= LookupFontsound(context
->Device
, value
);
757 SET_ERROR_AND_RETURN(context
, AL_INVALID_VALUE
);
759 if(link
) IncrementRef(&link
->ref
);
760 link
= ExchangePtr((XchgPtr
*)&self
->Link
, link
);
761 if(link
) DecrementRef(&link
->ref
);
765 SET_ERROR_AND_RETURN(context
, AL_INVALID_ENUM
);
770 /* ReleaseALFontsounds
772 * Called to destroy any fontsounds that still exist on the device
774 void ReleaseALFontsounds(ALCdevice
*device
)
777 for(i
= 0;i
< device
->FontsoundMap
.size
;i
++)
779 ALfontsound
*temp
= device
->FontsoundMap
.array
[i
].value
;
780 device
->FontsoundMap
.array
[i
].value
= NULL
;
782 ALfontsound_Destruct(temp
);
784 memset(temp
, 0, sizeof(*temp
));