1 /*-------------------------------------------------------------------------------
2 
3 	BARONY
4 	File: sound.hpp
5 	Desc: Defines sound related stuff.
6 
7 	Copyright 2013-2016 (c) Turning Wheel LLC, all rights reserved.
8 	See LICENSE for details.
9 
10 -------------------------------------------------------------------------------*/
11 
12 #pragma once
13 
14 
15 #include <stdio.h>
16 #ifdef USE_FMOD
17 #include "fmod.h"
18 #endif
19 #ifdef USE_OPENAL
20 #ifdef APPLE
21 #include <OpenAL/al.h>
22 #include <OpenAL/alc.h>
23 #else
24 #include <AL/al.h>
25 #include <AL/alc.h>
26 #endif
27 #endif
28 
29 
30 //Pointer to the FMOD system.
31 #ifdef USE_FMOD
32 
33 #define SOUND
34 #define MUSIC
35 
36 extern FMOD_SYSTEM* fmod_system;
37 
38 extern FMOD_RESULT fmod_result;
39 
40 extern int fmod_maxchannels;
41 extern int fmod_flags;
42 extern void* fmod_extdriverdata;
43 extern bool levelmusicplaying;
44 
45 extern bool shopmusicplaying;
46 extern bool combatmusicplaying;
47 extern bool minotaurmusicplaying;
48 extern bool herxmusicplaying;
49 extern bool devilmusicplaying;
50 extern bool olddarkmap;
51 
52 extern FMOD_SOUND** sounds;
53 extern Uint32 numsounds;
54 extern FMOD_SOUND** minesmusic;
55 #define NUMMINESMUSIC 5
56 extern FMOD_SOUND** swampmusic;
57 #define NUMSWAMPMUSIC 4
58 extern FMOD_SOUND** labyrinthmusic;
59 #define NUMLABYRINTHMUSIC 3
60 extern FMOD_SOUND** ruinsmusic;
61 #define NUMRUINSMUSIC 3
62 extern FMOD_SOUND** underworldmusic;
63 #define NUMUNDERWORLDMUSIC 3
64 extern FMOD_SOUND** hellmusic;
65 #define NUMHELLMUSIC 3
66 extern FMOD_SOUND** intromusic, *intermissionmusic, *minetownmusic, *splashmusic, *librarymusic, *shopmusic, *storymusic;
67 extern FMOD_SOUND** minotaurmusic, *herxmusic, *templemusic;
68 extern FMOD_SOUND* endgamemusic, *escapemusic, *devilmusic, *sanctummusic, *tutorialmusic;
69 extern FMOD_SOUND* introductionmusic;
70 #define NUMMINOTAURMUSIC 2
71 extern FMOD_SOUND** cavesmusic;
72 extern FMOD_SOUND** citadelmusic;
73 extern FMOD_SOUND* gnomishminesmusic;
74 extern FMOD_SOUND* greatcastlemusic;
75 extern FMOD_SOUND* sokobanmusic;
76 extern FMOD_SOUND* caveslairmusic;
77 extern FMOD_SOUND* bramscastlemusic;
78 extern FMOD_SOUND* hamletmusic;
79 #define NUMCAVESMUSIC 3
80 #define NUMCITADELMUSIC 3
81 #define NUMINTROMUSIC 3
82 //TODO: Automatically scan the music folder for a mines subdirectory and use all the music for the mines or something like that. I'd prefer something neat like for that loading music for a level, anyway. And I can just reuse the code I had for ORR.
83 
84 extern FMOD_CHANNEL* music_channel, *music_channel2, *music_resume; //TODO: List of music, play first one, fade out all the others? Eh, maybe some other day. //music_resume is the music to resume after, say, combat or shops. //TODO: Clear music_resume every biome change. Or otherwise validate it for that level set.
85 
86 extern FMOD_CHANNELGROUP* sound_group, *music_group;
87 extern FMOD_CHANNELGROUP* soundAmbient_group, *soundEnvironment_group;
88 
89 /*
90  * Checks for FMOD errors. Store return value of all FMOD functions in fmod_result so that this funtion can access it and check for errors.
91  * Returns true on error (and prints an error message), false if everything went fine.
92  */
93 bool FMODErrorCheck();
94 
95 //Updates FMOD and whatnot.
96 void sound_update();
97 
98 FMOD_CHANNEL* playSoundPlayer(int player, Uint32 snd, int vol);
99 FMOD_CHANNEL* playSoundPos(real_t x, real_t y, Uint32 snd, int vol);
100 FMOD_CHANNEL* playSoundPosLocal(real_t x, real_t y, Uint32 snd, int vol);
101 FMOD_CHANNEL* playSoundEntity(Entity* entity, Uint32 snd, int vol);
102 FMOD_CHANNEL* playSoundEntityLocal(Entity* entity, Uint32 snd, int vol);
103 FMOD_CHANNEL* playSound(Uint32 snd, int vol);
104 FMOD_CHANNEL* playSoundVelocity(); //TODO: Write.
105 
106 void playmusic(FMOD_SOUND* sound, bool loop, bool crossfade, bool resume); //Automatically crossfades. NOTE: Resets fadein and fadeout increments to the defualts every time it is called. You'll have to change the fadein and fadeout increments AFTER calling this function.
107 
108 void handleLevelMusic(); //Manages and updates the level music.
109 
110 extern float fadein_increment, fadeout_increment, default_fadein_increment, default_fadeout_increment;
111 extern bool sfxUseDynamicAmbientVolume, sfxUseDynamicEnvironmentVolume;
112 
113 #elif defined USE_OPENAL
114 
115 #define SOUND
116 #define MUSIC
117 
118 extern ALCcontext *openal_context;
119 extern ALCdevice  *openal_device;
120 
121 extern int openal_maxchannels;
122 
123 extern bool levelmusicplaying;
124 
125 extern bool shopmusicplaying;
126 extern bool combatmusicplaying;
127 extern bool minotaurmusicplaying;
128 extern bool herxmusicplaying;
129 extern bool devilmusicplaying;
130 extern bool olddarkmap;
131 extern bool sfxUseDynamicAmbientVolume, sfxUseDynamicEnvironmentVolume;
132 
133 struct OPENAL_CHANNELGROUP;
134 
135 struct OPENAL_BUFFER;
136 struct OPENAL_SOUND;
137 
138 struct FMOD_VECTOR {
139 	float x,y,z;
140 };
141 
142 extern OPENAL_BUFFER** sounds;
143 extern Uint32 numsounds;
144 extern OPENAL_BUFFER** minesmusic;
145 #define NUMMINESMUSIC 4
146 extern OPENAL_BUFFER** swampmusic;
147 #define NUMSWAMPMUSIC 3
148 extern OPENAL_BUFFER** labyrinthmusic;
149 #define NUMLABYRINTHMUSIC 3
150 extern OPENAL_BUFFER** ruinsmusic;
151 #define NUMRUINSMUSIC 3
152 extern OPENAL_BUFFER** underworldmusic;
153 #define NUMUNDERWORLDMUSIC 3
154 extern OPENAL_BUFFER** hellmusic;
155 #define NUMHELLMUSIC 3
156 extern OPENAL_BUFFER** intromusic, *intermissionmusic, *minetownmusic, *splashmusic, *librarymusic, *shopmusic, *storymusic;
157 extern OPENAL_BUFFER** minotaurmusic, *herxmusic, *templemusic;
158 extern OPENAL_BUFFER* endgamemusic, *escapemusic, *devilmusic, *sanctummusic, *tutorialmusic;
159 extern OPENAL_BUFFER* introductionmusic;
160 #define NUMMINOTAURMUSIC 2
161 extern OPENAL_BUFFER** cavesmusic;
162 extern OPENAL_BUFFER** citadelmusic;
163 extern OPENAL_BUFFER* gnomishminesmusic;
164 extern OPENAL_BUFFER* greatcastlemusic;
165 extern OPENAL_BUFFER* sokobanmusic;
166 extern OPENAL_BUFFER* caveslairmusic;
167 extern OPENAL_BUFFER* bramscastlemusic;
168 extern OPENAL_BUFFER* hamletmusic;
169 #define NUMCAVESMUSIC 3
170 #define NUMCITADELMUSIC 3
171 #define NUMINTROMUSIC 3
172 //TODO: Automatically scan the music folder for a mines subdirectory and use all the music for the mines or something like that. I'd prefer something neat like for that loading music for a level, anyway. And I can just reuse the code I had for ORR.
173 
174 extern OPENAL_SOUND* music_channel, *music_channel2, *music_resume; //TODO: List of music, play first one, fade out all the others? Eh, maybe some other day. //music_resume is the music to resume after, say, combat or shops. //TODO: Clear music_resume every biome change. Or otherwise validate it for that level set.
175 extern OPENAL_CHANNELGROUP *sound_group, *music_group;
176 extern OPENAL_CHANNELGROUP *soundAmbient_group, *soundEnvironment_group;
177 
178 int initOPENAL();
179 int closeOPENAL();
180 
181 //Updates OpenAL and whatnot (dummy function)
182 void sound_update();
183 
184 OPENAL_SOUND* playSoundPlayer(int player, Uint32 snd, int vol);
185 OPENAL_SOUND* playSoundPos(real_t x, real_t y, Uint32 snd, int vol);
186 OPENAL_SOUND* playSoundPosLocal(real_t x, real_t y, Uint32 snd, int vol);
187 OPENAL_SOUND* playSoundEntity(Entity* entity, Uint32 snd, int vol);
188 OPENAL_SOUND* playSoundEntityLocal(Entity* entity, Uint32 snd, int vol);
189 OPENAL_SOUND* playSound(Uint32 snd, int vol);
190 OPENAL_SOUND* playSoundVelocity(); //TODO: Write.
191 
192 void playmusic(OPENAL_BUFFER* sound, bool loop, bool crossfade, bool resume); //Automatically crossfades. NOTE: Resets fadein and fadeout increments to the defualts every time it is called. You'll have to change the fadein and fadeout increments AFTER calling this function.
193 
194 void handleLevelMusic(); //Manages and updates the level music.
195 
196 int OPENAL_CreateSound(const char* name, bool b3D, OPENAL_BUFFER **buffer);
197 int OPENAL_CreateStreamSound(const char* name, OPENAL_BUFFER **buffer);
198 
199 void OPENAL_ChannelGroup_Stop(OPENAL_CHANNELGROUP* group);
200 void OPENAL_ChannelGroup_SetVolume(OPENAL_CHANNELGROUP* group, float f);
201 void OPENAL_Channel_SetChannelGroup(OPENAL_SOUND *channel, OPENAL_CHANNELGROUP *group);
202 void OPENAL_Channel_SetVolume(OPENAL_SOUND *channel, float f);
203 void OPENAL_Channel_Stop(void* channel);
204 void OPENAL_Channel_Pause(OPENAL_SOUND* channel);
205 void OPENAL_Channel_IsPlaying(void* channel, ALboolean *playing);
206 OPENAL_SOUND* OPENAL_CreateChannel(OPENAL_BUFFER* buffer);
207 void OPENAL_Channel_Set3DAttributes(OPENAL_SOUND* channel, float x, float y, float z);
208 void OPENAL_Channel_Play(OPENAL_SOUND* channel);
209 void OPENAL_GetBuffer(OPENAL_SOUND* channel, OPENAL_BUFFER** buffer);
210 void OPENAL_SetLoop(OPENAL_SOUND* channel, ALboolean looping);
211 void OPENAL_Channel_GetPosition(OPENAL_SOUND* channel, unsigned int *position);
212 void OPENAL_Sound_GetLength(OPENAL_BUFFER* buffer, unsigned int *length);
213 void OPENAL_Sound_Release(OPENAL_BUFFER* buffer);
214 
215 extern float fadein_increment, fadeout_increment, default_fadein_increment, default_fadeout_increment;
216 #else
217 void* playSound(Uint32, int);
218 void* playSoundPos(real_t x, real_t y, Uint32, int);
219 void* playSoundPosLocal(real_t, real_t, Uint32, int);
220 void* playSoundEntity(Entity*, Uint32, int);
221 void* playSoundEntityLocal(Entity*, Uint32, int);
222 void* playSoundPlayer(int, Uint32, int);
223 #endif
224