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