Mercurial > hg > xmms-sid
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 |