comparison src/xs_sidplay2.cpp @ 847:5b93bd8c7814

Cleanups, adjust backend configuration sequences, more error checking, improved debug output.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 08 Nov 2012 22:44:36 +0200
parents ae1f6418d093
children 2663b1ac9ce6
comparison
equal deleted inserted replaced
846:7b11ba6fc4cc 847:5b93bd8c7814
111 sid_filter_t tmpFilter; 111 sid_filter_t tmpFilter;
112 xs_sid_filter_t *f; 112 xs_sid_filter_t *f;
113 gint i; 113 gint i;
114 assert(state); 114 assert(state);
115 115
116 XSDEBUG("SIDPlay2 backend initializing.\n");
117
116 /* Allocate internal structures */ 118 /* Allocate internal structures */
117 engine = new XSSIDPlay2(); 119 engine = new XSSIDPlay2();
118 state->internal = engine; 120 state->internal = engine;
119 if (!engine) 121 if (!engine)
120 return FALSE; 122 return FALSE;
121 123
122 /* Get current configuration */ 124 /* Get current configuration */
125 XSDEBUG("SIDPlay2 emulation configuration\n");
123 engine->config = engine->emu.config(); 126 engine->config = engine->emu.config();
124 127
125 /* Configure channels and stuff */ 128 /* Configure channels and stuff */
126 switch (state->audioChannels) 129 switch (state->audioChannels)
127 { 130 {
222 for (i = 0; i < f->npoints; i++) 225 for (i = 0; i < f->npoints; i++)
223 { 226 {
224 tmpFilter.cutoff[i][0] = f->points[i].x; 227 tmpFilter.cutoff[i][0] = f->points[i].x;
225 tmpFilter.cutoff[i][1] = f->points[i].y; 228 tmpFilter.cutoff[i][1] = f->points[i].y;
226 } 229 }
230
231 /* Clockspeed settings */
232 switch (xs_cfg.clockSpeed)
233 {
234 case XS_CLOCK_NTSC:
235 engine->config.clockDefault = SID2_CLOCK_NTSC;
236 break;
237
238 default:
239 case XS_CLOCK_PAL:
240 engine->config.clockDefault = SID2_CLOCK_PAL;
241 xs_cfg.clockSpeed = XS_CLOCK_PAL;
242 break;
243 }
244
245
246 /* Configure rest of the emulation */
247 if (xs_cfg.forceSpeed)
248 {
249 engine->config.clockForced = true;
250 engine->config.clockSpeed = engine->config.clockDefault;
251 }
252 else
253 {
254 engine->config.clockForced = false;
255 engine->config.clockSpeed = SID2_CLOCK_CORRECT;
256 }
257
258
259 if (xs_cfg.sid2OptLevel < 0 || xs_cfg.sid2OptLevel > SID2_MAX_OPTIMISATION)
260 {
261 xs_error("Invalid sid2OptLevel=%d, falling back to %d.\n",
262 xs_cfg.sid2OptLevel, SID2_DEFAULT_OPTIMISATION);
263
264 xs_cfg.sid2OptLevel = SID2_DEFAULT_OPTIMISATION;
265 }
266 engine->config.optimisation = xs_cfg.sid2OptLevel;
267
268 engine->config.sidDefault = xs_cfg.mos8580 ? SID2_MOS8580 : SID2_MOS6581;
269 engine->config.sidModel = xs_cfg.forceModel ? engine->config.sidDefault : SID2_MODEL_CORRECT;
270 engine->config.sidSamples = TRUE;
271
227 272
228 /* Initialize builder object */ 273 /* Initialize builder object */
229 XSDEBUG("init builder #%i, maxsids=%i\n", xs_cfg.sid2Builder, (engine->emu.info()).maxsids); 274 XSDEBUG("init builder #%i, maxsids=%i\n", xs_cfg.sid2Builder, (engine->emu.info()).maxsids);
230 275
231 switch (xs_cfg.sid2Builder) 276 switch (xs_cfg.sid2Builder)
263 break; 308 break;
264 #endif 309 #endif
265 310
266 default: 311 default:
267 xs_error("[SIDPlay2] Invalid or unsupported builder selected.\n"); 312 xs_error("[SIDPlay2] Invalid or unsupported builder selected.\n");
268 break; 313 return FALSE;
269 } 314 }
270 315
271 if (!engine->config.sidEmulation) 316 if (!engine->config.sidEmulation)
272 { 317 {
273 xs_error("[SIDPlay2] Could not initialize SIDBuilder object.\n"); 318 xs_error("[SIDPlay2] Could not initialize SIDBuilder object.\n");
284 } 329 }
285 #endif 330 #endif
286 331
287 XSDEBUG("%s\n", engine->config.sidEmulation->credits()); 332 XSDEBUG("%s\n", engine->config.sidEmulation->credits());
288 333
289 /* Clockspeed settings */
290 switch (xs_cfg.clockSpeed)
291 {
292 case XS_CLOCK_NTSC:
293 engine->config.clockDefault = SID2_CLOCK_NTSC;
294 break;
295
296 default:
297 case XS_CLOCK_PAL:
298 engine->config.clockDefault = SID2_CLOCK_PAL;
299 xs_cfg.clockSpeed = XS_CLOCK_PAL;
300 break;
301 }
302
303
304 /* Configure rest of the emulation */
305 if (xs_cfg.forceSpeed)
306 {
307 engine->config.clockForced = true;
308 engine->config.clockSpeed = engine->config.clockDefault;
309 }
310 else
311 {
312 engine->config.clockForced = false;
313 engine->config.clockSpeed = SID2_CLOCK_CORRECT;
314 }
315
316
317 if (xs_cfg.sid2OptLevel < 0 || xs_cfg.sid2OptLevel > SID2_MAX_OPTIMISATION)
318 {
319 xs_error("Invalid sid2OptLevel=%d, falling back to %d.\n",
320 xs_cfg.sid2OptLevel, SID2_DEFAULT_OPTIMISATION);
321
322 xs_cfg.sid2OptLevel = SID2_DEFAULT_OPTIMISATION;
323 }
324 engine->config.optimisation = xs_cfg.sid2OptLevel;
325
326 engine->config.sidDefault = xs_cfg.mos8580 ? SID2_MOS8580 : SID2_MOS6581;
327 engine->config.sidModel = xs_cfg.forceModel ? engine->config.sidDefault : SID2_MODEL_CORRECT;
328 engine->config.sidSamples = TRUE;
329 334
330 return TRUE; 335 return TRUE;
331 } 336 }
332 337
333 338
334 /* Close SIDPlay2 engine 339 /* Close SIDPlay2 engine
335 */ 340 */
336 void xs_sidplay2_close(XSEngineState * state) 341 void xs_sidplay2_close(XSEngineState * state)
337 { 342 {
338 XSSIDPlay2 *engine = (XSSIDPlay2 *) state->internal; 343 XSSIDPlay2 *engine = (XSSIDPlay2 *) state->internal;
344
345 XSDEBUG("SIDPlay2 backend shutdown.\n");
339 346
340 xs_sidplay2_delete(state); 347 xs_sidplay2_delete(state);
341 348
342 if (engine) 349 if (engine)
343 { 350 {
437 #endif 444 #endif
438 } 445 }
439 446
440 447
441 } /* extern "C" */ 448 } /* extern "C" */
442 #endif /* HAVE_SIDPLAY2 */ 449 #endif /* HAVE_SIDPLAY2
450 */