Mercurial > hg > dmlib
comparison dmsimple.c @ 93:15fdd5573344
Add simple (and buggy / not really working) debug mode.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 02 Oct 2012 18:13:05 +0300 |
parents | f47011b06d5c |
children | 4bbfc0274b29 |
comparison
equal
deleted
inserted
replaced
92:e5796ffce131 | 93:15fdd5573344 |
---|---|
58 } | 58 } |
59 | 59 |
60 | 60 |
61 int engineGetTick() | 61 int engineGetTick() |
62 { | 62 { |
63 return (frame.startTime - engine.startTime) + engine.debugTime * 1000; | 63 return (frame.startTime - engine.startTime) + engine.adjustTime; |
64 } | 64 } |
65 | 65 |
66 | 66 |
67 float engineGetTimeDT() | 67 float engineGetTimeDT() |
68 { | 68 { |
163 return NULL; | 163 return NULL; |
164 } | 164 } |
165 } | 165 } |
166 | 166 |
167 | 167 |
168 #ifdef DM_DEBUG | |
169 static void engineAudioCallbackStream(void *userdata, Uint8 *stream, int len) | |
170 { | |
171 if (engine.paused) | |
172 { | |
173 memset(stream, 0, len); | |
174 } | |
175 else | |
176 { | |
177 JSSMixer *d = (JSSMixer *) userdata; | |
178 if (d != NULL) | |
179 { | |
180 int pos = ((engine.adjustTime * d->outFreq) / 1000) * jvmGetSampleSize(d) + | |
181 engine.audioSamples; | |
182 | |
183 memcpy(stream, engine.audioBuf + pos, len); | |
184 | |
185 engine.audioSamples += len; | |
186 } | |
187 } | |
188 } | |
189 | |
190 void engineAdjustTime(int adj) | |
191 { | |
192 if (engine.optDebug) | |
193 { | |
194 int tmp = engine.adjustTime + adj; | |
195 if (tmp < 0) | |
196 tmp = 0; | |
197 else | |
198 if (tmp >= engine.demoDuration * 1000) | |
199 tmp = engine.demoDuration * 1000; | |
200 | |
201 engine.pauseFlag = TRUE; | |
202 engine.adjustTime = tmp; | |
203 dmPrint(0, "adj=%d, adjtime=%d\n", adj, engine.adjustTime); | |
204 } | |
205 } | |
206 #endif | |
207 | |
208 | |
168 static void engineAudioCallback(void *userdata, Uint8 *stream, int len) | 209 static void engineAudioCallback(void *userdata, Uint8 *stream, int len) |
169 { | 210 { |
170 JSSMixer *d = (JSSMixer *) userdata; | 211 if (engine.paused) |
171 | 212 { |
172 if (d != NULL) | 213 memset(stream, 0, len); |
173 { | 214 } |
174 jvmRenderAudio(d, stream, len / jvmGetSampleSize(d)); | 215 else |
216 { | |
217 JSSMixer *d = (JSSMixer *) userdata; | |
218 if (d != NULL) | |
219 jvmRenderAudio(d, stream, len / jvmGetSampleSize(d)); | |
175 } | 220 } |
176 } | 221 } |
177 | 222 |
178 | 223 |
179 int main(int argc, char *argv[]) | 224 int main(int argc, char *argv[]) |
231 | 276 |
232 // Initialize SDL audio | 277 // Initialize SDL audio |
233 dmPrint(1, "Trying to init SDL audio with: %d, %d, %d\n", | 278 dmPrint(1, "Trying to init SDL audio with: %d, %d, %d\n", |
234 afmt.format, afmt.channels, afmt.freq); | 279 afmt.format, afmt.channels, afmt.freq); |
235 | 280 |
236 afmt.callback = engineAudioCallback; | 281 #ifdef DM_DEBUG |
237 afmt.userdata = (void *) engine.dev; | 282 if (engine.optDebug) |
283 { | |
284 afmt.callback = engineAudioCallbackStream; | |
285 afmt.userdata = (void *) engine.dev; | |
286 } | |
287 else | |
288 #endif | |
289 { | |
290 afmt.callback = engineAudioCallback; | |
291 afmt.userdata = (void *) engine.dev; | |
292 } | |
238 | 293 |
239 if (SDL_OpenAudio(&afmt, NULL) < 0) | 294 if (SDL_OpenAudio(&afmt, NULL) < 0) |
240 { | 295 { |
241 dmError("Couldn't open audio: %s\n", SDL_GetError()); | 296 dmError("Couldn't open audio: %s\n", SDL_GetError()); |
242 goto error_exit; | 297 goto error_exit; |
266 } | 321 } |
267 | 322 |
268 // Final initializations | 323 // Final initializations |
269 if ((err = demoGlobalInit()) != DMERR_OK) | 324 if ((err = demoGlobalInit()) != DMERR_OK) |
270 goto error_exit; | 325 goto error_exit; |
326 | |
327 #ifdef DM_DEBUG | |
328 if (engine.optDebug) | |
329 { | |
330 Uint8 *ptr; | |
331 int left = engine.dev->outFreq * engine.demoDuration; | |
332 engine.audioBufSize = jvmGetSampleSize(engine.dev) * engine.dev->outFreq * engine.demoDuration; | |
333 if ((engine.audioBuf = dmMalloc(engine.audioBufSize)) == NULL) | |
334 { | |
335 dmError("Could not allocate audio stream buffer of %d bytes.\n", | |
336 engine.audioBufSize); | |
337 goto error_exit; | |
338 } | |
339 | |
340 ptr = engine.audioBuf; | |
341 while (left > 0) | |
342 { | |
343 int length = left; | |
344 if (length > 16*1024) | |
345 length = 16*1024; | |
346 | |
347 jvmRenderAudio(engine.dev, ptr, length); | |
348 ptr += jvmGetSampleSize(engine.dev) * length; | |
349 left -= length; | |
350 } | |
351 } | |
352 #endif | |
271 | 353 |
272 SDL_PauseAudio(0); | 354 SDL_PauseAudio(0); |
273 engine.startTime = SDL_GetTicks(); | 355 engine.startTime = SDL_GetTicks(); |
274 | 356 |
275 while (!engine.exitFlag) | 357 while (!engine.exitFlag) |
286 | 368 |
287 case SDLK_SPACE: | 369 case SDLK_SPACE: |
288 engine.pauseFlag = !engine.pauseFlag; | 370 engine.pauseFlag = !engine.pauseFlag; |
289 break; | 371 break; |
290 | 372 |
373 #ifdef DM_DEBUG | |
374 case SDLK_LEFT: engineAdjustTime(-500); break; | |
375 case SDLK_RIGHT: engineAdjustTime( 500); break; | |
376 case SDLK_UP: engineAdjustTime( 1000); break; | |
377 case SDLK_DOWN: engineAdjustTime(-1000); break; | |
378 #endif | |
379 | |
291 default: | 380 default: |
292 break; | 381 break; |
293 } | 382 } |
294 | 383 |
295 break; | 384 break; |
302 break; | 391 break; |
303 } | 392 } |
304 | 393 |
305 // Draw frame | 394 // Draw frame |
306 frame.startTime = SDL_GetTicks(); | 395 frame.startTime = SDL_GetTicks(); |
396 if (engine.pauseFlag != engine.paused) | |
397 { | |
398 engine.paused = engine.pauseFlag; | |
399 engine.pauseTime = engineGetTick(); | |
400 } | |
401 | |
402 if (engine.paused) | |
403 { | |
404 engine.startTime = frame.startTime - engine.pauseTime; | |
405 } | |
307 | 406 |
308 if (SDL_MUSTLOCK(engine.screen) != 0 && SDL_LockSurface(engine.screen) != 0) | 407 if (SDL_MUSTLOCK(engine.screen) != 0 && SDL_LockSurface(engine.screen) != 0) |
309 { | 408 { |
310 dmError("Can't lock surface.\n"); | 409 dmError("Can't lock surface.\n"); |
311 goto error_exit; | 410 goto error_exit; |