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 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 SDL_mixer. 24 * @author Juan Carlos Seijo P�rez 25 * @file JMixer.h 26 * @date 06/03/2004 27 * @version 0.0.1 - Primera versi�n. 06/03/2004. 28 */ 29 30 #ifndef _JMIXER_INCLUDED 31 #define _JMIXER_INCLUDED 32 33 #include <SDL_mixer.h> 34 #include <JLib/Util/JTypes.h> 35 #include <JLib/Sound/JChunk.h> 36 37 /** Esta clase permite configurar los par�metros del sonido. 38 */ 39 class JMixer 40 { 41 bool valid; 42 43 public: 44 /** Crea el objeto. 45 */ JMixer()46 JMixer() : valid(false) 47 {} 48 49 /** Determina si el objeto est� inicializado o no. 50 * @return <b>true</b> si se puede usar, <b>false</b> si no. 51 */ Valid()52 bool Valid() {return valid;} 53 54 /** Recupera la versi�n de SDL_mixer. El objeto devuelto tiene 55 * tres campos: major, minor y patch, que identifican la versi�n. 56 * @return La versi�n de SDL_mixer. 57 */ GetLinkedVersion()58 const SDL_version * GetLinkedVersion() {return Mix_Linked_Version();} 59 60 /** Establece los par�metros del audio. Este m�todo reserva adem�s 16 canales para la 61 * reproducci�n. Este par�metro se puede cambiar por medio de AllocateChannels(). 62 * @param freq Frecuencia de muestreo (44.100 Hz, 22050 Hz, etc.) [22050]. 63 * @param fmt Formato de la muestra (uno de AUDIO_{U|S}{8|16[LSB|MSB|SYS]}) [AUDIO_S16SYS]. 64 * @param chann N�mero de canales de salida (1 - mono, 2 - stereo) [2]. 65 * @param size Bytes por muestra [1024]. 66 * @return 0 si todo fue bien, -1 en caso de no poderse inicializar SDL y -2 en caso 67 * de no poder abrir el dispositivo. 68 */ 69 s32 Init(s32 freq = MIX_DEFAULT_FREQUENCY, Uint16 fmt = MIX_DEFAULT_FORMAT, s32 chann = 2, s32 size = 1024) 70 { 71 if (!SDL_WasInit(SDL_INIT_AUDIO)) 72 { 73 if (SDL_Init(SDL_INIT_AUDIO) == -1) 74 { 75 return -1; 76 } 77 } 78 79 if (Mix_OpenAudio(freq, fmt, chann, size) == -1) 80 { 81 return -2; 82 } 83 84 valid = true; 85 86 AllocateChannels(16); 87 88 return 0; 89 } 90 91 /** Devuelve la cadena de error de SDL_mixer. 92 * @return Cadena del �ltimo error producido. 93 */ GetError()94 const char * GetError() 95 { 96 return Mix_GetError(); 97 } 98 99 /** Recupera los par�metros del dispositivo de audio. 100 * @param freq Variable donde se guardar� la frecuencia de muestreo. 101 * @param fmt Variable donde se guardar� el formato de la muestra. 102 * @param chann Variable donde se guardar� el n�mero de canales. 103 * @return El n�mero de veces que se ha abierto el dispositivo � 0 (cero) 104 * si se produjo alg�n error. 105 */ QuerySpec(s32 freq,u16 fmt,s32 chann)106 s32 QuerySpec(s32 freq, u16 fmt, s32 chann) 107 { 108 return Mix_QuerySpec(&freq, &fmt, &chann); 109 } 110 111 /** Reserva canales de reproducci�n. 112 * Si el n�mero de canales a reservar es menor que el actual, se paran 113 * los que est�n en exceso. Si fuese negativo se obtiene el n�mero 114 * total de canales reservados, sin que esto afecte a los existentes. 115 * @param numChannels N�mero total de canales a reservar. 116 * @return N�mero de canales reservados en total. 117 */ AllocateChannels(s32 numChannels)118 s32 AllocateChannels(s32 numChannels) 119 { 120 return Mix_AllocateChannels(numChannels); 121 } 122 123 /** Establece el nivel de volumen de un canal. 124 * @param channel Canal a modificar (-1 para todos). 125 * @param volume Nuevo volumen del canal. 126 * @return Valor actual del volumen del canal o un promedio de todos si 127 * channel es -1. 128 */ 129 s32 Volume(s32 channel = -1, s32 volume = MIX_MAX_VOLUME) 130 { 131 return Mix_Volume(channel, volume); 132 } 133 134 /** Pausa el canal especificado. 135 * @param channel N�mero de canal. 136 * @see Resume(), Halt(). 137 */ 138 void Pause(s32 channel = -1) 139 { 140 Mix_Pause(channel); 141 } 142 143 /** Reanuda la reproducci�n del canal especificado. 144 * @param channel N�mero de canal. 145 * @see Pause(), Halt(). 146 */ 147 void Resume(s32 channel = -1) 148 { 149 Mix_Resume(channel); 150 } 151 152 /** Detiene la reproducci�n del canal especificado. 153 * @param channel N�mero de canal. 154 * @see Resume(), Pause(). 155 */ 156 void Halt(s32 channel = -1) 157 { 158 Mix_HaltChannel(channel); 159 } 160 161 /** Detiene el canal con un fundido. 162 * @param ms Milisegundos de fade. 163 * @param channel Canal a detener. 164 * @return N�mero de canales a detener. 165 */ 166 s32 FadeOut(s32 ms, s32 channel = -1) 167 { 168 return Mix_FadeOutChannel(channel, ms); 169 } 170 171 /** Determina si el canal dado est� reproduciendo o en pausa. 172 * @param channel Canal a determinar � -1. 173 * @return 1 si se est� reproduciendo, 0 si no o el n�mero de canales 174 * en reproducci�n o pausa en caso de ser channel = -1. 175 */ 176 s32 Playing(s32 channel = -1) 177 { 178 return Mix_Playing(channel); 179 } 180 181 /** Determina si el canal dado est� en pausa o parado. 182 * @param channel Canal a determinar � -1. 183 * @return 1 si est� en pausa o parado, 0 si no o el n�mero de canales 184 * en pausa o detenidos en caso de ser channel = -1. 185 */ 186 s32 Paused(s32 channel = -1) 187 { 188 return Mix_Paused(channel); 189 } 190 191 /** Determina el estado de fade del canal dado. 192 * @param channel Canal a determinar. 193 * @return MIX_NO_FADING si no hace fade, MIX_FADING_IN si hace fade-in 194 * o MIX_FADING_OUT si hace fade-out. 195 */ Fading(s32 channel)196 s32 Fading(s32 channel) 197 { 198 return Mix_Fading(channel); 199 } 200 201 /** Detiene la reproducci�n del canal especificado en un tiempo dado. 202 * @param ms Milisegundos a esperar antes de detenerlo. 203 * @param channel N�mero de canal. 204 * @see Halt(). 205 */ 206 void HaltTimed(s32 ms, s32 channel = -1) 207 { 208 Mix_ExpireChannel(channel, ms); 209 } 210 211 /** Cierra el dispositvo de audio. 212 */ Destroy()213 void Destroy() 214 { 215 // La especificaci�n no dice que se le puedan pasar ceros a Mix_QuerySpec(). 216 s32 freq, chann; 217 u16 fmt; 218 219 // Debe cerrarse tantas veces como haya sido abierto 220 s32 numTimes = Mix_QuerySpec(&freq, &fmt, &chann); 221 for (int i = 0; i < numTimes; ++i) 222 { 223 Mix_CloseAudio(); 224 } 225 } 226 227 /** Cierra el dispositvo de audio. 228 */ ~JMixer()229 ~JMixer() 230 { 231 Destroy(); 232 } 233 }; 234 235 #endif // _JMIXER_INCLUDED 236