3 // SuperTux - A Jump'n Run
4 // Copyright (C) 2000 Bill Kendrick <bill@newbreedsoftware.com>
5 // Copyright (C) 2004 Duong-Khang NGUYEN <neoneurone@users.sf.net>
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License
9 // as published by the Free Software Foundation; either version 2
10 // of the License, or (at your option) any later version.
12 // This program is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27 bool use_sound; /* handle sound on/off menu and command-line option */
28 bool use_music; /* handle music on/off menu and command-line option */
29 bool audio_device; /* != 0: available and initialized */
32 char * soundfilenames[NUM_SOUNDS] = {
34 "/sounds/bigjump.wav",
37 "/sounds/herring.wav",
42 "/sounds/ricochet.wav",
43 "/sounds/bump-upgrade.wav",
44 "/sounds/upgrade.wav",
45 "/sounds/excellent.wav",
54 #include <SDL_mixer.h>
56 Mix_Chunk * sounds[NUM_SOUNDS];
57 Mix_Music * level_song, * level_song_fast, * herring_song;
59 /* --- OPEN THE AUDIO DEVICE --- */
61 int open_audio (int frequency, Uint16 format, int channels, int chunksize)
63 /* if success we reserved some channels and register panning effects */
64 if (Mix_OpenAudio( frequency, format, channels, chunksize ) == 0)
66 if (Mix_ReserveChannels( SOUND_RESERVED_CHANNELS )
67 != SOUND_RESERVED_CHANNELS )
69 DEBUG_MSG( "Warning: open_audio could'nt reserve channels" );
72 /* prepare the spanning effects, no error checking */
73 Mix_SetPanning( SOUND_LEFT_SPEAKER, 230, 24 );
74 Mix_SetPanning( SOUND_RIGHT_SPEAKER, 24, 230 );
84 /* --- CLOSE THE AUDIO DEVICE --- */
86 void close_audio( void )
89 Mix_UnregisterAllEffects( SOUND_LEFT_SPEAKER );
90 Mix_UnregisterAllEffects( SOUND_RIGHT_SPEAKER );
96 /* --- LOAD A SOUND --- */
98 Mix_Chunk * load_sound(const std::string& file)
102 snd = Mix_LoadWAV(file.c_str());
104 /* printf message and abort if there is an initialized audio device */
105 if ((snd == NULL) && audio_device)
106 st_abort("Can't load", file);
112 /* --- LOAD A SONG --- */
114 Mix_Music * load_song(const std::string& file)
118 sng = Mix_LoadMUS(file.c_str());
120 /* printf message and abort if there is an initialized audio device */
121 if ((sng == NULL) && audio_device)
122 st_abort("Can't load", file);
127 /* --- PLAY A SOUND ON LEFT OR RIGHT OR CENTER SPEAKER --- */
129 void play_sound(Mix_Chunk * snd, enum Sound_Speaker whichSpeaker)
131 /* this won't call the function if the user has disabled sound
132 * either via menu or via command-line option
134 if (use_sound && audio_device)
136 Mix_PlayChannel( whichSpeaker, snd, 0);
138 /* prepare for panning effects for next call */
139 /* warning: currently, I do not check for errors here */
140 switch (whichSpeaker) {
141 case SOUND_LEFT_SPEAKER:
142 Mix_SetPanning( SOUND_LEFT_SPEAKER, 230, 24 );
144 case SOUND_RIGHT_SPEAKER:
145 Mix_SetPanning( SOUND_RIGHT_SPEAKER, 24, 230 );
147 default: // keep the compiler happy
154 void free_chunk(Mix_Chunk *chunk)
158 DEBUG_MSG( __PRETTY_FUNCTION__ );
159 Mix_FreeChunk( chunk );
165 int playing_music(void)
169 return Mix_PlayingMusic();
173 /* we are in --disable-music we can't be playing music */
181 if (use_music && audio_device)
183 return Mix_HaltMusic();
192 int play_music(Mix_Music *music, int loops)
194 if (use_music && audio_device)
196 DEBUG_MSG(__PRETTY_FUNCTION__);
197 return Mix_PlayMusic(music, loops);
201 /* return error since you're trying to play music in --disable-sound mode */
207 void free_music(Mix_Music *music)
211 DEBUG_MSG(__PRETTY_FUNCTION__);
212 Mix_FreeMusic( music );
216 int get_current_music()
218 return current_music;
221 void set_current_music(int music)
223 current_music = music;
226 void play_current_music()
231 switch(current_music)
234 play_music(level_song, -1); // -1 to play forever
237 play_music(herring_song, -1);
240 play_music(level_song_fast, -1);
242 case NO_MUSIC: // keep the compiler happy for the moment :-)
246 /* use halt_music whenever you want to stop it */