comparison src/xs_sidplayfp.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
128 else 128 else
129 return FALSE; 129 return FALSE;
130 } 130 }
131 131
132 132
133 /* Initialize SIDPlay2 133 /* Initialize SIDPlayFP
134 */ 134 */
135 gboolean xs_sidplayfp_init(XSEngineState * state) 135 gboolean xs_sidplayfp_init(XSEngineState * state)
136 { 136 {
137 XSSIDPlayFP *engine; 137 XSSIDPlayFP *engine;
138 assert(state); 138 assert(state);
139
140 XSDEBUG("SIDPlayFP backend initializing.\n");
139 141
140 /* Allocate internal structures */ 142 /* Allocate internal structures */
141 engine = new XSSIDPlayFP(); 143 engine = new XSSIDPlayFP();
142 state->internal = engine; 144 state->internal = engine;
143 if (!engine) 145 if (!engine)
144 return FALSE; 146 return FALSE;
145 147
146 /* Get current configuration */ 148 /* Get current configuration */
149 XSDEBUG("SIDPlayFP emulation configuration\n");
147 engine->config = engine->emu.config(); 150 engine->config = engine->emu.config();
148 151
149 /* Configure channels and stuff */ 152 /* Configure channels and stuff */
150 engine->config.playback = (state->audioChannels == XS_CHN_MONO) ? sid2_mono : sid2_stereo; 153 engine->config.playback = (state->audioChannels == XS_CHN_MONO) ? sid2_mono : sid2_stereo;
151 154
152 /* Audio parameters sanity checking and setup */ 155 /* Audio parameters sanity checking and setup */
153 state->audioBitsPerSample = XS_RES_16BIT; 156 state->audioBitsPerSample = XS_RES_16BIT;
154 engine->config.samplingMethod = SID2_RESAMPLE_INTERPOLATE; 157 engine->config.samplingMethod = SID2_RESAMPLE_INTERPOLATE;
155 engine->config.frequency = state->audioFrequency; 158 engine->config.frequency = state->audioFrequency;
156 159
160 /* Clockspeed settings */
161 switch (xs_cfg.clockSpeed)
162 {
163 case XS_CLOCK_NTSC:
164 engine->config.clockDefault = SID2_CLOCK_NTSC;
165 break;
166
167 default:
168 case XS_CLOCK_PAL:
169 engine->config.clockDefault = SID2_CLOCK_PAL;
170 xs_cfg.clockSpeed = XS_CLOCK_PAL;
171 break;
172 }
173
174
175 /* Configure rest of the emulation */
176 engine->config.sidDefault = xs_cfg.mos8580 ? SID2_MOS8580 : SID2_MOS6581;
177 engine->config.clockForced = xs_cfg.forceSpeed;
178
179 #ifndef HAVE_SIDPLAYFP_V1
180 engine->config.sidSamples = TRUE;
181 engine->config.sidModel = xs_cfg.forceModel ? engine->config.sidDefault : SID2_MODEL_CORRECT;
182 engine->config.clockSpeed = xs_cfg.forceSpeed ? engine->config.clockDefault : SID2_CLOCK_CORRECT;
183 #endif
184
157 /* Initialize builder object */ 185 /* Initialize builder object */
158 XSDEBUG("init builder #%i, maxsids=%i\n", xs_cfg.sid2Builder, (engine->emu.info()).maxsids); 186 XSDEBUG("init builder #%i, maxsids=%i\n", xs_cfg.sid2Builder, (engine->emu.info()).maxsids);
159 187
160 switch (xs_cfg.sid2Builder) 188 switch (xs_cfg.sid2Builder)
161 { 189 {
190 #if 0
162 #ifdef HAVE_RESID_BUILDER 191 #ifdef HAVE_RESID_BUILDER
163 case XS_BLD_RESID: 192 case XS_BLD_RESID:
164 { 193 {
165 ReSIDBuilder *rs = new ReSIDBuilder("ReSID builder"); 194 ReSIDBuilder *rs = new ReSIDBuilder("ReSID builder");
166 #ifdef HAVE_SIDPLAYFP_V1 195 #ifdef HAVE_SIDPLAYFP_V1
167 if (rs && rs->getStatus()) 196 if (rs && rs->getStatus())
168 { 197 {
169 } 198 }
170 #else 199 #else
171 if (rs) 200 if (rs && *rs)
172 { 201 {
173 engine->config.sidEmulation = rs; 202 engine->config.sidEmulation = rs;
174 if (!*rs) return FALSE; 203 if (!(*rs)) return FALSE;
175 rs->create((engine->emu.info()).maxsids); 204 rs->create((engine->emu.info()).maxsids);
176 if (!*rs) return FALSE; 205 if (!(*rs)) return FALSE;
177 rs->bias(0.0f); 206 rs->bias(0.0f);
178 } 207 }
179 #endif // HAVE_SIDPLAYFP_V1 208 #endif // HAVE_SIDPLAYFP_V1
180 } 209 }
181 break; 210 break;
182 #endif // HAVE_RESID_BUILDER 211 #endif // HAVE_RESID_BUILDER
183 212 #endif
184 213
185 #ifdef HAVE_RESID_FP_BUILDER 214 #ifdef HAVE_RESID_FP_BUILDER
186 case XS_BLD_RESID_FP: 215 case XS_BLD_RESID_FP:
187 { 216 {
188 ReSIDfpBuilder *rs = new ReSIDfpBuilder("ReSID builder FP!"); 217 ReSIDfpBuilder *rs = new ReSIDfpBuilder("ReSID builder FP!");
189 if (rs) 218 if (rs && *rs)
190 { 219 {
191 engine->config.sidEmulation = rs; 220 engine->config.sidEmulation = rs;
192 if (!*rs) return FALSE; 221 if (!(*rs)) return FALSE;
193 rs->create((engine->emu.info()).maxsids); 222 rs->create((engine->emu.info()).maxsids);
194 if (!*rs) return FALSE; 223 if (!(*rs)) return FALSE;
195 224
196 rs->filter6581Curve(0.0); 225 rs->filter6581Curve(0.0);
197 rs->filter8580Curve(0.0); 226 rs->filter8580Curve(0.0);
198 } 227 }
199 } 228 }
217 } 246 }
218 break; 247 break;
219 #endif 248 #endif
220 249
221 default: 250 default:
222 xs_error("[SIDPlay2] Invalid or unsupported builder selected.\n"); 251 xs_error("[SIDPlayFP] Invalid or unsupported builder selected.\n");
223 break; 252 return FALSE;
224 } 253 }
225 254
226 if (!engine->config.sidEmulation) 255 if (!engine->config.sidEmulation)
227 { 256 {
228 xs_error("[SIDPlay2] Could not initialize SIDBuilder object.\n"); 257 xs_error("[SIDPlayFP] Could not initialize SIDBuilder object.\n");
229 return FALSE; 258 return FALSE;
230 } 259 }
231 260
232 // Setup filter 261 // Setup filter
233 engine->config.sidEmulation->filter(xs_cfg.emulateFilters); 262 engine->config.sidEmulation->filter(xs_cfg.emulateFilters);
237 return FALSE; 266 return FALSE;
238 } 267 }
239 268
240 XSDEBUG("%s\n", engine->config.sidEmulation->credits()); 269 XSDEBUG("%s\n", engine->config.sidEmulation->credits());
241 270
242 /* Clockspeed settings */
243 switch (xs_cfg.clockSpeed)
244 {
245 case XS_CLOCK_NTSC:
246 engine->config.clockDefault = SID2_CLOCK_NTSC;
247 break;
248
249 default:
250 case XS_CLOCK_PAL:
251 engine->config.clockDefault = SID2_CLOCK_PAL;
252 xs_cfg.clockSpeed = XS_CLOCK_PAL;
253 break;
254 }
255
256
257 /* Configure rest of the emulation */
258 engine->config.sidDefault = xs_cfg.mos8580 ? SID2_MOS8580 : SID2_MOS6581;
259 engine->config.clockForced = xs_cfg.forceSpeed;
260
261 #ifndef HAVE_SIDPLAYFP_V1
262 engine->config.sidSamples = TRUE;
263 engine->config.sidModel = xs_cfg.forceModel ? engine->config.sidDefault : SID2_MODEL_CORRECT;
264 engine->config.clockSpeed = xs_cfg.forceSpeed ? engine->config.clockDefault : SID2_CLOCK_CORRECT;
265 #endif
266 271
267 return TRUE; 272 return TRUE;
268 } 273 }
269 274
270 275
271 /* Close SIDPlay2 engine 276 /* Close SIDPlayFP engine
272 */ 277 */
273 void xs_sidplayfp_close(XSEngineState * state) 278 void xs_sidplayfp_close(XSEngineState * state)
274 { 279 {
275 XSSIDPlayFP *engine = (XSSIDPlayFP *) state->internal; 280 XSSIDPlayFP *engine = (XSSIDPlayFP *) state->internal;
281
282 XSDEBUG("SIDPlayFP backend shutdown.\n");
276 283
277 xs_sidplayfp_delete(state); 284 xs_sidplayfp_delete(state);
278 285
279 if (engine) 286 if (engine)
280 { 287 {
295 if (!engine) 302 if (!engine)
296 return FALSE; 303 return FALSE;
297 304
298 if (!engine->tune.selectSong(state->currSong)) 305 if (!engine->tune.selectSong(state->currSong))
299 { 306 {
300 xs_error("[SIDPlay2] tune.selectSong() failed\n"); 307 xs_error("[SIDPlayFP] tune.selectSong() failed\n");
301 return FALSE; 308 return FALSE;
302 } 309 }
303 310
304 if (engine->emu.load(&(engine->tune)) < 0) 311 if (engine->emu.load(&(engine->tune)) < 0)
305 { 312 {
306 xs_error("[SIDPlay2] emu.load() failed\n"); 313 xs_error("[SIDPlayFP] emu.load() failed\n");
307 return FALSE; 314 return FALSE;
308 } 315 }
309 316
310 if (engine->emu.config(engine->config) < 0) 317 if (engine->emu.config(engine->config) < 0)
311 { 318 {
312 xs_error("[SIDPlay2] Emulator engine configuration failed!\n"); 319 xs_error("[SIDPlayFP] Emulator engine configuration failed!\n");
313 return FALSE; 320 return FALSE;
314 } 321 }
315 322
316 return TRUE; 323 return TRUE;
317 } 324 }