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