diff --git a/src/drivers/win/OutputDS.cpp b/src/drivers/win/OutputDS.cpp index c1e7c0ed..e09000fd 100644 --- a/src/drivers/win/OutputDS.cpp +++ b/src/drivers/win/OutputDS.cpp @@ -6,23 +6,6 @@ #define LATENCY_MS (100) -int voltbl[] = { --10000,-8750,-8018,-7499,-7097,-6768,-6490,-6250,-6037,-5847,-5675,-5518,-5374,-5240,-5116,-5000, --4890,-4787,-4690,-4597,-4509,-4425,-4345,-4268,-4195,-4124,-4056,-3990,-3927,-3866,-3807,-3749, --3694,-3640,-3588,-3537,-3488,-3440,-3393,-3347,-3303,-3259,-3217,-3175,-3135,-3095,-3056,-3018, --2981,-2945,-2909,-2874,-2840,-2806,-2773,-2740,-2708,-2677,-2646,-2616,-2586,-2557,-2528,-2500, --2472,-2444,-2417,-2390,-2364,-2338,-2312,-2287,-2262,-2238,-2213,-2190,-2166,-2143,-2120,-2097, --2075,-2053,-2031,-2009,-1988,-1967,-1946,-1925,-1905,-1885,-1865,-1845,-1826,-1806,-1787,-1768, --1750,-1731,-1713,-1695,-1677,-1659,-1641,-1624,-1607,-1590,-1573,-1556,-1539,-1523,-1506,-1490, --1474,-1458,-1443,-1427,-1412,-1396,-1381,-1366,-1351,-1336,-1321,-1307,-1292,-1278,-1264,-1250, --1235,-1222,-1208,-1194,-1180,-1167,-1153,-1140,-1127,-1114,-1101,-1088,-1075,-1062,-1050,-1037, --1025,-1012,-1000,-988,-976,-963,-951,-940,-928,-916,-904,-893,-881,-870,-858,-847, --836,-825,-814,-803,-792,-781,-770,-759,-748,-738,-727,-717,-706,-696,-685,-675, --665,-655,-645,-635,-625,-615,-605,-595,-585,-576,-566,-556,-547,-537,-528,-518, --509,-500,-490,-481,-472,-463,-454,-445,-436,-427,-418,-409,-400,-391,-383,-374, --365,-357,-348,-340,-331,-323,-314,-306,-298,-289,-281,-273,-265,-256,-248,-240, --232,-224,-216,-208,-200,-193,-185,-177,-169,-162,-154,-146,-139,-131,-123,-116, --108,-101,-93,-86,-79,-71,-64,-57,-49,-42,-35,-28,-21,-14,-7,0}; class DSVoice : public OAKRA_Voice { public: @@ -35,14 +18,10 @@ public: int vol,pan; virtual void setPan(int pan) { - this->pan = pan; - if(pan==0) ds_buf->SetPan(0); - else if(pan>0) ds_buf->SetPan(-voltbl[255-pan]); - else ds_buf->SetPan(voltbl[255+pan]); + //removed for FCEU } virtual void setVol(int vol) { - this->vol = vol; - ds_buf->SetVolume(voltbl[vol]); + //removed for FCEU } virtual int getVol() { return vol; } virtual int getPan() { return pan; } @@ -75,7 +54,8 @@ public: DSBUFFERDESC dsbd; memset(&dsbd, 0, sizeof(dsbd)); dsbd.dwSize = sizeof(dsbd); - dsbd.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_LOCSOFTWARE | DSBCAPS_CTRLVOLUME ; + //commented out for FCEU + dsbd.dwFlags = DSBCAPS_GETCURRENTPOSITION2;// | DSBCAPS_LOCSOFTWARE | DSBCAPS_CTRLVOLUME ; if(global) dsbd.dwFlags |= DSBCAPS_GLOBALFOCUS ; dsbd.dwBufferBytes = buflen * format.size; dsbd.lpwfxFormat = &wfx; diff --git a/src/drivers/win/input.cpp b/src/drivers/win/input.cpp index dcc3a407..883d4a44 100644 --- a/src/drivers/win/input.cpp +++ b/src/drivers/win/input.cpp @@ -1828,7 +1828,7 @@ void MapInput(void) void FCEUD_TurboOn(void) { //NoWaiting|=1; - turbo = 1; + turbo = true; } void FCEUD_TurboOff(void) diff --git a/src/drivers/win/main.cpp b/src/drivers/win/main.cpp index b4fa6465..992b07a0 100644 --- a/src/drivers/win/main.cpp +++ b/src/drivers/win/main.cpp @@ -476,7 +476,6 @@ int main(int argc,char *argv[]) if(!DriverInitialize()) goto doexito; - InitSpeedThrottle(); UpdateMenu(); if(t) @@ -781,35 +780,27 @@ void _updateWindow() { void FCEUD_Update(uint8 *XBuf, int32 *Buffer, int Count) { //mbg merge 7/19/06 - leaving this untouched but untested - /*int ocount = Count; - // apply frame scaling to Count - Count = (Count<<8)/temp_fps_scale; - //Disable sound and throttling for BotMode--we want max speed! - if(FCEU_BotMode()) - { - if(XBuf && (skipcount >= 64)) + //its probably not optimal + if(FCEU_BotMode()) { + //this counts the number of frames we've skipped blitting + static int skipcount = 0; + if(XBuf && (skipcount++ >= 64)) { skipcount = 0; FCEUD_BlitScreen(XBuf); } - else - { - skipcount++; - } UpdateFCEUWindow(); FCEUD_UpdateInput(); return; - }*/ + } - extern bool turbo; //hack + win_SoundSetScale(fps_scale); //write all the sound we generated. if(soundo && Buffer && Count) { - void FCEUD_WriteSoundData_new(int32 *Buffer, int scale, int Count, bool turbo); - FCEUD_WriteSoundData_new(Buffer,fps_scale,Count,turbo); - //FCEUD_WriteSoundData(Buffer,fps_scale,Count); + win_SoundWriteData(Buffer,Count); } - + //blit the framebuffer if(XBuf) FCEUD_BlitScreen(XBuf); @@ -817,28 +808,20 @@ void FCEUD_Update(uint8 *XBuf, int32 *Buffer, int Count) //update debugging displays _updateWindow(); - //throttle - bool skip = false; - for(;;) { - if(!(eoptions&EO_NOTHROTTLE)) //if throttling is enabled.. - if(!turbo) //and turbo is disabled.. - if(!FCEUI_EmulationPaused()) //and we're not paused.. - //if(SpeedThrottle()) {//...then check whether we need to throttle - // //idle.. - // Sleep(0); - // continue; - //} - {} - break; - } - + extern bool turbo; //needs to be declared better + if(!(eoptions&EO_NOTHROTTLE)) //if throttling is enabled.. + if(!turbo) //and turbo is disabled.. + if(!FCEUI_EmulationPaused()) + //then throttle + win_Throttle(); //delay until we unpause. we will only stick here if we're paused by a breakpoint or debug command while(FCEUI_EmulationPaused() && inDebugger) { Sleep(50); BlockingCheck(); + FCEUD_UpdateInput(); //should this update the CONTROLS??? or only the hotkeys etc? } //something of a hack, but straightforward: diff --git a/src/drivers/win/sound.cpp b/src/drivers/win/sound.cpp index 0e5bfee1..d126bdf5 100644 --- a/src/drivers/win/sound.cpp +++ b/src/drivers/win/sound.cpp @@ -20,211 +20,8 @@ #include -LPDIRECTSOUND ppDS=0; /* DirectSound object. */ -LPDIRECTSOUNDBUFFER ppbuf=0; /* Primary buffer object. */ -LPDIRECTSOUNDBUFFER ppbufsec=0; /* Secondary buffer object. */ -LPDIRECTSOUNDBUFFER ppbufw; /* Buffer to actually write to. */ - -long DSBufferSize; /* The size of the buffer that we can write to, in bytes. */ - -long BufHowMuch; /* How many bytes we should try to buffer. */ -DWORD ToWritePos; /* Position which the next write to the buffer - should write to. - */ - - - -DSBUFFERDESC DSBufferDesc; -WAVEFORMATEX wfa; -WAVEFORMATEX wf; - -//bittag=1 -> 8bit output -int bittage; static int mute=0; /* TODO: add to config? add to GUI. */ -void TrashSound(void) -{ - FCEUI_Sound(0); - if(ppbufsec) - { - IDirectSoundBuffer_Stop(ppbufsec); - IDirectSoundBuffer_Release(ppbufsec); - ppbufsec=0; - } - if(ppbuf) - { - IDirectSoundBuffer_Stop(ppbuf); - IDirectSoundBuffer_Release(ppbuf); - ppbuf=0; - } - if(ppDS) - { - IDirectSound_Release(ppDS); - ppDS=0; - } -} - -void CheckDStatus(void) -{ - DWORD status; - status=0; - IDirectSoundBuffer_GetStatus(ppbufw, &status); - - if(status&DSBSTATUS_BUFFERLOST) - { - IDirectSoundBuffer_Restore(ppbufw); - } - - if(!(status&DSBSTATUS_PLAYING)) - { - ToWritePos=0; - IDirectSoundBuffer_SetFormat(ppbufw,&wf); - IDirectSoundBuffer_Play(ppbufw,0,0,DSBPLAY_LOOPING); - } -} - -static uint32 RawCanWrite(void) -{ - DWORD CurWritePos,CurPlayPos=0; - - CheckDStatus(); - - CurWritePos=0; - - if(IDirectSoundBuffer_GetCurrentPosition(ppbufw,&CurPlayPos,&CurWritePos)==DS_OK) - { -// FCEU_DispMessage("%8d",(CurWritePos-CurPlayPos)); - } - CurWritePos=(CurPlayPos+BufHowMuch)%DSBufferSize; - - /* If the current write pos is >= half the buffer size less than the to write pos, - assume DirectSound has wrapped around. - */ - - if(((int32)ToWritePos-(int32)CurWritePos) >= (DSBufferSize/2)) - { - CurWritePos+=DSBufferSize; - //FCEU_printf("Fixit: %d,%d,%d\n",ToWritePos,CurWritePos,CurWritePos-DSBufferSize); - } - if(ToWritePos BufHowMuch) /* Oopsie. Severe buffer overflow... */ - { - //FCEU_printf("Ack"); - ToWritePos=CurWritePos%DSBufferSize; - } - return(CurWritePos-ToWritePos); - } - else - return(0); -} - -int32 GetWriteSound(void) -{ - if(!soundo) - return 0; - return(RawCanWrite() >> bittage); -} - -int32 GetMaxSound(void) -{ - return( BufHowMuch >> bittage); -} - -///enqueues the given samples for playback -static void EnqueueSamples(void *data, uint32 len) { -} - -static int RawWrite(void *data, uint32 len) -{ - //uint32 cw; //mbg merge 7/17/06 removed - - //printf("Pre: %d\n",SexyALI_DSound_RawCanWrite(device)); - //fflush(stdout); - - if(!soundo) - return 0; - - CheckDStatus(); - /* In this block, we write as much data as we can, then we write - the rest of it in >=1ms chunks. - */ - while(len) - { - VOID *LockPtr[2]={0,0}; - DWORD LockLen[2]={0,0}; - - //mbg merge 7/17/06 changed to uint - //mbg merge 7/18/06 was causing a crash when fastforwarding unless this was initialized to len - uint32 curlen=len; - - - // THIS LIMITS THE EMULATION SPEED - //if((!NoWaiting) || (soundoptions&SO_OLDUP)) - //printf("RawCanWrite(): %d\n",RawCanWrite()); - //while(!(curlen=RawCanWrite())) - //{ - // Sleep(1); - //} - - if(curlen>len) curlen=len; - - if(DS_OK == IDirectSoundBuffer_Lock(ppbufw,ToWritePos,curlen,&LockPtr[0],&LockLen[0],&LockPtr[1],&LockLen[1],0)) - { - } - - if(LockPtr[1] != 0 && LockPtr[1] != LockPtr[0]) - { - if(mute) - { - if(bittage) - { - memset(LockPtr[0], 0, LockLen[0]); - memset(LockPtr[1], 0, len-LockLen[0]); - } - else - { - memset(LockPtr[0], 0x80, LockLen[0]); - memset(LockPtr[1], 0x80, len-LockLen[0]); - } - } - else - { - /* not mute */ - memcpy(LockPtr[0],data,LockLen[0]); - memcpy(LockPtr[1],(char*)data+LockLen[0],len-LockLen[0]); //mbg merge 7/17/06 added cast - } - } - else if(LockPtr[0]) - { - if(mute) - { - if(bittage) - memset(LockPtr[0], 0, curlen); - else - memset(LockPtr[0], 0x80, curlen); - } - else - { - /* not mute */ - memcpy(LockPtr[0],data,curlen); - } - } - IDirectSoundBuffer_Unlock(ppbufw,LockPtr[0],LockLen[0],LockPtr[1],LockLen[1]); - ToWritePos=(ToWritePos+curlen)%DSBufferSize; - - len-=curlen; - data=(uint8 *)data+curlen; //mbg merge 7/17/06 reworked to be type proper - - //if(len && !NoWaiting && (fps_scale <= 256 || (soundoptions&SO_OLDUP))) - // Sleep(1); // do some extra sleeping if we think there's time and we're not scaling up the FPS or in turbo mode - - } // end while(len) loop - - - return(1); -} int silencer=0; @@ -298,6 +95,14 @@ public: return *(short*)((char*)liveBuffers[buffer]->data+ofs); } + template + ST getElementAtIndex(int addr) { + addr *= sizeof(ST); //shorts are 2bytes + int buffer = (addr+offset)>>BufferSizeBits; + int ofs = (addr+offset) & BufferSizeBitmask; + return *(ST*)((char*)liveBuffers[buffer]->data+ofs); + } + //dequeues the specified number of bytes void dequeue(int length) { offset += length; @@ -310,6 +115,20 @@ public: this->length -= length; } + //not being used now: + + //tries to lock the specified number of bytes for reading. + //not all the bytes you asked for will be locked (no more than one buffer-full) + //try again if you didnt get enough. + //returns the number of bytes locked. + int lock(int length, void **ptr) { + int remain = BufferSize-offset; + *ptr = (char*)liveBuffers[0]->data + offset; + if(lengthlock(); + buffers.enqueue(bytes,buf); + buffers.decay(60); + dsout->unlock(); + } + + virtual int getSamplesInBuffer() = 0; + + void throttle() { + //wait for the buffer to be satisfactorily low before continuing + for(;;) { + dsout->lock(); + int remain = getSamplesInBuffer(); + dsout->unlock(); + if(remain<44100/60) break; + //if(remain<44100*scale/256/60) break; ?? + Sleep(1); + } + } + + void setScale(int scale) { + dsout->lock(); + this->scale = scale; + dsout->unlock(); + } +}; + +template +class Player : public PlayerBase { +public: + + int cursor; + + int getSamplesInBuffer() { return buffers.length>>SHIFT; } + //not interpolating! someday it will! int generate(int samples, void *buf) { int incr = 256; - int bufferSamples = buffers.length>>1; + int bufferSamples = buffers.length>>SHIFT; //if we're we're too far behind, playback faster if(bufferSamples > 44100*3/60) { @@ -366,369 +222,120 @@ public: int destSamplesCanGenerate = (bufferSamples<<8) / incr; int todo = std::min(destSamplesCanGenerate,samples); - short *sbuf = (short*)buf; + ST *sbuf = (ST*)buf; for(int i=0;i>8); + sbuf[i] = buffers.getElementAtIndex(cursor>>8); cursor += incr; } - buffers.dequeue((cursor>>8)<<1); + buffers.dequeue((cursor>>8)<lock(); - buffers.enqueue(samples*2,buf); - buffers.decay(60); - this->scale = scale; - dsout->unlock(); - - //throttle -// //wait for the buffer to be satisfactorily low before continuing - if(!turbo) { - for(;;) { - dsout->lock(); - int remain = buffers.length>>1; - dsout->unlock(); - if(remain<44100/60) break; - //if(remain<44100*scale/256/60) break; ?? - Sleep(1); - } - } } }; -Player *player; + +class ShortPlayer : public Player {}; +class BytePlayer : public Player {}; +static ShortPlayer *shortPlayer; +static BytePlayer *bytePlayer; +static PlayerBase *player; + +void win_Throttle() { + player->throttle(); +} + +void StopSound() { + //dont think this needs to do anything anymore +} -void sound_init_new() { +void win_SoundInit(int bits) { dsout = new OAKRA_Module_OutputDS(); - dsout->start(0); + dsout->start(hAppWnd); dsout->beginThread(); OAKRA_Format fmt; - fmt.format = OAKRA_S16; + fmt.format = bits==8?OAKRA_U8:OAKRA_S16; fmt.channels = 1; fmt.rate = 44100; - fmt.size = 2; + fmt.size = OAKRA_Module::calcSize(fmt); OAKRA_Voice *voice = dsout->getVoice(fmt); - player = new Player(); + + if(bits == 8) + player = bytePlayer = new BytePlayer(); + else player = shortPlayer = new ShortPlayer(); + dsout->lock(); voice->setSource(player); dsout->unlock(); } -void FCEUD_WriteSoundData_new(int32 *Buffer, int scale, int Count, bool turbo) { - #define WSD_BUFSIZE (2 * 96000 / 50) - static int16 MBuffer[WSD_BUFSIZE*2]; - - for(int i=0;ireceive(Count,MBuffer,turbo,scale); +void TrashSound() { + delete dsout; + if(player) delete player; + player = 0; } -int FCEUD_WriteSoundData(int32 *Buffer, int scale, int Count) -{ -#define WSD_BUFSIZE (2 * 96000 / 50) +//HACK - aviout is expecting this +WAVEFORMATEX wf; +int bittage; //1 -> 8bit +static int bits; - int P; - int iCount=0; - static int16 MBuffer[WSD_BUFSIZE*2]; - //if(!(soundoptions&SO_OLDUP)) - //{ - // if(FCEUI_EmulationPaused()) - // memset(MBuffer, 0, WSD_BUFSIZE); // slow and/or unnecessary - - // if(FCEUI_EmulationPaused()) scale >>= 1; - - // // limit frequency change to between 50% and 200% - // if(scale > 512) scale = 512; - // if(scale < 128) scale = 128; - //} - -// for(;Count>0;Count-=WSD_BUFSIZE) - { - //int amt = (soundoptions&SO_OLDUP) ? Count : (Count > WSD_BUFSIZE ? WSD_BUFSIZE : Count); - int amt = Count; - - int cando = RawCanWrite(); - printf("Count/cando %d/%d\n",amt,cando); - - if(!bittage) +int InitSound() { + if(soundoptions&SO_FORCE8BIT) + bits = 8; + else { + //no modern system should have this problem, and we dont use primary buffer + /*if( (!(dscaps.dwFlags&DSCAPS_PRIMARY16BIT) && !(soundoptions&SO_SECONDARY)) || + (!(dscaps.dwFlags&DSCAPS_SECONDARY16BIT) && (soundoptions&SO_SECONDARY))) { - if(silencer) - for(P=0;P>8))^128; - else if(scale == 256) // exactly 100% speed - for(P=0;P>8))^128; - else // change sound frequency - for(P=0;P>8))^128; - - RawWrite(MBuffer,cando); - } - else // force 8-bit sound is off: - { - if(silencer) - for(P=0;Pscale = scale; +} - //if(!(soundoptions&SO_OLDUP)) - //{ - //shouldnt the sound be stopped? - //if(FCEUI_EmulationPaused()) - // memset(MBuffer, 0, WSD_BUFSIZE); // slow and/or unnecessary +void win_SoundWriteData(int32 *buffer, int count) { + + //todo.. + // FCEUI_AviSoundUpdate((void*)MBuffer, Count); - //why? - //if(FCEUI_EmulationPaused()) scale >>= 1; - // limit frequency change to between 50% and 200% - //if(scale > 512) scale = 512; - //if(scale < 128) scale = 128; - //} - - int silence = FCEUI_EmulationPaused() | silencer; - - for(;Count>0;Count-=WSD_BUFSIZE) - { - //int amt = (soundoptions&SO_OLDUP) ? Count : (Count > WSD_BUFSIZE ? WSD_BUFSIZE : Count); - int amt = (Count > WSD_BUFSIZE ? WSD_BUFSIZE : Count); - - if(!bittage) - { - if(silence) - for(P=0;P>8))^128; - else if(scale == 256) // exactly 100% speed - for(P=0;P>8))^128; - else // change sound frequency - for(P=0;P>8))^128; - - RawWrite(MBuffer,amt); + switch(bits) { + case 16: { + void *tempbuf = alloca(2*count); + short *sbuf = (short *)tempbuf; + for(int i=0;ireceive(count*2,tempbuf); + break; } - else // force 8-bit sound is off: - { - if(silence) - for(P=0;P>1; - for(P=0;P>8)<<1]; - mix += ((src[((loc>>8)+1)<<1]-mix)*(loc&255))>>8; - dest[P<<1] = mix; - } - } - - RawWrite(MBuffer,amt * 2); + case 8: { + void *tempbuf = alloca(count); + unsigned char *bbuf = (unsigned char *)tempbuf; + for(int i=0;i>8)^128; + player->receive(count,tempbuf); } - - iCount+=amt; } - - // FCEUI_AviSoundUpdate((void*)MBuffer, Count); - return iCount; } -*/ -int InitSound() -{ - DSCAPS dscaps; - DSBCAPS dsbcaps; - sound_init_new(); - memset(&wf,0x00,sizeof(wf)); - wf.wFormatTag = WAVE_FORMAT_PCM; - wf.nChannels = 1; - wf.nSamplesPerSec = soundrate; - - ddrval=DirectSoundCreate(0,&ppDS,0); - if (ddrval != DS_OK) - { - FCEUD_PrintError("DirectSound: Error creating DirectSound object."); - return 0; - } - - if(soundoptions&SO_SECONDARY) - { - trysecondary: - ddrval=IDirectSound_SetCooperativeLevel(ppDS,hAppWnd,DSSCL_PRIORITY); - if (ddrval != DS_OK) - { - FCEUD_PrintError("DirectSound: Error setting cooperative level to DDSCL_PRIORITY."); - TrashSound(); - return 0; - } - } - else - { - ddrval=IDirectSound_SetCooperativeLevel(ppDS,hAppWnd,DSSCL_WRITEPRIMARY); - if (ddrval != DS_OK) - { - FCEUD_PrintError("DirectSound: Error setting cooperative level to DDSCL_WRITEPRIMARY. Forcing use of secondary sound buffer and trying again..."); - soundoptions|=SO_SECONDARY; - goto trysecondary; - } - } - memset(&dscaps,0x00,sizeof(dscaps)); - dscaps.dwSize=sizeof(dscaps); - ddrval=IDirectSound_GetCaps(ppDS,&dscaps); - if(ddrval!=DS_OK) - { - FCEUD_PrintError("DirectSound: Error getting capabilities."); - return 0; - } - - if(dscaps.dwFlags&DSCAPS_EMULDRIVER) - FCEUD_PrintError("DirectSound: Sound device is being emulated through waveform-audio functions. Sound quality will most likely be awful. Try to update your sound device's sound drivers."); - - IDirectSound_Compact(ppDS); - - memset(&DSBufferDesc,0x00,sizeof(DSBUFFERDESC)); - DSBufferDesc.dwSize=sizeof(DSBufferDesc); - if(soundoptions&SO_SECONDARY) - DSBufferDesc.dwFlags=DSBCAPS_PRIMARYBUFFER; - else - DSBufferDesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_GETCURRENTPOSITION2; - - ddrval=IDirectSound_CreateSoundBuffer(ppDS,&DSBufferDesc,&ppbuf,0); - if (ddrval != DS_OK) - { - FCEUD_PrintError("DirectSound: Error creating primary buffer."); - TrashSound(); - return 0; - } - - memset(&wfa,0x00,sizeof(wfa)); - - if(soundoptions&SO_FORCE8BIT) - bittage=0; - else - { - bittage=1; - if( (!(dscaps.dwFlags&DSCAPS_PRIMARY16BIT) && !(soundoptions&SO_SECONDARY)) || - (!(dscaps.dwFlags&DSCAPS_SECONDARY16BIT) && (soundoptions&SO_SECONDARY))) - { - FCEUD_PrintError("DirectSound: 16-bit sound is not supported. Forcing 8-bit sound."); - bittage=0; - soundoptions|=SO_FORCE8BIT; - } - } - - wf.wBitsPerSample=8<=65536) { - Sleep(1); - return 1; - } else { - //otherwise, we can't throttle for less than 1ms. assume we're close enough and return - ltime += desiredRunningTime; - return 0; - } - - //sleepy*=1000; - //if(tfreq>=65536) - // sleepy/=tfreq>>16; - //else - // sleepy=0; - //if(sleepy>100) - //{ - // // block for a max of 100ms to - // // keep the gui responsive - // Sleep(100); - // return 1; - //} - //Sleep(sleepy); - //goto waiter; - } else { - //we're behind... - if(delta > 2*desiredRunningTime) { - //if we're behind by 2 frames, then reset the throttling - ResetSpeedThrottle(); - } else { - //we're only behind by part of a frame - //just don't throttle! - ltime += desiredRunningTime; - } - return 0; - } - //} - //if( (ttime-ltime) >= (tfreq*4/desiredfps)) - // ltime=ttime; - //else - //{ - // ltime+=tfreq/desiredfps; - - // if( (ttime-ltime) >= (tfreq/desiredfps) ) // Oops, we're behind! - // return(1); - //} - //return(0); -} - +//mbg todo - these were used by the FPS calculator in video/cpp // Quick code for internal FPS display. -uint64 FCEUD_GetTime(void) -{ - return(GetCurTime()); -} -uint64 FCEUD_GetTimeFreq(void) -{ - return(tfreq>>16); -} +//uint64 FCEUD_GetTime(void) +//{ +// return(GetCurTime()); //this was using queryperformancecounter yuck +//} +//uint64 FCEUD_GetTimeFreq(void) +//{ +// return(tfreq>>16); +//} static void IncreaseEmulationSpeed(void) { diff --git a/src/video.cpp b/src/video.cpp index ac38117c..42dbe761 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -473,6 +473,7 @@ int SaveSnapshot(void) fclose(pp); return(0); } +//TODO mbg - this needs to be implemented in a better way #ifdef SHOWFPS uint64 FCEUD_GetTime(void); uint64 FCEUD_GetTimeFreq(void);