comparison src/xs_sidplay2.cc @ 820:778531e968ed

Clean up tune loading.
author Matti Hamalainen <ccr@tnsp.org>
date Wed, 07 Nov 2012 16:08:40 +0200
parents ab3216b1b582
children dea579b6c3b3
comparison
equal deleted inserted replaced
819:ab3216b1b582 820:778531e968ed
49 49
50 class XSSIDPlay2 { 50 class XSSIDPlay2 {
51 public: 51 public:
52 sidplay2 emu; 52 sidplay2 emu;
53 sid2_config_t config; 53 sid2_config_t config;
54 SidTune *tune; 54 SidTune tune;
55 gboolean tuneLoaded;
56 55
57 XSSIDPlay2(void); 56 XSSIDPlay2(void);
58 virtual ~XSSIDPlay2(void); 57 virtual ~XSSIDPlay2(void);
59 }; 58 };
60 59
75 # include <sidplay/builders/hardsid.h> 74 # include <sidplay/builders/hardsid.h>
76 # endif 75 # endif
77 #endif 76 #endif
78 77
79 78
80 XSSIDPlay2::XSSIDPlay2(void) 79 XSSIDPlay2::XSSIDPlay2(void) : tune(0)
81 { 80 {
82 tune = NULL;
83 tuneLoaded = FALSE;
84 } 81 }
85 82
86 83
87 XSSIDPlay2::~XSSIDPlay2(void) 84 XSSIDPlay2::~XSSIDPlay2(void)
88 { 85 {
89 if (tuneLoaded) 86 emu.load(NULL);
90 emu.load(0);
91
92 if (tune)
93 delete tune;
94
95 tuneLoaded = FALSE;
96 } 87 }
97 88
98 89
99 /* We need to 'export' all this pseudo-C++ crap */ 90 /* We need to 'export' all this pseudo-C++ crap */
100 extern "C" { 91 extern "C" {
419 XSSIDPlay2 *engine = (XSSIDPlay2 *) state->internal; 410 XSSIDPlay2 *engine = (XSSIDPlay2 *) state->internal;
420 411
421 if (!engine) 412 if (!engine)
422 return FALSE; 413 return FALSE;
423 414
424 if (!engine->tune->selectSong(state->currSong)) 415 if (!engine->tune.selectSong(state->currSong))
425 { 416 {
426 xs_error("[SIDPlay2] tune->selectSong() failed\n"); 417 xs_error("[SIDPlay2] tune.selectSong() failed\n");
418 return FALSE;
419 }
420
421 if (engine->emu.load(&(engine->tune)) < 0)
422 {
423 xs_error("[SIDPlay2] emu.load() failed\n");
427 return FALSE; 424 return FALSE;
428 } 425 }
429 426
430 if (engine->emu.config(engine->config) < 0) 427 if (engine->emu.config(engine->config) < 0)
431 { 428 {
432 xs_error("[SIDPlay2] Emulator engine configuration failed!\n"); 429 xs_error("[SIDPlay2] Emulator engine configuration failed!\n");
433 return FALSE;
434 }
435
436 engine->tuneLoaded = TRUE;
437 if (engine->emu.load(engine->tune) < 0)
438 {
439 xs_error("[SIDPlay2] emu.load() failed\n");
440 return FALSE; 430 return FALSE;
441 } 431 }
442 432
443 return TRUE; 433 return TRUE;
444 } 434 }
472 */ 462 */
473 gboolean xs_sidplay2_load(XSEngineState * state, gchar * filename) 463 gboolean xs_sidplay2_load(XSEngineState * state, gchar * filename)
474 { 464 {
475 XSSIDPlay2 *engine = (XSSIDPlay2 *) state->internal; 465 XSSIDPlay2 *engine = (XSSIDPlay2 *) state->internal;
476 466
477 if (!engine) 467 if (!engine || !filename)
478 return FALSE; 468 return FALSE;
479 469
480 if (!(engine->tune = new SidTune(filename))) 470 engine->tune.load(filename);
481 return FALSE; 471 if (!engine->tune)
482 472 {
483 engine->tuneLoaded = FALSE; 473 xs_error("Could not load file '%s': %s\n",
484 474 filename, (engine->tune.getInfo()).statusString);
475 return FALSE;
476 }
477
485 return TRUE; 478 return TRUE;
486 } 479 }
487 480
488 481
489 /* Delete INTERNAL information 482 /* Delete INTERNAL information
490 */ 483 */
491 void xs_sidplay2_delete(XSEngineState * state) 484 void xs_sidplay2_delete(XSEngineState * state)
492 { 485 {
493 XSSIDPlay2 *engine = (XSSIDPlay2 *) state->internal; 486 XSSIDPlay2 *engine = (XSSIDPlay2 *) state->internal;
494
495 if (engine)
496 {
497 if (engine->tuneLoaded)
498 {
499 engine->emu.load(0);
500 }
501
502 delete engine->tune;
503 engine->tune = NULL;
504 engine->tuneLoaded = FALSE;
505 }
506 } 487 }
507 488
508 489
509 /* Hardware backend flushing 490 /* Hardware backend flushing
510 */ 491 */