Fixed function names that somehow got mixed up.
[bcl.git] / 3daudio.c
blob2696563e1a05184ac8ece5ea57b2b8c1a4b70167
1 #include <stdlib.h>
2 #include <string.h>
3 #include <AL/al.h>
4 #include <AL/alc.h>
5 #include <AL/alut.h>
6 #include "bcl.h"
8 typedef struct {
9 char * fileName;
10 ALuint bufId;
11 int count;
12 } clip;
14 ALCdevice *device;
15 ALCcontext *context;
16 clip * clips;
17 ALuint * sources;
18 int clipsSize=20;
19 int sourcesSize=20;
20 int numClips;
21 int numSources;
23 int addClip(clip c) {
24 if (numClips>=clipsSize) {
25 clips = realloc(clips,clipsSize*2*sizeof(clip));
26 clipsSize*=2;
28 clips[numClips] = c;
29 numClips++;
30 return numClips-1;
33 void removeClip(int pos) {
34 free(clips[pos].fileName);
35 for (;pos<numClips;pos++)
36 clips[pos]=clips[pos+1];
37 numClips--;
38 if (numClips>0&&numClips <clipsSize/4) {
39 clips = realloc(clips,clipsSize/4*sizeof(clip));
40 clipsSize/=4;
44 int findClipstr(char * name) {
45 int i = 0;
46 for (;i<numClips;i++)
47 if (strcmp(name,clips[i].fileName)==0)
48 return i;
49 return -1;
52 int findClipi(int id) {
53 int i = 0;
54 for (;i<numClips;i++)
55 if (clips[i].bufId==id)
56 return i;
57 return -1;
60 int addSource(ALuint id) {
61 if (numSources>=sourcesSize) {
62 sources = realloc(sources,sizeof(ALuint)*sourcesSize*2);
63 sourcesSize*=2;
65 sources[numSources]=id;
66 numSources++;
67 return numSources -1;
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);
75 sourcesSize/=4;
79 int findSource(int id) {
80 int i;
81 for (i = 0; i < numSources;i++)
82 if (sources[i]==id)
83 return i;
84 return -1;
87 DECLSPEC void init3dAudio() {
88 int attrlist[3];
89 attrlist[0] = ALC_FREQUENCY;
90 attrlist[1] = 44100;
91 attrlist[2] = 0;
92 device = alcOpenDevice(NULL);
93 context = alcCreateContext(device, attrlist);
94 alcMakeContextCurrent(context);
95 numClips = 0;
96 numSources = 0;
97 clips = malloc(sizeof(clip)*clipsSize);
98 sources = malloc(sizeof(ALuint)*sourcesSize);
101 DECLSPEC void terminate3dAudio() {
102 int i;
103 alDeleteSources(numSources,sources);
104 for (i = 0; i < numClips;i++) {
105 free(clips[i].fileName);
106 alDeleteBuffers(1,&clips[i].bufId);
108 free(clips);
109 free(sources);
110 alcDestroyContext(context);
111 alcCloseDevice(device);
114 DECLSPEC int load3dSound(char * file) {
115 int pos = findClipstr(file);
116 ALuint bufid;
117 if (pos==-1) {
118 ALsizei size;
119 ALsizei bits;
120 ALsizei freq;
121 ALenum format;
122 ALvoid *wave=0;
124 alGenBuffers(1,&bufid);
125 alutLoadWAVFile((ALbyte*)file, &format, &wave, &size, &freq, 0);
126 alBufferData(bufid,format,wave,size,freq);
127 free(wave);
128 clip c= {strdup(file),bufid,0};
129 pos = addClip(c);
131 else
132 bufid = clips[pos].bufId;
133 ALuint soundid;
134 alGenSources(1, &soundid);
135 alSourcei(soundid, AL_BUFFER, bufid);
136 addSource(soundid);
137 clips[pos].count++;
138 return soundid;
141 DECLSPEC void unload3dSound(int sound) {
142 int id,pos;
143 alGetSourcei(sound,AL_BUFFER,&id);
144 pos = findClipi(id);
145 removeSource(sound);
146 alDeleteSources(1, &sound);
147 clips[pos].count--;
148 if (clips[pos].count==0)
149 removeClip(pos);
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);
162 alSourcePlay(sound);
165 DECLSPEC void loop3dSound(int sound) {
166 alSourcei(sound,AL_LOOPING,AL_TRUE);
167 alSourcePlay(sound);
170 DECLSPEC void stop3dSound(int sound) {
171 alSourceStop(sound);