24 if (numClips
>=clipsSize
) {
25 clips
= realloc(clips
,clipsSize
*2*sizeof(clip
));
33 void removeClip(int pos
) {
34 free(clips
[pos
].fileName
);
35 for (;pos
<numClips
;pos
++)
36 clips
[pos
]=clips
[pos
+1];
38 if (numClips
>0&&numClips
<clipsSize
/4) {
39 clips
= realloc(clips
,clipsSize
/4*sizeof(clip
));
44 int findClipstr(char * name
) {
47 if (strcmp(name
,clips
[i
].fileName
)==0)
52 int findClipi(int id
) {
55 if (clips
[i
].bufId
==id
)
60 int addSource(ALuint id
) {
61 if (numSources
>=sourcesSize
) {
62 sources
= realloc(sources
,sizeof(ALuint
)*sourcesSize
*2);
65 sources
[numSources
]=id
;
70 void removeSource(int pos
) {
71 for (;pos
<numSources
;pos
++)
72 sources
[pos
]=sources
[pos
+1];
73 if (numSources
>0&&numSources
<sourcesSize
/4) {
74 sources
= realloc(sources
,sizeof(ALuint
)*sourcesSize
/4);
79 int findSource(int id
) {
81 for (i
= 0; i
< numSources
;i
++)
87 DECLSPEC
void init3dAudio() {
89 attrlist
[0] = ALC_FREQUENCY
;
92 device
= alcOpenDevice(NULL
);
93 context
= alcCreateContext(device
, attrlist
);
94 alcMakeContextCurrent(context
);
97 clips
= malloc(sizeof(clip
)*clipsSize
);
98 sources
= malloc(sizeof(ALuint
)*sourcesSize
);
101 DECLSPEC
void terminate3dAudio() {
103 alDeleteSources(numSources
,sources
);
104 for (i
= 0; i
< numClips
;i
++) {
105 free(clips
[i
].fileName
);
106 alDeleteBuffers(1,&clips
[i
].bufId
);
110 alcDestroyContext(context
);
111 alcCloseDevice(device
);
114 DECLSPEC
int load3dSound(char * file
) {
115 int pos
= findClipstr(file
);
124 alGenBuffers(1,&bufid
);
125 alutLoadWAVFile((ALbyte
*)file
, &format
, &wave
, &size
, &freq
, 0);
126 alBufferData(bufid
,format
,wave
,size
,freq
);
128 clip c
= {strdup(file
),bufid
,0};
132 bufid
= clips
[pos
].bufId
;
134 alGenSources(1, &soundid
);
135 alSourcei(soundid
, AL_BUFFER
, bufid
);
141 DECLSPEC
void unload3dSound(int sound
) {
143 alGetSourcei(sound
,AL_BUFFER
,&id
);
146 alDeleteSources(1, &sound
);
148 if (clips
[pos
].count
==0)
152 DECLSPEC
void set3dSoundPosition(int sound
, float x
, float y
, float z
) {
153 alSource3f(sound
,AL_POSITION
,x
,y
,z
);
156 DECLSPEC
void set3dSoundPitch(int sound
, float pitch
) {
157 alSourcef(sound
,AL_PITCH
,pitch
);
160 DECLSPEC
void play3dSound(int sound
) {
161 alSourcei(sound
,AL_LOOPING
,AL_FALSE
);
165 DECLSPEC
void loop3dSound(int sound
) {
166 alSourcei(sound
,AL_LOOPING
,AL_TRUE
);
170 DECLSPEC
void stop3dSound(int sound
) {