09020177b7bab8d78d1d27b36d33f7207d4f3302
5 * Copyright (C) 2003, 2007, 2008, 2009 Thomas Perl <thp@thpinfo.com>
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., 51 Franklin Street, Fifth Floor, Boston,
35 static const char* samples
[] = {
48 #ifdef HAVE_VOICE_FILES
60 "advantage-player-one.ogg",
61 "advantage-player-two.ogg",
80 "in-the-first-set.ogg",
81 "in-the-second-set.ogg",
82 "in-the-third-set.ogg",
83 "in-the-fourth-set.ogg",
84 "in-the-fifth-set.ogg",
105 static sound_id voice_queue
[VOICE_QUEUE_MAX
];
106 static int voice_queue_size
= 0;
107 static int voice_queue_position
= 0;
109 int voice_finished_flag
= 1;
110 static int available_channels
= 0;
116 TennixArchive
* tnxar
;
118 if( Mix_OpenAudio( 44100, AUDIO_S16SYS
, 2, 1024) < 0) {
119 fprintf( stderr
, "Error initializing SDL_mixer: %s\n", Mix_GetError());
122 sounds
= (Sound
*)calloc(SOUND_MAX
, sizeof(Sound
));
124 draw_button(40, (HEIGHT
-40)/2, WIDTH
-80, 40, 100, 100, 100, 1);
128 /* +1 because of zero-based indexing AND +1 for voice channel */
129 available_channels
= Mix_AllocateChannels(LAST_SOUNDEFFECT_ID
+1+1);
131 if (available_channels
< LAST_SOUNDEFFECT_ID
+1+1) {
132 fprintf(stderr
, "Warning: Got only %d audio channels (requested %d).\n",
134 LAST_SOUNDEFFECT_ID
+1+1);
137 tnxar
= new TennixArchive(ARCHIVE_FILE
);
140 /* not found in cwd - try installed... */
141 tnxar
= tnxar_open(ARCHIVE_FILE_INSTALLED
);
142 assert(tnxar
!= NULL
);
146 for( i
=0; i
<SOUND_MAX
; i
++) {
147 if (tnxar
->setItemFilename(samples
[i
]) != 0) {
148 d
= tnxar
->getItemBytes();
149 data
= Mix_LoadWAV_RW(SDL_RWFromMem(d
, tnxar
->getItemSize()), 0);
152 fprintf(stderr
, "Cannot find %s\n", samples
[i
]);
156 fprintf( stderr
, "Error: %s\n", SDL_GetError());
160 sounds
[i
].data
= data
;
162 draw_button(40, (HEIGHT
-40)/2, (WIDTH
-80)*(GR_COUNT
+i
)/(SOUND_MAX
+GR_COUNT
), 40, 100, 250, 100, 0);
163 rectangle(40+BUTTON_BORDER
, (HEIGHT
-40)/2+20, (WIDTH
-80)*(GR_COUNT
+i
)/(SOUND_MAX
+GR_COUNT
)-2*BUTTON_BORDER
, 10, 170, 250, 170);
173 /* for Voice Queue processing */
174 Mix_ChannelFinished(voice_channel_finished
);
177 void play_sample_n(sound_id id
, int n
)
179 if (id
>= SOUND_MAX
) {
180 fprintf(stderr
, "Cannot play sound #%d.\n", id
);
185 Mix_FadeInChannel(CHANNEL_BY_ID(id
, available_channels
), sounds
[id
].data
, -1, FADE_IN_MS
);
187 Mix_PlayChannel(CHANNEL_BY_ID(id
, available_channels
), sounds
[id
].data
, n
);
190 /* Audience stops clapping when ball is served */
191 if (id
>= SOUND_RACKET_FIRST
&& id
<= SOUND_RACKET_LAST
) {
192 stop_sample(SOUND_APPLAUSE
);
196 void stop_sample(sound_id id
)
198 Mix_FadeOutChannel(CHANNEL_BY_ID(id
, available_channels
), FADE_OUT_MS
);
201 void sample_volume(sound_id id
, float volume
)
203 Mix_Volume(CHANNEL_BY_ID(id
, available_channels
), volume
*MIX_MAX_VOLUME
);
206 void sample_volume_group(sound_id first
, sound_id last
, float volume
)
210 for (i
=first
; i
<=last
; i
++) {
211 sample_volume(i
, volume
);
214 void pan_sample(sound_id id
, float position
)
216 if (position
== 0.5) {
217 Mix_SetPanning(CHANNEL_BY_ID(id
, available_channels
), 255, 255);
220 Mix_SetPanning(CHANNEL_BY_ID(id
, available_channels
), 255*(1.0-position
), 255*(position
));
224 void pan_sample_group(sound_id first
, sound_id last
, float position
)
228 for (i
=first
; i
<=last
; i
++) {
229 pan_sample(i
, position
);
234 voice_queue_size
= 0;
235 Mix_HaltChannel(CHANNEL_VOICE
);
238 void voice_enqueue(sound_id id
)
240 if (voice_queue_size
< VOICE_QUEUE_MAX
) {
241 voice_queue
[voice_queue_size
++] = id
;
243 fprintf(stderr
, "Voice queue overflow. Skipping: %d\n", id
);
249 if (voice_queue_size
> 0) {
250 voice_queue_position
= 0;
251 voice_finished_flag
= 0;
252 Mix_PlayChannel(CHANNEL_VOICE
, sounds
[voice_queue
[voice_queue_position
]].data
, 0);
253 voice_queue_position
++;
257 void voice_say_list(int n
, ...)
266 for (i
=0; i
<n
; i
++) {
267 id
= (sound_id
)va_arg(ap
, int);
274 void voice_channel_finished(int channel
)
276 if (channel
== CHANNEL_VOICE
) {
277 if (voice_queue_position
< voice_queue_size
) {
278 Mix_PlayChannel(CHANNEL_VOICE
, sounds
[voice_queue
[voice_queue_position
]].data
, 0);
279 voice_queue_position
++;
281 voice_finished_flag
= 1;
282 voice_queue_position
= 0;