12 #include "midi/base.h"
15 extern inline struct ALsfpreset
*LookupPreset(ALCdevice
*device
, ALuint id
);
16 extern inline struct ALsfpreset
*RemovePreset(ALCdevice
*device
, ALuint id
);
19 AL_API
void AL_APIENTRY
alGenPresetsSOFT(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 ALsfpreset
*preset
= calloc(1, sizeof(ALsfpreset
));
38 alDeletePresetsSOFT(cur
, ids
);
39 SET_ERROR_AND_GOTO(context
, AL_OUT_OF_MEMORY
, done
);
41 ALsfpreset_Construct(preset
);
43 err
= NewThunkEntry(&preset
->id
);
44 if(err
== AL_NO_ERROR
)
45 err
= InsertUIntMapEntry(&device
->PresetMap
, preset
->id
, preset
);
46 if(err
!= AL_NO_ERROR
)
48 ALsfpreset_Destruct(preset
);
49 memset(preset
, 0, sizeof(*preset
));
52 alDeletePresetsSOFT(cur
, ids
);
53 SET_ERROR_AND_GOTO(context
, err
, done
);
56 ids
[cur
] = preset
->id
;
60 ALCcontext_DecRef(context
);
63 AL_API ALvoid AL_APIENTRY
alDeletePresetsSOFT(ALsizei n
, const ALuint
*ids
)
70 context
= GetContextRef();
74 SET_ERROR_AND_GOTO(context
, AL_INVALID_VALUE
, done
);
76 device
= context
->Device
;
82 /* Check for valid ID */
83 if((preset
=LookupPreset(device
, ids
[i
])) == NULL
)
84 SET_ERROR_AND_GOTO(context
, AL_INVALID_NAME
, done
);
86 SET_ERROR_AND_GOTO(context
, AL_INVALID_OPERATION
, done
);
91 if((preset
=RemovePreset(device
, ids
[i
])) == NULL
)
94 ALsfpreset_Destruct(preset
);
96 memset(preset
, 0, sizeof(*preset
));
101 ALCcontext_DecRef(context
);
104 AL_API ALboolean AL_APIENTRY
alIsPresetSOFT(ALuint id
)
109 context
= GetContextRef();
110 if(!context
) return AL_FALSE
;
112 ret
= ((!id
|| LookupPreset(context
->Device
, id
)) ?
115 ALCcontext_DecRef(context
);
120 AL_API
void AL_APIENTRY
alPresetiSOFT(ALuint id
, ALenum param
, ALint value
)
126 context
= GetContextRef();
129 device
= context
->Device
;
130 if((preset
=LookupPreset(device
, id
)) == NULL
)
131 SET_ERROR_AND_GOTO(context
, AL_INVALID_NAME
, done
);
133 SET_ERROR_AND_GOTO(context
, AL_INVALID_OPERATION
, done
);
136 case AL_MIDI_PRESET_SOFT
:
137 if(!(value
>= 0 && value
<= 127))
138 SET_ERROR_AND_GOTO(context
, AL_INVALID_VALUE
, done
);
139 preset
->Preset
= value
;
142 case AL_MIDI_BANK_SOFT
:
143 if(!(value
>= 0 && value
<= 128))
144 SET_ERROR_AND_GOTO(context
, AL_INVALID_VALUE
, done
);
145 preset
->Bank
= value
;
149 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
153 ALCcontext_DecRef(context
);
156 AL_API
void AL_APIENTRY
alPresetivSOFT(ALuint id
, ALenum param
, const ALint
*values
)
164 case AL_MIDI_PRESET_SOFT
:
165 case AL_MIDI_BANK_SOFT
:
166 alPresetiSOFT(id
, param
, values
[0]);
170 context
= GetContextRef();
173 device
= context
->Device
;
174 if((preset
=LookupPreset(device
, id
)) == NULL
)
175 SET_ERROR_AND_GOTO(context
, AL_INVALID_NAME
, done
);
177 SET_ERROR_AND_GOTO(context
, AL_INVALID_OPERATION
, done
);
181 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
185 ALCcontext_DecRef(context
);
188 AL_API
void AL_APIENTRY
alGetPresetivSOFT(ALuint id
, ALenum param
, ALint
*values
)
194 context
= GetContextRef();
197 device
= context
->Device
;
198 if((preset
=LookupPreset(device
, id
)) == NULL
)
199 SET_ERROR_AND_GOTO(context
, AL_INVALID_NAME
, done
);
201 SET_ERROR_AND_GOTO(context
, AL_INVALID_OPERATION
, done
);
204 case AL_MIDI_PRESET_SOFT
:
205 values
[0] = preset
->Preset
;
208 case AL_MIDI_BANK_SOFT
:
209 values
[0] = preset
->Bank
;
213 SET_ERROR_AND_GOTO(context
, AL_INVALID_ENUM
, done
);
217 ALCcontext_DecRef(context
);
223 * Called to destroy any presets that still exist on the device
225 void ReleaseALPresets(ALCdevice
*device
)
228 for(i
= 0;i
< device
->PresetMap
.size
;i
++)
230 ALsfpreset
*temp
= device
->PresetMap
.array
[i
].value
;
231 device
->PresetMap
.array
[i
].value
= NULL
;
233 ALsfpreset_Destruct(temp
);
235 memset(temp
, 0, sizeof(*temp
));