static int RunExit() { nNormalLast = 0; // Stop sound if it was playing SndExit(); return 0; }
// General code for sound int SndInit() { if(bSndOkay) SndExit(); if(options.sound > 3) options.sound = 0; pSndDrv = &SndDrvList[options.sound]; if (options.sound) { int i = options.samplerate; if(i > 4) i = 0; nBurnSoundRate = nSndSampleRate[i]; nBurnSoundLen = ((nBurnSoundRate * 100) / nBurnFPS ); } pBurnSoundOut = NULL; nSndSegSize = nBurnSoundLen * nSndChannels * 2; nSndSegBuffer = (short *)malloc(nSndSegSize); memset(nSndSegBuffer,0,nSndSegSize); printf("nBurnSoundLen: %i samples\n", nBurnSoundLen); bSndOkay = (*pSndDrv->open)(nBurnSoundRate, nSndChannels, 16); if(bSndOkay) { pBurnSoundOut = (short *)nSndSegBuffer; return 1; } else { pBurnSoundOut = NULL; nBurnSoundRate = 0; nBurnSoundLen = 0; } options.sound = 0; pSndDrv = &SndDrvList[0]; // null sound return 0; }
int DrvExit() { if (bDrvOkay) { // StopReplay(); // VidExit(); if (nBurnDrvSelect[0] < nBurnDrvCount) { //MemCardEject(); // Eject memory card if present if (bSaveRAM) { //StatedAuto(1); // Save NV (or full) RAM bSaveRAM = false; } ConfigGameSave(); // GameInpExit(); // Exit game input BurnDrvExit(); // Exit the driver } } BurnExtLoadRom = NULL; bDrvOkay = 0; // Stop using the BurnDrv functions //bRunPause = 0; // Don't pause when exitted // if (bAudOkay) { // // Write silence into the sound buffer on exit, and for drivers which don't use pBurnSoundOut // memset(nAudNextSound, 0, nAudSegLen << 2); // } SndExit(); nBurnDrvSelect[0] = ~0U; // no driver selected return 0; }
void run_fba_emulator(const char *fn) { char build_version[] = "Finalburn Alpha Plus for Pi ("__DATE__")"; // process rom path and name char romname[MAX_PATH]; if (BurnCacheInit(fn, romname)) goto finish; if(config_options.option_showfps) bShowFPS=true; BurnLibInit(); // find rom by name for (nBurnDrvSelect=0; nBurnDrvSelect<nBurnDrvCount; nBurnDrvSelect++) if ( strcasecmp(romname, BurnDrvGetTextA(DRV_NAME)) == 0 ) break; if (nBurnDrvSelect >= nBurnDrvCount) { // unsupport rom ... nBurnDrvSelect = ~0U; logoutput ("rom not supported!\n"); printf ("rom not supported!\n"); goto finish; } logoutput("Attempt to initialise '%s'\n", BurnDrvGetTextA(DRV_FULLNAME)); memset (titlefb, 0, 320*240*2); DrawString (build_version, (uint16*)&titlefb, 10, 20, 320); DrawString ("Based on FinalBurnAlpha", (uint16*)&titlefb, 10, 35, 320); DrawString ("Now loading ... ", (uint16 *)&titlefb, 10, 105, 320); show_rom_loading_text("Open Zip", 0, 0); memcpy (VideoBuffer, titlefb, 320*240*2); pi_video_flip(); InpInit(); InpDIP(); VideoInit(); if (DrvInit(nBurnDrvSelect, false) != 0) { logoutput ("Driver initialisation failed! Likely causes are:\n- Corrupt/Missing ROM(s)\n- I/O Error\n- Memory error\n\n"); printf ("Driver initialisation failed! Likely causes are:\n- Corrupt/Missing ROM(s)\n- I/O Error\n- Memory error\n\n"); goto finish; } RunReset(); frame_count = 0; GameLooping = true; EZX_StartTicks(); logoutput ("Lets go!\n"); logflush(); if (config_options.option_sound_enable) { int timer = 0, tick=0, i=0, fps = 0; bool bRenderFrame; if (SndOpen() == 0) { while (GameLooping) { if (bShowFPS) { timer = EZX_GetTicks(); if(timer-tick>1000000) { fps = nFramesRendered; nFramesRendered = 0; tick = timer; } } //We need to render more audio: bRenderFrame=true; // Render last frame RunOneFrame(bRenderFrame,fps); update_audio_stream(pBurnSoundOut); pi_process_events(); } } } else { int now, done=0, timer = 0, ticks=0, tick=0, i=0, fps = 0; unsigned int frame_limit = nBurnFPS/100, frametime = 100000000/nBurnFPS; while (GameLooping) { timer = EZX_GetTicks()/frametime;; if(timer-tick>frame_limit && bShowFPS) { fps = nFramesRendered; nFramesRendered = 0; tick = timer; } now = timer; ticks=now-done; if(ticks<1) continue; if(ticks>10) ticks=10; for (i=0; i<ticks-1; i++) { RunOneFrame(false,fps); } if(ticks>=1) { RunOneFrame(true,fps); } done = now; } } logoutput ("Finished emulating\n"); finish: logoutput("---- Shutdown Finalburn Alpha plus ----\n\n"); DrvExit(); BurnLibExit(); if (config_options.option_sound_enable) SndExit(); VideoExit(); InpExit(); BurnCacheExit(); }