1 /* 2 * JLib - Jacob's Library. 3 * Copyright (C) 2003, 2004 Juan Carlos Seijo P�rez 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Library General Public 7 * License as published by the Free Software Foundation; either 8 * version 2 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Library General Public License for more details. 14 * 15 * You should have received a copy of the GNU Library General Public 16 * License along with this library; if not, write to the Free Software 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 * 19 * Juan Carlos Seijo P�rez 20 * jacob@mainreactor.net 21 */ 22 23 /** Wrapper C++ para una muestra de audio de SDL_mixer. 24 * @file JChunk.h 25 * @author Juan Carlos Seijo P�rez 26 * @date 25/03/2004 27 * @version 0.0.1 - 25/03/2004 - Primera versi�n. 28 */ 29 30 #ifndef _JCHUNK_INCLUDED 31 #define _JCHUNK_INCLUDED 32 33 #include <SDL_mixer.h> 34 35 /** Encapsula una muestra de audio. 36 */ 37 class JChunk 38 { 39 s32 last_channel; /**< �ltimo canal en el que se reprodujo. */ 40 Mix_Chunk *chunk; /**< Muestra asociada. */ 41 42 public: 43 /** Crea una muestra vac�a. 44 */ JChunk()45 JChunk() : chunk(0) 46 {} 47 48 /** Libera los recursos asociados a esta muestra. 49 */ Destroy()50 void Destroy() 51 { 52 if (chunk != 0) 53 { 54 // Stop() no se debe liberar en reproducci�n! 55 Mix_FreeChunk(chunk); 56 chunk = 0; 57 } 58 } 59 60 /** Libera los recursos asociados a esta muestra. 61 */ ~JChunk()62 ~JChunk() 63 { 64 Destroy(); 65 } 66 67 /** Carga una muestra de audio desde fichero. El archivo puede ser de 68 * tipo WAVE, AIFF, RIFF, OGG o VOC. 69 * @param filename Nombre del fichero de audio a abrir. 70 * @return <b>true</b> si todo fue bien, <b>false</b> en caso contrario. 71 */ LoadWave(const char * filename)72 bool LoadWave(const char *filename) 73 { 74 Destroy(); 75 chunk = Mix_LoadWAV(filename); 76 77 return chunk != 0; 78 } 79 80 /** Establece el volumen de esta muestra. El volumen tiene un valor comprendido 81 * entre 0 y MIX_MAX_VOLUME (128 actualmente). Si el valor es negativo el volumen 82 * no cambia, si es mayor que el m�ximo, se establece al m�ximo. 83 * @param newVolume Nuevo valor para el volumen. 84 * @return Valor del volumen antiguo. 85 */ Volume(s32 newVolume)86 s32 Volume(s32 newVolume) 87 { 88 return Mix_VolumeChunk(chunk, newVolume); 89 } 90 91 /** Reproduce esta muestra. 92 * @param channel Canal en el que reproducir (o -1 para cualquiera libre). 93 * @param loops N�mero de veces a reproducir. -1 hace que se repita 94 * todo el tiempo. 95 * @return Canal donde se reproducir� la muestra � -1 en caso de 96 * error. El error se podr�a deber a falta de canales libres. 97 */ 98 s32 Play(s32 channel = -1, s32 loops = 0) 99 { 100 return (last_channel = Mix_PlayChannel(channel, chunk, loops)); 101 } 102 103 /** Reproduce esta muestra con l�mite de tiempo. 104 * @param msMax N�mero m�ximo de milisegundos a reproducir de la muestra. 105 * @param channel Canal en el que reproducir (o -1 para cualquiera libre). 106 * @param loops N�mero de veces a reproducir. -1 hace que se repita 107 * todo el tiempo. 108 * @return Canal donde se reproducir� la muestra � -1 en caso de 109 * error. El error se podr�a deber a falta de canales libres. 110 */ 111 s32 PlayTimed(s32 msMax, s32 channel = -1, s32 loops = 0) 112 { 113 return (last_channel = Mix_PlayChannelTimed(channel, chunk, loops, msMax)); 114 } 115 116 /** Reproduce esta muestra con un fundido. 117 * @param msFade Milisegundos de duraci�n del efecto fade-in. 118 * @param channel Canal en el que reproducir (o -1 para cualquiera libre). 119 * @param loops N�mero de veces a reproducir. -1 hace que se repita 120 * todo el tiempo. 121 * @return Canal donde se reproducir� la muestra � -1 en caso de 122 * error. El error se podr�a deber a falta de canales libres. 123 */ 124 s32 FadeIn(s32 msFade, s32 channel = -1, s32 loops = 0) 125 { 126 return (last_channel = Mix_FadeInChannel(channel, chunk, loops, msFade)); 127 } 128 129 /** Reproduce esta muestra con l�mite tiempo y un fundido. 130 * @param msFade Milisegundos de duraci�n del efecto fade-in. 131 * @param msMax N�mero m�ximo de milisegundos a reproducir de la muestra. 132 * @param channel Canal en el que reproducir (o -1 para cualquiera libre). 133 * @param loops N�mero de veces a reproducir. -1 hace que se repita 134 * todo el tiempo. 135 * @return Canal donde se reproducir� la muestra � -1 en caso de 136 * error. El error se podr�a deber a falta de canales libres. 137 */ 138 s32 FadeInTimed(s32 msFade, s32 msMax, s32 channel = -1, s32 loops = 0) 139 { 140 return (last_channel = Mix_FadeInChannelTimed(channel, chunk, loops, msFade, msMax)); 141 } 142 143 144 /** Pausa la reproducci�n. 145 * @see Resume(), Halt(). 146 */ Pause()147 void Pause() 148 { 149 if (Mix_GetChunk(last_channel) == chunk) 150 { 151 Mix_Pause(last_channel); 152 } 153 } 154 155 /** Reanuda la reproducci�n. 156 * @see Pause(), Halt(). 157 */ Resume()158 void Resume() 159 { 160 if (Mix_GetChunk(last_channel) == chunk) 161 { 162 Mix_Resume(last_channel); 163 } 164 } 165 166 /** Detiene la reproducci�n. 167 * @see Resume(), Pause(). 168 */ Halt()169 void Halt() 170 { 171 if (Mix_GetChunk(last_channel) == chunk) 172 { 173 Mix_HaltChannel(last_channel); 174 } 175 } 176 177 /** Detiene la reproducci�n con un fundido. 178 * @param ms Milisegundos de fade. 179 */ FadeOut(s32 ms)180 void FadeOut(s32 ms) 181 { 182 if (Mix_GetChunk(last_channel) == chunk) 183 { 184 Mix_FadeOutChannel(last_channel, ms); 185 } 186 } 187 188 /** Determina si est� reproduciendo o en pausa. 189 * @return <b>true</b> si se est� reproduciendo, <b>false</b> si no. 190 */ IsPlaying()191 bool IsPlaying() 192 { 193 if (Mix_GetChunk(last_channel) == chunk) 194 { 195 return 1 == Mix_Playing(last_channel); 196 } 197 198 return false; 199 } 200 201 /** Determina si est� en pausa o parado. 202 * @return <b>true</b> si se est� en pausa o parado, <b>false</b> si no. 203 */ IsPaused()204 s32 IsPaused() 205 { 206 if (Mix_GetChunk(last_channel) == chunk) 207 { 208 return Mix_Paused(last_channel); 209 } 210 211 return false; 212 } 213 214 /** Determina el estado de fade. 215 * @return MIX_NO_FADING si no hace fade o no est� reproduciendo, 216 * MIX_FADING_IN si hace fade-in o MIX_FADING_OUT si hace fade-out. 217 */ Fading()218 s32 Fading() 219 { 220 if (Mix_GetChunk(last_channel) == chunk) 221 { 222 return Mix_Fading(last_channel); 223 } 224 225 return MIX_NO_FADING; 226 } 227 228 /** Devuelve el canal en el que se reproduce la muestra. 229 * @return Canal en el que reproduce el sonido o -1 si no se est� reproduciendo. 230 */ GetChannel()231 s32 GetChannel() 232 { 233 if (Mix_GetChunk(last_channel) == chunk) 234 { 235 return last_channel; 236 } 237 238 return -1; 239 } 240 241 /** Devuelve si el objeto es v�lido o no. 242 * @return <b>true</b> si lo es, <b>false</b> si no. 243 */ Valid()244 bool Valid() {return chunk != 0;} 245 246 operator Mix_Chunk * () {return chunk;} 247 }; 248 249 #endif // _JCHUNK_INCLUDED 250