void retro_run() { input_poll_cb(); update_input(); static int16_t sound_buf[0x10000]; static MDFN_Rect rects[384]; EmulateSpecStruct spec = {0}; spec.surface = surf; spec.SoundRate = 48000; spec.SoundBuf = sound_buf; spec.LineWidths = rects; spec.SoundBufMaxSize = sizeof(sound_buf) / 2; spec.SoundVolume = 1.0; spec.soundmultiplier = 1.0; MDFNI_Emulate(&spec); //unsigned width = rects[0].w; //unsigned height = spec.DisplayRect.h; unsigned width = 384; unsigned height = 224; convert_surface(); video_cb(conv_buf, width, height, width << 1); audio_batch_cb(spec.SoundBuf, spec.SoundBufSize); }
EmulateSpecStruct vbjinEmulate() { // EmulateSpecStruct espec; memset(&espec, 0, sizeof(EmulateSpecStruct)); espec.VideoFormatChanged = true; espec.surface = (MDFN_Surface *)VTBuffer[VTBackBuffer]; espec.LineWidths = (MDFN_Rect *)VTLineWidths[VTBackBuffer]; espec.skip = 0; espec.soundmultiplier = 1; espec.SoundVolume = 1; espec.NeedRewind = false; //// espec.SoundBuf = EmuModBuffer; espec.SoundBufMaxSize = EmuModBufferSize; espec.SoundVolume = 1;//(double)MDFN_GetSettingUI("soundvol") / 100; static double average_time = 0; /* int color =5555555; int h = 224; for(uint32 i = 0; i < 320 * h; i++) { // VTBuffer[VTBackBuffer]->pixels[i] = color; } */ //frames++; //PadData = setPad(); MDFNI_Emulate(&espec); return espec; }
void retro_run() { input_poll_cb(); update_input(); static int16_t sound_buf[0x10000]; static MDFN_Rect rects[480]; rects[0].w = ~0; EmulateSpecStruct spec = {0}; spec.surface = surf; spec.SoundRate = 44100; spec.SoundBuf = sound_buf; spec.LineWidths = rects; spec.SoundBufMaxSize = sizeof(sound_buf) / 2; spec.SoundVolume = 1.0; spec.soundmultiplier = 1.0; MDFNI_Emulate(&spec); unsigned width = rects[0].w; unsigned height = spec.DisplayRect.h; if (rgb32) { // FIXME: Avoid black borders. Cannot see how DisplayRect exposes this. const uint32_t *ptr = mednafen_buf; if (width == 340) { ptr += 10; width = 320; } else if (width == 680) { ptr += 20; width = 640; } video_cb(ptr, width, height, 680 << 2); } else { convert_surface(); const uint16_t *ptr = conv_buf; if (width == 340) { ptr += 10; width = 320; } else if (width == 680) { ptr += 20; width = 640; } video_cb(ptr, width, height, 680 << 1); } audio_batch_cb(spec.SoundBuf, spec.SoundBufSize); }
int GameLoop(void *arg) { while(GameThreadRun) { int16 *sound; int32 ssize; int fskip; /* If we requested a new video mode, wait until it's set before calling the emulation code again. */ while(NeedVideoChange) { if(!GameThreadRun) return(1); // Might happen if video initialization failed SDL_Delay(1); } do { if(InFrameAdvance && !NeedFrameAdvance) { SDL_Delay(10); } } while(InFrameAdvance && !NeedFrameAdvance); fskip = ThrottleCheckFS(); if(pending_snapshot || pending_save_state || pending_save_movie || NeedFrameAdvance) fskip = 0; NeedFrameAdvance = 0; if(NoWaiting) fskip = 1; VTLineWidths[VTBackBuffer][0].w = ~0; int ThisBackBuffer = VTBackBuffer; LockGameMutex(1); { EmulateSpecStruct espec; memset(&espec, 0, sizeof(EmulateSpecStruct)); espec.pixels = (uint32 *)VTBuffer[VTBackBuffer]; espec.LineWidths = (MDFN_Rect *)VTLineWidths[VTBackBuffer]; espec.SoundBuf = &sound; espec.SoundBufSize = &ssize; espec.skip = fskip; espec.soundmultiplier = CurGameSpeed; espec.NeedRewind = DNeedRewind; MDFNI_Emulate(&espec); //(uint32 *)VTBuffer[VTBackBuffer], (MDFN_Rect *)VTLineWidths[VTBackBuffer], &sound, &ssize, fskip, CurGameSpeed); } LockGameMutex(0); FPS_IncVirtual(); if(!fskip) FPS_IncDrawn(); do { GameThread_HandleEvents(); VTBackBuffer = ThisBackBuffer; MDFND_Update(fskip ? NULL : (uint32 *)VTBuffer[ThisBackBuffer], sound, ssize); if((InFrameAdvance && !NeedFrameAdvance) || GameLoopPaused) { if(!ssize) ThrottleCheckFS(); else for(int x = 0; x < CurGame->soundchan * ssize; x++) sound[x] = 0; } } while(((InFrameAdvance && !NeedFrameAdvance) || GameLoopPaused) && GameThreadRun); } return(1); }