Changed gl_shm name to nes_shm. Added audio circular buffer to shared memory.

This commit is contained in:
mjbudd77 2020-07-03 15:58:53 -04:00
parent 7eca2978ed
commit 72141845f0
10 changed files with 82 additions and 47 deletions

View File

@ -308,7 +308,7 @@ SOURCES += src/drivers/Qt/GameSoundConf.cpp
SOURCES += src/drivers/Qt/fceuWrapper.cpp SOURCES += src/drivers/Qt/fceuWrapper.cpp
SOURCES += src/drivers/Qt/config.cpp SOURCES += src/drivers/Qt/config.cpp
SOURCES += src/drivers/Qt/input.cpp SOURCES += src/drivers/Qt/input.cpp
SOURCES += src/drivers/Qt/gl_win.cpp SOURCES += src/drivers/Qt/nes_shm.cpp
SOURCES += src/drivers/Qt/keyscan.cpp SOURCES += src/drivers/Qt/keyscan.cpp
SOURCES += src/drivers/Qt/sdl-sound.cpp SOURCES += src/drivers/Qt/sdl-sound.cpp
SOURCES += src/drivers/Qt/sdl-video.cpp SOURCES += src/drivers/Qt/sdl-video.cpp

View File

@ -24,7 +24,7 @@ gameWin_t::gameWin_t(QWidget *parent)
connect( gameTimer, &QTimer::timeout, this, &gameWin_t::runGameFrame ); connect( gameTimer, &QTimer::timeout, this, &gameWin_t::runGameFrame );
gameTimer->setTimerType( Qt::PreciseTimer ); gameTimer->setTimerType( Qt::PreciseTimer );
gameTimer->start( 10 ); gameTimer->start( 16 );
gamePadConfWin = NULL; gamePadConfWin = NULL;
} }

View File

@ -8,7 +8,7 @@
#include <QApplication> #include <QApplication>
#include <QScreen> #include <QScreen>
#include "Qt/gl_win.h" #include "Qt/nes_shm.h"
#include "Qt/GameViewerGL.h" #include "Qt/GameViewerGL.h"
extern unsigned int gui_draw_area_width; extern unsigned int gui_draw_area_width;
@ -111,8 +111,8 @@ void gameViewGL_t::resizeGL(int w, int h)
void gameViewGL_t::paintGL(void) void gameViewGL_t::paintGL(void)
{ {
int texture_width = gl_shm->ncol; int texture_width = nes_shm->ncol;
int texture_height = gl_shm->nrow; int texture_height = nes_shm->nrow;
int l=0, r=texture_width; int l=0, r=texture_width;
int t=0, b=texture_height; int t=0, b=texture_height;
@ -149,7 +149,7 @@ void gameViewGL_t::paintGL(void)
glTexSubImage2D(GL_TEXTURE_RECTANGLE, 0, glTexSubImage2D(GL_TEXTURE_RECTANGLE, 0,
0, 0, GL_NES_WIDTH, GL_NES_HEIGHT, 0, 0, GL_NES_WIDTH, GL_NES_HEIGHT,
GL_BGRA, GL_UNSIGNED_BYTE, gl_shm->pixbuf ); GL_BGRA, GL_UNSIGNED_BYTE, nes_shm->pixbuf );
glBegin(GL_QUADS); glBegin(GL_QUADS);
glTexCoord2f( l, b); // Bottom left of picture. glTexCoord2f( l, b); // Bottom left of picture.
@ -169,4 +169,4 @@ void gameViewGL_t::paintGL(void)
glDisable(GL_TEXTURE_RECTANGLE); glDisable(GL_TEXTURE_RECTANGLE);
//printf("Paint GL!\n"); //printf("Paint GL!\n");
} }

View File

