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
);
19 AL_API
void AL_APIENTRY
alGenFontsoundsSOFT(ALsizei n
, ALuint
*ids
)
26 context
= GetContextRef();
30 SET_ERROR_AND_GOTO(context
, AL_INVALID_VALUE
, done
);
32 device
= context
->Device
;
33 for(cur
= 0;cur
< n
;cur
++)
35 ALfontsound
*inst
= calloc(1, sizeof(ALfontsound
));
38 alDeleteFontsoundsSOFT(cur
, ids
);
39 SET_ERROR_AND_GOTO(context
, AL_OUT_OF_MEMORY
, done
);
41 ALfontsound_Construct(inst
);
43 err
= NewThunkEntry(&inst
->id
);
44 if(err
== AL_NO_ERROR
)
45 err
= InsertUIntMapEntry(&device
->FontsoundMap
, inst
->id
, inst
);
46 if(err
!= AL_NO_ERROR
)
48 ALfontsound_Destruct(inst
);
49 memset(inst
, 0, sizeof(*inst
));
52 alDeleteFontsoundsSOFT(cur
, ids
);
53 SET_ERROR_AND_GOTO(context
, err
, done
);
60 ALCcontext_DecRef(context
);
63 AL_API ALvoid AL_APIENTRY
alDeleteFontsoundsSOFT(ALsizei n
, const ALuint
*ids
)
70 context
= GetContextRef();
74 SET_ERROR_AND_GOTO(context
, AL_INVALID_VALUE
, done
);
76 device
= context
->Device
;
79 /* Check for valid ID */
80 if((inst
=LookupFontsound(device
, ids
[i
])) == NULL
)
81 SET_ERROR_AND_GOTO(context
, AL_INVALID_NAME
, done
);
83 SET_ERROR_AND_GOTO(context
, AL_INVALID_OPERATION
, done
);
88 if((inst
=RemoveFontsound(device
, ids
[i
])) == NULL
)
91 ALfontsound_Destruct(inst
);
93 memset(inst
, 0, sizeof(*inst
));
98 ALCcontext_DecRef(context
);
101 AL_API ALboolean AL_APIENTRY
alIsFontsoundSOFT(ALuint id
)
106 context
= GetContextRef();
107 if(!context
) return AL_FALSE
;
109 ret
= LookupFontsound(context
->Device
, id
) ? AL_TRUE
: AL_FALSE
;
111 ALCcontext_DecRef(context
);
116 AL_API
void AL_APIENTRY
alFontsoundiSOFT(ALuint id
, ALenum param
, ALint
UNUSED(value
))
122 context
= GetContextRef();
125 device
= context
->Device
;
126 if(!(sound
=LookupFontsound(device
, id
)))
127 SET_ERROR_AND_GOTO(context
, AL_INVALID_NAME
, done
);
129 SET_ERROR_AND_GOTO(context
, AL_INVALID_OPERATION
, done
);
133 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
137 ALCcontext_DecRef(context
);
140 AL_API
void AL_APIENTRY
alFontsound2iSOFT(ALuint id
, ALenum param
, ALint value1
, ALint value2
)
146 context
= GetContextRef();
149 device
= context
->Device
;
150 if(!(sound
=LookupFontsound(device
, id
)))
151 SET_ERROR_AND_GOTO(context
, AL_INVALID_NAME
, done
);
153 SET_ERROR_AND_GOTO(context
, AL_INVALID_OPERATION
, done
);
156 case AL_KEY_RANGE_SOFT
:
157 if(!(value1
>= 0 && value1
<= 127 && value2
>= 0 && value2
<= 127))
158 SET_ERROR_AND_GOTO(context
, AL_INVALID_VALUE
, done
);
159 sound
->MinKey
= value1
;
160 sound
->MaxKey
= value2
;
163 case AL_VELOCITY_RANGE_SOFT
:
164 if(!(value1
>= 0 && value1
<= 127 && value2
>= 0 && value2
<= 127))
165 SET_ERROR_AND_GOTO(context
, AL_INVALID_VALUE
, done
);
166 sound
->MinVelocity
= value1
;
167 sound
->MaxVelocity
= value2
;
171 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
175 ALCcontext_DecRef(context
);
178 AL_API
void AL_APIENTRY
alFontsoundivSOFT(ALuint id
, ALenum param
, const ALint
*values
)
186 case AL_KEY_RANGE_SOFT
:
187 case AL_VELOCITY_RANGE_SOFT
:
188 alFontsound2iSOFT(id
, param
, values
[0], values
[1]);
192 context
= GetContextRef();
195 device
= context
->Device
;
196 if(!(sound
=LookupFontsound(device
, id
)))
197 SET_ERROR_AND_GOTO(context
, AL_INVALID_NAME
, done
);
199 SET_ERROR_AND_GOTO(context
, AL_INVALID_OPERATION
, done
);
203 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
207 ALCcontext_DecRef(context
);
210 AL_API
void AL_APIENTRY
alGetFontsoundivSOFT(ALuint id
, ALenum param
, ALint
*values
)
214 const ALfontsound
*sound
;
216 context
= GetContextRef();
219 device
= context
->Device
;
220 if(!(sound
=LookupFontsound(device
, id
)))
221 SET_ERROR_AND_GOTO(context
, AL_INVALID_NAME
, done
);
224 case AL_KEY_RANGE_SOFT
:
225 values
[0] = sound
->MinKey
;
226 values
[1] = sound
->MaxKey
;
229 case AL_VELOCITY_RANGE_SOFT
:
230 values
[0] = sound
->MinVelocity
;
231 values
[1] = sound
->MaxVelocity
;
235 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
239 ALCcontext_DecRef(context
);
243 /* ReleaseALFontsounds
245 * Called to destroy any fontsounds that still exist on the device
247 void ReleaseALFontsounds(ALCdevice
*device
)
250 for(i
= 0;i
< device
->FontsoundMap
.size
;i
++)
252 ALfontsound
*temp
= device
->FontsoundMap
.array
[i
].value
;
253 device
->FontsoundMap
.array
[i
].value
= NULL
;
255 ALfontsound_Destruct(temp
);
257 memset(temp
, 0, sizeof(*temp
));