comparison src/xs_sidplay2.cc @ 833:c0e892fa914a

Begin moving libSIDPlay2-FP stuff to a separete module by removing the relevant parts from the libSIDPlay2 backend interface.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 08 Nov 2012 20:45:28 +0200
parents b158abe91a75
children
comparison
equal deleted inserted replaced
832:b158abe91a75 833:c0e892fa914a
1 /* 1 /*
2 XMMS-SID - SIDPlay input plugin for X MultiMedia System (XMMS) 2 XMMS-SID - SIDPlay input plugin for X MultiMedia System (XMMS)
3 3
4 libSIDPlay v2 and libSIDPlay v2-FP support 4 libSIDPlay v2 support
5 5
6 Programmed and designed by Matti 'ccr' Hamalainen <ccr@tnsp.org> 6 Programmed and designed by Matti 'ccr' Hamalainen <ccr@tnsp.org>
7 (C) Copyright 1999-2012 Tecnic Software productions (TNSP) 7 (C) Copyright 1999-2012 Tecnic Software productions (TNSP)
8 8
9 This program is free software; you can redistribute it and/or modify 9 This program is free software; you can redistribute it and/or modify
26 26
27 #include "xs_sidplay2.h" 27 #include "xs_sidplay2.h"
28 #include "xs_slsup.h" 28 #include "xs_slsup.h"
29 #include "xs_config.h" 29 #include "xs_config.h"
30 30
31 31 #include <sidplay/sidplay2.h>
32 #ifdef HAVE_SIDPLAY2_FP 32 #if G_BYTE_ORDER == G_BIG_ENDIAN
33 # include <sidplayfp/sidplay2.h> 33 # define SID2_NATIVE_UNSIGNED SID2_BIG_UNSIGNED
34 # include <sidplayfp/SidTuneMod.h> 34 # define SID2_NATIVE_SIGNED SID2_BIG_SIGNED
35 # include <sidplayfp/event.h> 35 #elif G_BYTE_ORDER == G_LITTLE_ENDIAN
36 # define SID2_NATIVE_UNSIGNED SID2_LITTLE_UNSIGNED
37 # define SID2_NATIVE_SIGNED SID2_LITTLE_SIGNED
36 #else 38 #else
37 # include <sidplay/sidplay2.h> 39 # error Unsupported endianess!
38 # if G_BYTE_ORDER == G_BIG_ENDIAN
39 # define SID2_NATIVE_UNSIGNED SID2_BIG_UNSIGNED
40 # define SID2_NATIVE_SIGNED SID2_BIG_SIGNED
41 # elif G_BYTE_ORDER == G_LITTLE_ENDIAN
42 # define SID2_NATIVE_UNSIGNED SID2_LITTLE_UNSIGNED
43 # define SID2_NATIVE_SIGNED SID2_LITTLE_SIGNED
44 # else
45 # error Unsupported endianess!
46 # endif
47 #endif 40 #endif
48 41
49 42
50 class XSSIDPlay2 { 43 class XSSIDPlay2 {
51 public: 44 public:
57 virtual ~XSSIDPlay2(void); 50 virtual ~XSSIDPlay2(void);
58 }; 51 };
59 52
60 53
61 #ifdef HAVE_RESID_BUILDER 54 #ifdef HAVE_RESID_BUILDER
62 # ifdef HAVE_SIDPLAY2_FP 55 # include <sidplay/builders/resid.h>
63 # include <sidplayfp/builders/residfp.h>
64 # include <sidplayfp/builders/resid.h>
65 # else
66 # include <sidplay/builders/resid.h>
67 # endif
68 #endif 56 #endif
69 57
70 #ifdef HAVE_HARDSID_BUILDER 58 #ifdef HAVE_HARDSID_BUILDER
71 # ifdef HAVE_SIDPLAY2_FP 59 # include <sidplay/builders/hardsid.h>
72 # include <sidplayfp/builders/hardsid.h>
73 # else
74 # include <sidplay/builders/hardsid.h>
75 # endif
76 #endif 60 #endif
77 61
78 62
79 XSSIDPlay2::XSSIDPlay2(void) : tune(0) 63 XSSIDPlay2::XSSIDPlay2(void) : tune(0)
80 { 64 {
122 /* Initialize SIDPlay2 106 /* Initialize SIDPlay2
123 */ 107 */
124 gboolean xs_sidplay2_init(XSEngineState * state) 108 gboolean xs_sidplay2_init(XSEngineState * state)
125 { 109 {
126 XSSIDPlay2 *engine; 110 XSSIDPlay2 *engine;
127 #ifndef HAVE_SIDPLAY2_FP
128 sid_filter_t tmpFilter; 111 sid_filter_t tmpFilter;
129 xs_sid_filter_t *f; 112 xs_sid_filter_t *f;
130 gint i; 113 gint i;
131 #endif
132 assert(state); 114 assert(state);
133 115
134 /* Allocate internal structures */ 116 /* Allocate internal structures */
135 engine = new XSSIDPlay2(); 117 engine = new XSSIDPlay2();
136 state->internal = engine; 118 state->internal = engine;
181 break; 163 break;
182 } 164 }
183 165
184 166
185 /* Audio parameters sanity checking and setup */ 167 /* Audio parameters sanity checking and setup */
186 #ifdef HAVE_SIDPLAY2_FP
187 state->audioBitsPerSample = XS_RES_16BIT;
188 engine->config.samplingMethod = SID2_RESAMPLE_INTERPOLATE;
189 #else
190 engine->config.precision = state->audioBitsPerSample; 168 engine->config.precision = state->audioBitsPerSample;
191 #endif
192
193 engine->config.frequency = state->audioFrequency; 169 engine->config.frequency = state->audioFrequency;
194 170
195 171
196 switch (state->audioBitsPerSample) 172 switch (state->audioBitsPerSample)
197 { 173 {
198 #ifndef HAVE_SIDPLAY2_FP
199 case XS_RES_8BIT: 174 case XS_RES_8BIT:
200 state->audioFormat = FMT_U8; 175 state->audioFormat = FMT_U8;
201 engine->config.sampleFormat = SID2_LITTLE_UNSIGNED; 176 engine->config.sampleFormat = SID2_LITTLE_UNSIGNED;
202 break; 177 break;
203 #endif
204 178
205 case XS_RES_16BIT: 179 case XS_RES_16BIT:
206 default: 180 default:
207 #ifdef HAVE_SIDPLAY2_FP
208 state->audioFormat = FMT_S16_NE;
209 #else
210 switch (state->audioFormat) 181 switch (state->audioFormat)
211 { 182 {
212 case FMT_U16_LE: 183 case FMT_U16_LE:
213 engine->config.sampleFormat = SID2_LITTLE_UNSIGNED; 184 engine->config.sampleFormat = SID2_LITTLE_UNSIGNED;
214 break; 185 break;
232 default: 203 default:
233 state->audioFormat = FMT_S16_NE; 204 state->audioFormat = FMT_S16_NE;
234 engine->config.sampleFormat = SID2_NATIVE_SIGNED; 205 engine->config.sampleFormat = SID2_NATIVE_SIGNED;
235 break; 206 break;
236 } 207 }
237 #endif 208 break;
238 break; 209 }
239 } 210
240
241 #if !defined(HAVE_SIDPLAY2_FP)
242 /* Convert filter */ 211 /* Convert filter */
243 f = &(xs_cfg.sid2Filter); 212 f = &(xs_cfg.sid2Filter);
244 XSDEBUG("using filter '%s', %d points\n", f->name, f->npoints); 213 XSDEBUG("using filter '%s', %d points\n", f->name, f->npoints);
245 if (f->npoints > XS_SIDPLAY2_NFPOINTS) 214 if (f->npoints > XS_SIDPLAY2_NFPOINTS)
246 { 215 {
253 for (i = 0; i < f->npoints; i++) 222 for (i = 0; i < f->npoints; i++)
254 { 223 {
255 tmpFilter.cutoff[i][0] = f->points[i].x; 224 tmpFilter.cutoff[i][0] = f->points[i].x;
256 tmpFilter.cutoff[i][1] = f->points[i].y; 225 tmpFilter.cutoff[i][1] = f->points[i].y;
257 } 226 }
258 #endif
259 227
260 /* Initialize builder object */ 228 /* Initialize builder object */
261 XSDEBUG("init builder #%i, maxsids=%i\n", xs_cfg.sid2Builder, (engine->emu.info()).maxsids); 229 XSDEBUG("init builder #%i, maxsids=%i\n", xs_cfg.sid2Builder, (engine->emu.info()).maxsids);
262 230
263 switch (xs_cfg.sid2Builder) 231 switch (xs_cfg.sid2Builder)
270 { 238 {
271 engine->config.sidEmulation = rs; 239 engine->config.sidEmulation = rs;
272 if (!*rs) return FALSE; 240 if (!*rs) return FALSE;
273 rs->create((engine->emu.info()).maxsids); 241 rs->create((engine->emu.info()).maxsids);
274 if (!*rs) return FALSE; 242 if (!*rs) return FALSE;
275 #ifdef HAVE_SIDPLAY2_FP
276 rs->bias(0.0f);
277 #endif
278 }
279 }
280 break;
281 #endif
282
283 #ifdef HAVE_RESID_FP_BUILDER
284 case XS_BLD_RESID_FP:
285 {
286 ReSIDfpBuilder *rs = new ReSIDfpBuilder("ReSID builder FP!");
287 if (rs)
288 {
289 engine->config.sidEmulation = rs;
290 if (!*rs) return FALSE;
291 rs->create((engine->emu.info()).maxsids);
292 if (!*rs) return FALSE;
293
294 rs->filter6581Curve(0.0);
295 rs->filter8580Curve(0.0);
296 } 243 }
297 } 244 }
298 break; 245 break;
299 #endif 246 #endif
300 247
325 { 272 {
326 xs_error("[SIDPlay2] Could not initialize SIDBuilder object.\n"); 273 xs_error("[SIDPlay2] Could not initialize SIDBuilder object.\n");
327 return FALSE; 274 return FALSE;
328 } 275 }
329 276
330 #ifdef HAVE_SIDPLAY2_FP 277 #if 0
331 // Setup filter 278 // Setup filter
332 engine->config.sidEmulation->filter(xs_cfg.emulateFilters); 279 engine->config.sidEmulation->filter(xs_cfg.emulateFilters);
333 if (!*(engine->config.sidEmulation)) 280 if (!*(engine->config.sidEmulation))
334 { 281 {
335 xs_error("builder->filter(%d) failed.\n", xs_cfg.emulateFilters); 282 xs_error("builder->filter(%d) failed.\n", xs_cfg.emulateFilters);
365 engine->config.clockForced = false; 312 engine->config.clockForced = false;
366 engine->config.clockSpeed = SID2_CLOCK_CORRECT; 313 engine->config.clockSpeed = SID2_CLOCK_CORRECT;
367 } 314 }
368 315
369 316
370 #ifndef HAVE_SIDPLAY2_FP
371 if (xs_cfg.sid2OptLevel < 0 || xs_cfg.sid2OptLevel > SID2_MAX_OPTIMISATION) 317 if (xs_cfg.sid2OptLevel < 0 || xs_cfg.sid2OptLevel > SID2_MAX_OPTIMISATION)
372 { 318 {
373 xs_error("Invalid sid2OptLevel=%d, falling back to %d.\n", 319 xs_error("Invalid sid2OptLevel=%d, falling back to %d.\n",
374 xs_cfg.sid2OptLevel, SID2_DEFAULT_OPTIMISATION); 320 xs_cfg.sid2OptLevel, SID2_DEFAULT_OPTIMISATION);
375 321
376 xs_cfg.sid2OptLevel = SID2_DEFAULT_OPTIMISATION; 322 xs_cfg.sid2OptLevel = SID2_DEFAULT_OPTIMISATION;
377 } 323 }
378 engine->config.optimisation = xs_cfg.sid2OptLevel; 324 engine->config.optimisation = xs_cfg.sid2OptLevel;
379 #endif
380 325
381 engine->config.sidDefault = xs_cfg.mos8580 ? SID2_MOS8580 : SID2_MOS6581; 326 engine->config.sidDefault = xs_cfg.mos8580 ? SID2_MOS8580 : SID2_MOS6581;
382 engine->config.sidModel = xs_cfg.forceModel ? engine->config.sidDefault : SID2_MODEL_CORRECT; 327 engine->config.sidModel = xs_cfg.forceModel ? engine->config.sidDefault : SID2_MODEL_CORRECT;
383 engine->config.sidSamples = TRUE; 328 engine->config.sidSamples = TRUE;
384 329
442 XSSIDPlay2 *engine = (XSSIDPlay2 *) state->internal; 387 XSSIDPlay2 *engine = (XSSIDPlay2 *) state->internal;
443 388
444 if (!engine) 389 if (!engine)
445 return 0; 390 return 0;
446 391
447 #if 1
448 #ifdef HAVE_SIDPLAY2_FP
449 int nsamples = audioBufSize / sizeof(short);
450 return engine->emu.play((short *) audioBuffer, nsamples) * sizeof(short);
451 #else
452 return engine->emu.play(audioBuffer, audioBufSize); 392 return engine->emu.play(audioBuffer, audioBufSize);
453 #endif
454 #else
455 int nsamples = audioBufSize / sizeof(short);
456 fprintf(stderr, "%p, %d -> %d\n", audioBuffer, audioBufSize, nsamples);
457 return 0;
458 #endif
459 } 393 }
460 394
461 395
462 /* Load a given SID-tune file 396 /* Load a given SID-tune file
463 */ 397 */
495 XSSIDPlay2 *engine = (XSSIDPlay2 *) state->internal; 429 XSSIDPlay2 *engine = (XSSIDPlay2 *) state->internal;
496 430
497 #ifdef HAVE_HARDSID_BUILDER 431 #ifdef HAVE_HARDSID_BUILDER
498 if (xs_cfg.sid2Builder == XS_BLD_HARDSID) 432 if (xs_cfg.sid2Builder == XS_BLD_HARDSID)
499 { 433 {
500 #ifdef HSID_SID2_COM
501 IfPtr<HardSIDBuilder> hs(engine->config.sidEmulation);
502 if (hs)
503 hs->flush();
504 #else
505 ((HardSIDBuilder *) engine->config.sidEmulation)->flush(); 434 ((HardSIDBuilder *) engine->config.sidEmulation)->flush();
506 #endif
507 } 435 }
508 #endif 436 #endif
509 } 437 }
510 438
511 439