@ -6,7 +6,7 @@
#include <math.h> #include <math.h>
#include <unistd.h> #include <unistd.h>
#include "Qt/gl_win.h" #include "Qt/nes_shm.h"
#include "Qt/GameViewerSDL.h" #include "Qt/GameViewerSDL.h"
extern unsigned int gui_draw_area_width; extern unsigned int gui_draw_area_width;
@ -147,10 +147,10 @@ void gameViewSDL_t::paintEvent( QPaintEvent *event )
int nesWidth = GL_NES_WIDTH; int nesWidth = GL_NES_WIDTH;
int nesHeight = GL_NES_HEIGHT; int nesHeight = GL_NES_HEIGHT;
if ( gl_shm != NULL ) if ( nes_shm != NULL )
{ {
nesWidth = gl_shm->ncol; nesWidth = nes_shm->ncol;
nesHeight = gl_shm->nrow; nesHeight = nes_shm->nrow;
} }
//printf(" %i x %i \n", nesWidth, nesHeight ); //printf(" %i x %i \n", nesWidth, nesHeight );
float xscale = (float)view_width / (float)nesWidth; float xscale = (float)view_width / (float)nesWidth;
@ -183,7 +183,7 @@ void gameViewSDL_t::paintEvent( QPaintEvent *event )
int rowPitch; int rowPitch;
SDL_LockTexture( sdlTexture, nullptr, (void**)&textureBuffer, &rowPitch); SDL_LockTexture( sdlTexture, nullptr, (void**)&textureBuffer, &rowPitch);
{ {
memcpy( textureBuffer, gl_shm->pixbuf, GL_NES_HEIGHT*GL_NES_WIDTH*sizeof(uint32_t) ); memcpy( textureBuffer, nes_shm->pixbuf, GL_NES_HEIGHT*GL_NES_WIDTH*sizeof(uint32_t) );
} }
SDL_UnlockTexture(sdlTexture); SDL_UnlockTexture(sdlTexture);

View File

@ -12,7 +12,7 @@
#include "Qt/input.h" #include "Qt/input.h"
#include "Qt/sdl.h" #include "Qt/sdl.h"
#include "Qt/sdl-video.h" #include "Qt/sdl-video.h"
#include "Qt/gl_win.h" #include "Qt/nes_shm.h"
#include "Qt/unix-netplay.h" #include "Qt/unix-netplay.h"
#include "common/cheat.h" #include "common/cheat.h"
@ -471,11 +471,11 @@ int fceuWrapperInit( int argc, char *argv[] )
return 0; return 0;
} }
gl_shm = open_video_shm(); nes_shm = open_nes_shm();
if ( gl_shm == NULL ) if ( nes_shm == NULL )
{ {
printf("Error: Failed to open video Shared memory\n"); printf("Error: Failed to open NES Shared memory\n");
return -1; return -1;
} }

View File

