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