@ -9,18 +9,18 @@
#include <fcntl.h> #include <fcntl.h>
#include <errno.h> #include <errno.h>
#include "Qt/gl_win.h" #include "Qt/nes_shm.h"
gl_win_shm_t *gl_shm = NULL; nes_shm_t *nes_shm = NULL;
//************************************************************************ //************************************************************************
gl_win_shm_t *open_video_shm(void) nes_shm_t *open_nes_shm(void)
{ {
int shmId; int shmId;
gl_win_shm_t *vaddr; nes_shm_t *vaddr;
struct shmid_ds ds; struct shmid_ds ds;
shmId = shmget( IPC_PRIVATE, sizeof(struct gl_win_shm_t), IPC_CREAT | S_IRWXU | S_IRWXG ); shmId = shmget( IPC_PRIVATE, sizeof(struct nes_shm_t), IPC_CREAT | S_IRWXU | S_IRWXG );
if ( shmId == -1 ) if ( shmId == -1 )
{ {
@ -29,14 +29,14 @@ gl_win_shm_t *open_video_shm(void)
} }
printf("Created ShmID: %i \n", shmId ); printf("Created ShmID: %i \n", shmId );
vaddr = (gl_win_shm_t*)shmat( shmId, NULL, 0); vaddr = (nes_shm_t*)shmat( shmId, NULL, 0);
if ( vaddr == (gl_win_shm_t*)-1 ) if ( vaddr == (nes_shm_t*)-1 )
{ {
perror("Error: GLX shmat Failed:"); perror("Error: NES shmat Failed:");
return NULL; return NULL;
} }
memset( vaddr, 0, sizeof(struct gl_win_shm_t)); memset( vaddr, 0, sizeof(struct nes_shm_t));
if ( shmctl( shmId, IPC_RMID, &ds ) != 0 ) if ( shmctl( shmId, IPC_RMID, &ds ) != 0 )
{ {

View File

@ -1,8 +1,8 @@
// gl_win.cpp // nes_shm.h
// //
#ifndef __GL_WIN_H__ #ifndef __NES_SHM_H__
#define __GL_WIN_H__ #define __NES_SHM_H__
#include <stdint.h> #include <stdint.h>
@ -11,8 +11,9 @@
#define GL_NES_WIDTH 256 #define GL_NES_WIDTH 256
#define GL_NES_HEIGHT 256 #define GL_NES_HEIGHT 256
#define NES_AUDIO_BUFLEN 480000
struct gl_win_shm_t struct nes_shm_t
{ {
int pid; int pid;
int run; int run;
@ -59,10 +60,24 @@ struct gl_win_shm_t
{ {
memset( pixbuf, 0, sizeof(pixbuf) ); memset( pixbuf, 0, sizeof(pixbuf) );
} }
struct sndBuf_t
{
int head;
int tail;
int16_t data[NES_AUDIO_BUFLEN];
unsigned int starveCounter;
} sndBuf;
void push_sound_sample( int16_t sample )
{
sndBuf.data[ sndBuf.head ] = sample;
sndBuf.head = (sndBuf.head + 1) % NES_AUDIO_BUFLEN;
}
}; };
extern gl_win_shm_t *gl_shm; extern nes_shm_t *nes_shm;
gl_win_shm_t *open_video_shm(void); nes_shm_t *open_nes_shm(void);
#endif #endif

View File

@ -25,6 +25,7 @@
#include "common/configSys.h" #include "common/configSys.h"
#include "utils/memory.h" #include "utils/memory.h"
#include "nes_shm.h"
#include <cstdio> #include <cstdio>
#include <cstring> #include <cstring>
@ -49,18 +50,27 @@ fillaudio(void *udata,
uint8 *stream, uint8 *stream,
int len) int len)
{ {
static int16_t sample = 0;
int16 *tmps = (int16*)stream; int16 *tmps = (int16*)stream;
len >>= 1; len >>= 1;
while(len) { while (len)
int16 sample = 0; {
if(s_BufferIn) { //int16 sample = 0;
if (s_BufferIn)
{
sample = s_Buffer[s_BufferRead]; sample = s_Buffer[s_BufferRead];
s_BufferRead = (s_BufferRead + 1) % s_BufferSize; s_BufferRead = (s_BufferRead + 1) % s_BufferSize;
s_BufferIn--; s_BufferIn--;
} else { } else {
sample = 0; // Retain last known sample value, helps avoid clicking
// noise when sound system is starved of audio data.
//sample = 0;
nes_shm->sndBuf.starveCounter++;
//printf("Starve:%u\n", nes_shm->sndBuf.starveCounter );
} }
nes_shm->push_sound_sample( sample );
*tmps = sample; *tmps = sample;
tmps++; tmps++;
len--; len--;
@ -179,6 +189,7 @@ WriteSound(int32 *buf,
{ {
extern int EmulationPaused; extern int EmulationPaused;
if (EmulationPaused == 0) if (EmulationPaused == 0)
{
while(Count) while(Count)
{ {
while(s_BufferIn == s_BufferSize) while(s_BufferIn == s_BufferSize)
@ -196,6 +207,7 @@ WriteSound(int32 *buf,
buf++; buf++;
} }
}
} }
/** /**

View File

@ -9,7 +9,7 @@ static const double Fastest = 32; // 32x speed (around 1920 fps on NTSC)
static const double Normal = 1.0; // 1x speed (around 60 fps on NTSC) static const double Normal = 1.0; // 1x speed (around 60 fps on NTSC)
static uint64 Lasttime, Nexttime; static uint64 Lasttime, Nexttime;
static long double desired_frametime; static double desired_frametime = (1.0 / 60.099823);
static int InFrame; static int InFrame;
double g_fpsScale = Normal; // used by sdl.cpp double g_fpsScale = Normal; // used by sdl.cpp
bool MaxSpeed = false; bool MaxSpeed = false;
@ -30,8 +30,14 @@ bool MaxSpeed = false;
void void
RefreshThrottleFPS() RefreshThrottleFPS()
{ {
uint64 fps = FCEUI_GetDesiredFPS(); // Do >> 24 to get in Hz double hz;
desired_frametime = 16777216.0l / (fps * g_fpsScale); int32_t fps = FCEUI_GetDesiredFPS(); // Do >> 24 to get in Hz
hz = ( ((double)fps) / 16777216.0 );
desired_frametime = 1.0 / ( hz * g_fpsScale );
printf("FrameTime: %llu %llu %f %lf \n", fps, fps >> 24, hz, desired_frametime );
Lasttime=0; Lasttime=0;
Nexttime=0; Nexttime=0;
@ -44,6 +50,8 @@ RefreshThrottleFPS()
int int
SpeedThrottle() SpeedThrottle()
{ {
return 0;
if(g_fpsScale >= 32) if(g_fpsScale >= 32)
{ {
return 0; /* Done waiting */ return 0; /* Done waiting */
@ -66,7 +74,7 @@ SpeedThrottle()
else else
time_left = Nexttime - cur_time; time_left = Nexttime - cur_time;
if(time_left > 50) if (time_left > 50)
{ {
time_left = 50; time_left = 50;
/* In order to keep input responsive, don't wait too long at once */ /* In order to keep input responsive, don't wait too long at once */

View File

@ -22,7 +22,7 @@
/// \brief Handles the graphical game display for the SDL implementation. /// \brief Handles the graphical game display for the SDL implementation.
#include "Qt/sdl.h" #include "Qt/sdl.h"
#include "Qt/gl_win.h" #include "Qt/nes_shm.h"
#include "common/vidblit.h" #include "common/vidblit.h"
#include "../../fceu.h" #include "../../fceu.h"
#include "../../version.h" #include "../../version.h"
@ -91,9 +91,9 @@ KillVideo()
{ {
//printf("Killing Video\n"); //printf("Killing Video\n");
if ( gl_shm != NULL ) if ( nes_shm != NULL )
{ {
gl_shm->clear_pixbuf(); nes_shm->clear_pixbuf();
} }
//destroy_gui_video(); //destroy_gui_video();
@ -337,7 +337,7 @@ static void WriteTestPattern(void)
{ {
for (j=0; j<GL_NES_HEIGHT; j++) for (j=0; j<GL_NES_HEIGHT; j++)
{ {
gl_shm->pixbuf[k] = 0xffffffff; k++; nes_shm->pixbuf[k] = 0xffffffff; k++;
} }
} }
} }
@ -360,14 +360,14 @@ BlitScreen(uint8 *XBuf)
// XXX soules - not entirely sure why this is being done yet // XXX soules - not entirely sure why this is being done yet
XBuf += s_srendline * 256; XBuf += s_srendline * 256;
dest = (uint8*)gl_shm->pixbuf; dest = (uint8*)nes_shm->pixbuf;
w = GL_NES_WIDTH; w = GL_NES_WIDTH;
h = GL_NES_HEIGHT; h = GL_NES_HEIGHT;
pitch = w*4; pitch = w*4;
gl_shm->ncol = NWIDTH; nes_shm->ncol = NWIDTH;
gl_shm->nrow = s_tlines; nes_shm->nrow = s_tlines;
gl_shm->pitch = pitch; nes_shm->pitch = pitch;
if ( dest == NULL ) return; if ( dest == NULL ) return;